expression tests
[pspp] / src / language / expressions / parse.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 1997-9, 2000, 2006, 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "private.h"
20
21 #include <ctype.h>
22 #include <float.h>
23 #include <limits.h>
24 #include <stdlib.h>
25
26 #include "data/case.h"
27 #include "data/dictionary.h"
28 #include "data/settings.h"
29 #include "data/variable.h"
30 #include "language/expressions/helpers.h"
31 #include "language/lexer/format-parser.h"
32 #include "language/lexer/lexer.h"
33 #include "language/lexer/variable-parser.h"
34 #include "libpspp/array.h"
35 #include "libpspp/assertion.h"
36 #include "libpspp/i18n.h"
37 #include "libpspp/message.h"
38 #include "libpspp/misc.h"
39 #include "libpspp/pool.h"
40 #include "libpspp/str.h"
41
42 #include "gl/c-strcase.h"
43 #include "gl/minmax.h"
44 #include "gl/xalloc.h"
45 \f
46 /* Declarations. */
47
48 /* Recursive descent parser in order of increasing precedence. */
49 typedef struct expr_node *parse_recursively_func (struct lexer *, struct expression *);
50 static parse_recursively_func parse_or, parse_and, parse_not;
51 static parse_recursively_func parse_rel, parse_add, parse_mul;
52 static parse_recursively_func parse_neg, parse_exp;
53 static parse_recursively_func parse_primary;
54 static parse_recursively_func parse_vector_element, parse_function;
55
56 /* Utility functions. */
57 static struct expression *expr_create (struct dataset *ds);
58 atom_type expr_node_returns (const struct expr_node *);
59
60 static const char *atom_type_name (atom_type);
61 static struct expression *finish_expression (struct expr_node *,
62                                              struct expression *);
63 static bool type_check (const struct expression *, const struct expr_node *,
64                         enum val_type expected_type);
65 static struct expr_node *allocate_unary_variable (struct expression *,
66                                                 const struct variable *);
67 \f
68 /* Public functions. */
69
70 /* Parses an expression of the given TYPE.  If DS is nonnull then variables and
71    vectors within it may be referenced within the expression; otherwise, the
72    expression must not reference any variables or vectors.  Returns the new
73    expression if successful or a null pointer otherwise. */
74 struct expression *
75 expr_parse (struct lexer *lexer, struct dataset *ds, enum val_type type)
76 {
77   assert (val_type_is_valid (type));
78
79   struct expression *e = expr_create (ds);
80   struct expr_node *n = parse_or (lexer, e);
81   if (!n || !type_check (e, n, type))
82     {
83       expr_free (e);
84       return NULL;
85     }
86
87   return finish_expression (expr_optimize (n, e), e);
88 }
89
90 /* Parses a boolean expression, otherwise similar to expr_parse(). */
91 struct expression *
92 expr_parse_bool (struct lexer *lexer, struct dataset *ds)
93 {
94   struct expression *e = expr_create (ds);
95   struct expr_node *n = parse_or (lexer, e);
96   if (!n)
97     {
98       expr_free (e);
99       return NULL;
100     }
101
102   atom_type actual_type = expr_node_returns (n);
103   if (actual_type == OP_number)
104     n = expr_allocate_binary (e, OP_EXPR_TO_BOOLEAN, n,
105                               expr_allocate_expr_node (e, n));
106   else if (actual_type != OP_boolean)
107     {
108       msg_at (SE, expr_location (e, n),
109               _("Type mismatch: expression has %s type, "
110                  "but a boolean value is required here."),
111            atom_type_name (actual_type));
112       expr_free (e);
113       return NULL;
114     }
115
116   return finish_expression (expr_optimize (n, e), e);
117 }
118
119 /* Parses a numeric expression that is intended to be assigned to newly created
120    variable NEW_VAR_NAME.  (This allows for a better error message if the
121    expression is not numeric.)  Otherwise similar to expr_parse(). */
122 struct expression *
123 expr_parse_new_variable (struct lexer *lexer, struct dataset *ds,
124                          const char *new_var_name)
125 {
126   struct expression *e = expr_create (ds);
127   struct expr_node *n = parse_or (lexer, e);
128   if (!n)
129     {
130       expr_free (e);
131       return NULL;
132     }
133
134   atom_type actual_type = expr_node_returns (n);
135   if (actual_type != OP_number && actual_type != OP_boolean)
136     {
137       msg (SE, _("This command tries to create a new variable %s by assigning a "
138                  "string value to it, but this is not supported.  Use "
139                  "the STRING command to create the new variable with the "
140                  "correct width before assigning to it, e.g. STRING %s(A20)."),
141            new_var_name, new_var_name);
142       expr_free (e);
143       return NULL;
144     }
145
146   return finish_expression (expr_optimize (n, e), e);
147 }
148
149 /* Free expression E. */
150 void
151 expr_free (struct expression *e)
152 {
153   if (e != NULL)
154     pool_destroy (e->expr_pool);
155 }
156
157 struct expression *
158 expr_parse_any (struct lexer *lexer, struct dataset *ds, bool optimize)
159 {
160   struct expr_node *n;
161   struct expression *e;
162
163   e = expr_create (ds);
164   n = parse_or (lexer, e);
165   if (n == NULL)
166     {
167       expr_free (e);
168       return NULL;
169     }
170
171   if (optimize)
172     n = expr_optimize (n, e);
173   return finish_expression (n, e);
174 }
175 \f
176 /* Finishing up expression building. */
177
178 /* Height of an expression's stacks. */
179 struct stack_heights
180   {
181     int number_height;  /* Height of number stack. */
182     int string_height;  /* Height of string stack. */
183   };
184
185 /* Stack heights used by different kinds of arguments. */
186 static const struct stack_heights on_number_stack = {1, 0};
187 static const struct stack_heights on_string_stack = {0, 1};
188 static const struct stack_heights not_on_stack = {0, 0};
189
190 /* Returns the stack heights used by an atom of the given
191    TYPE. */
192 static const struct stack_heights *
193 atom_type_stack (atom_type type)
194 {
195   assert (is_atom (type));
196
197   switch (type)
198     {
199     case OP_number:
200     case OP_boolean:
201       return &on_number_stack;
202
203     case OP_string:
204       return &on_string_stack;
205
206     case OP_format:
207     case OP_ni_format:
208     case OP_no_format:
209     case OP_num_var:
210     case OP_str_var:
211     case OP_integer:
212     case OP_pos_int:
213     case OP_vector:
214     case OP_expr_node:
215       return &not_on_stack;
216
217     default:
218       NOT_REACHED ();
219     }
220 }
221
222 /* Measures the stack height needed for node N, supposing that
223    the stack height is initially *HEIGHT and updating *HEIGHT to
224    the final stack height.  Updates *MAX, if necessary, to
225    reflect the maximum intermediate or final height. */
226 static void
227 measure_stack (const struct expr_node *n,
228                struct stack_heights *height, struct stack_heights *max)
229 {
230   const struct stack_heights *return_height;
231
232   if (is_composite (n->type))
233     {
234       struct stack_heights args;
235       int i;
236
237       args = *height;
238       for (i = 0; i < n->n_args; i++)
239         measure_stack (n->args[i], &args, max);
240
241       return_height = atom_type_stack (operations[n->type].returns);
242     }
243   else
244     return_height = atom_type_stack (n->type);
245
246   height->number_height += return_height->number_height;
247   height->string_height += return_height->string_height;
248
249   if (height->number_height > max->number_height)
250     max->number_height = height->number_height;
251   if (height->string_height > max->string_height)
252     max->string_height = height->string_height;
253 }
254
255 /* Allocates stacks within E sufficient for evaluating node N. */
256 static void
257 allocate_stacks (struct expr_node *n, struct expression *e)
258 {
259   struct stack_heights initial = {0, 0};
260   struct stack_heights max = {0, 0};
261
262   measure_stack (n, &initial, &max);
263   e->number_stack = pool_alloc (e->expr_pool,
264                                 sizeof *e->number_stack * max.number_height);
265   e->string_stack = pool_alloc (e->expr_pool,
266                                 sizeof *e->string_stack * max.string_height);
267 }
268
269 /* Finalizes expression E for evaluating node N. */
270 static struct expression *
271 finish_expression (struct expr_node *n, struct expression *e)
272 {
273   /* Allocate stacks. */
274   allocate_stacks (n, e);
275
276   /* Output postfix representation. */
277   expr_flatten (n, e);
278
279   /* The eval_pool might have been used for allocating strings
280      during optimization.  We need to keep those strings around
281      for all subsequent evaluations, so start a new eval_pool. */
282   e->eval_pool = pool_create_subpool (e->expr_pool);
283
284   return e;
285 }
286
287 /* Verifies that expression E, whose root node is *N, can be
288    converted to type EXPECTED_TYPE, inserting a conversion at *N
289    if necessary.  Returns true if successful, false on failure. */
290 static bool
291 type_check (const struct expression *e, const struct expr_node *n,
292             enum val_type expected_type)
293 {
294   atom_type actual_type = expr_node_returns (n);
295
296   switch (expected_type)
297     {
298     case VAL_NUMERIC:
299       if (actual_type != OP_number && actual_type != OP_boolean)
300         {
301           msg_at (SE, expr_location (e, n),
302                   _("Type mismatch: expression has type '%s', "
303                      "but a numeric value is required."),
304                atom_type_name (actual_type));
305           return false;
306         }
307       break;
308
309     case VAL_STRING:
310       if (actual_type != OP_string)
311         {
312           msg_at (SE, expr_location (e, n),
313                   _("Type mismatch: expression has type '%s', "
314                      "but a string value is required."),
315                atom_type_name (actual_type));
316           return false;
317         }
318       break;
319
320     default:
321       NOT_REACHED ();
322     }
323
324   return true;
325 }
326 \f
327 /* Recursive-descent expression parser. */
328
329 static void
330 free_msg_location (void *loc_)
331 {
332   struct msg_location *loc = loc_;
333   msg_location_destroy (loc);
334 }
335
336 static void
337 expr_location__ (struct expression *e,
338                  const struct expr_node *node,
339                  const struct msg_location **minp,
340                  const struct msg_location **maxp)
341 {
342   struct msg_location *loc = node->location;
343   if (loc)
344     {
345       const struct msg_location *min = *minp;
346       if (loc->start.line
347           && (!min
348               || loc->start.line < min->start.line
349               || (loc->start.line == min->start.line
350                   && loc->start.column < min->start.column)))
351         *minp = loc;
352
353       const struct msg_location *max = *maxp;
354       if (loc->end.line
355           && (!max
356               || loc->end.line > max->end.line
357               || (loc->end.line == max->end.line
358                   && loc->end.column > max->end.column)))
359         *maxp = loc;
360
361       return;
362     }
363
364   if (is_composite (node->type))
365     for (size_t i = 0; i < node->n_args; i++)
366       expr_location__ (e, node->args[i], minp, maxp);
367 }
368
369 /* Returns the source code location corresponding to expression NODE, computing
370    it lazily if needed. */
371 const struct msg_location *
372 expr_location (const struct expression *e_, const struct expr_node *node_)
373 {
374   struct expr_node *node = CONST_CAST (struct expr_node *, node_);
375   if (!node)
376     return NULL;
377
378   if (!node->location)
379     {
380       struct expression *e = CONST_CAST (struct expression *, e_);
381       const struct msg_location *min = NULL;
382       const struct msg_location *max = NULL;
383       expr_location__ (e, node, &min, &max);
384       if (min && max)
385         {
386           node->location = msg_location_dup (min);
387           node->location->end = max->end;
388           pool_register (e->expr_pool, free_msg_location, node->location);
389         }
390     }
391   return node->location;
392 }
393
394 /* Sets e->location to the tokens in S's lexer from offset START_OFS to the
395    token before the current one.  Has no effect if E already has a location or
396    if E is null. */
397 static void
398 expr_add_location (struct lexer *lexer, struct expression *e,
399                    int start_ofs, struct expr_node *node)
400 {
401   if (node && !node->location)
402     {
403       node->location = lex_ofs_location (lexer, start_ofs, lex_ofs (lexer) - 1);
404       pool_register (e->expr_pool, free_msg_location, node->location);
405     }
406 }
407
408 static bool
409 type_coercion__ (struct expression *e, struct expr_node *node, size_t arg_idx,
410                  bool do_coercion)
411 {
412   assert (!!do_coercion == (e != NULL));
413
414   if (!node)
415     return false;
416
417   struct expr_node **argp = &node->args[arg_idx];
418   struct expr_node *arg = *argp;
419   if (!arg)
420     return false;
421
422   const struct operation *op = &operations[node->type];
423   atom_type required_type = op->args[MIN (arg_idx, op->n_args - 1)];
424   atom_type actual_type = expr_node_returns (arg);
425   if (actual_type == required_type)
426     {
427       /* Type match. */
428       return true;
429     }
430
431   switch (required_type)
432     {
433     case OP_number:
434       if (actual_type == OP_boolean)
435         {
436           /* To enforce strict typing rules, insert Boolean to
437              numeric "conversion".  This conversion is a no-op,
438              so it will be removed later. */
439           if (do_coercion)
440             *argp = expr_allocate_unary (e, OP_BOOLEAN_TO_NUM, arg);
441           return true;
442         }
443       break;
444
445     case OP_string:
446       /* No coercion to string. */
447       break;
448
449     case OP_boolean:
450       if (actual_type == OP_number)
451         {
452           /* Convert numeric to boolean. */
453           if (do_coercion)
454             *argp = expr_allocate_binary (e, OP_OPERAND_TO_BOOLEAN, arg,
455                                           expr_allocate_expr_node (e, node));
456           return true;
457         }
458       break;
459
460     case OP_integer:
461       if (actual_type == OP_number)
462         {
463           /* Convert number to integer. */
464           if (do_coercion)
465             *argp = expr_allocate_unary (e, OP_NUM_TO_INTEGER, arg);
466           return true;
467         }
468       break;
469
470     case OP_format:
471       NOT_REACHED ();
472
473     case OP_ni_format:
474       msg_disable ();
475       if (arg->type == OP_format
476           && fmt_check_input (&arg->format)
477           && fmt_check_type_compat (&arg->format, VAL_NUMERIC))
478         {
479           msg_enable ();
480           if (do_coercion)
481             arg->type = OP_ni_format;
482           return true;
483         }
484       msg_enable ();
485       break;
486
487     case OP_no_format:
488       msg_disable ();
489       if (arg->type == OP_format
490           && fmt_check_output (&arg->format)
491           && fmt_check_type_compat (&arg->format, VAL_NUMERIC))
492         {
493           msg_enable ();
494           if (do_coercion)
495             arg->type = OP_no_format;
496           return true;
497         }
498       msg_enable ();
499       break;
500
501     case OP_num_var:
502       if (arg->type == OP_NUM_VAR)
503         {
504           if (do_coercion)
505             *argp = arg->args[0];
506           return true;
507         }
508       break;
509
510     case OP_str_var:
511       if (arg->type == OP_STR_VAR)
512         {
513           if (do_coercion)
514             *argp = arg->args[0];
515           return true;
516         }
517       break;
518
519     case OP_var:
520       if (arg->type == OP_NUM_VAR || arg->type == OP_STR_VAR)
521         {
522           if (do_coercion)
523             *argp = arg->args[0];
524           return true;
525         }
526       break;
527
528     case OP_pos_int:
529       if (arg->type == OP_number
530           && floor (arg->number) == arg->number
531           && arg->number > 0 && arg->number < INT_MAX)
532         {
533           if (do_coercion)
534             *argp = expr_allocate_pos_int (e, arg->number);
535           return true;
536         }
537       break;
538
539     default:
540       NOT_REACHED ();
541     }
542   return false;
543 }
544
545 static bool
546 type_coercion (struct expression *e, struct expr_node *node, size_t arg_idx)
547 {
548   return type_coercion__ (e, node, arg_idx, true);
549 }
550
551 static bool
552 is_coercible (const struct expr_node *node_, size_t arg_idx)
553 {
554   struct expr_node *node = CONST_CAST (struct expr_node *, node_);
555   return type_coercion__ (NULL, node, arg_idx, false);
556 }
557
558 /* How to parse an operator.
559
560    Some operators support both numeric and string operators.  For those,
561    'num_op' and 'str_op' are both nonzero.  Otherwise, only one 'num_op' is
562    nonzero.  (PSPP doesn't have any string-only operators.) */
563 struct operator
564   {
565     enum token_type token;      /* Operator token. */
566     operation_type num_op;      /* Operation for numeric operands (or 0). */
567     operation_type str_op;      /* Operation for string operands (or 0). */
568   };
569
570 static operation_type
571 match_operator (struct lexer *lexer, const struct operator ops[], size_t n_ops,
572                 const struct expr_node *lhs)
573 {
574   bool lhs_is_numeric = operations[lhs->type].returns != OP_string;
575   for (const struct operator *op = ops; op < ops + n_ops; op++)
576     if (lex_token (lexer) == op->token)
577       {
578         if (op->token != T_NEG_NUM)
579           lex_get (lexer);
580
581         return op->str_op && !lhs_is_numeric ? op->str_op : op->num_op;
582       }
583   return 0;
584 }
585
586 static const char *
587 operator_name (enum token_type token)
588 {
589   return token == T_NEG_NUM ? "-" : token_type_to_string (token);
590 }
591
592 static struct expr_node *
593 parse_binary_operators__ (struct lexer *lexer, struct expression *e,
594                           const struct operator ops[], size_t n_ops,
595                           parse_recursively_func *parse_next_level,
596                           const char *chain_warning, struct expr_node *lhs)
597 {
598   for (int op_count = 0; ; op_count++)
599     {
600       enum token_type token = lex_token (lexer);
601       operation_type optype = match_operator (lexer, ops, n_ops, lhs);
602       if (!optype)
603         {
604           if (op_count > 1 && chain_warning)
605             msg_at (SW, expr_location (e, lhs), "%s", chain_warning);
606
607           return lhs;
608         }
609
610       struct expr_node *rhs = parse_next_level (lexer, e);
611       if (!rhs)
612         return NULL;
613
614       struct expr_node *node = expr_allocate_binary (e, optype, lhs, rhs);
615       if (!is_coercible (node, 0) || !is_coercible (node, 1))
616         {
617           bool both = false;
618           for (size_t i = 0; i < n_ops; i++)
619             if (ops[i].token == token)
620               both = ops[i].num_op && ops[i].str_op;
621
622           const char *name = operator_name (token);
623           if (both)
624             msg_at (SE, expr_location (e, node),
625                     _("Both operands of %s must have the same type."), name);
626           else if (operations[node->type].args[0] != OP_string)
627             msg_at (SE, expr_location (e, node),
628                     _("Both operands of %s must be numeric."), name);
629           else
630             msg_at (SE, expr_location (e, node),
631                     _("Both operands of %s must be strings."), name);
632
633           msg_at (SN, expr_location (e, node->args[0]),
634                   _("This operand has type '%s'."),
635                   atom_type_name (expr_node_returns (node->args[0])));
636           msg_at (SN, expr_location (e, node->args[1]),
637                   _("This operand has type '%s'."),
638                   atom_type_name (expr_node_returns (node->args[1])));
639
640           return NULL;
641         }
642
643       if (!type_coercion (e, node, 0) || !type_coercion (e, node, 1))
644         NOT_REACHED ();
645
646       lhs = node;
647     }
648 }
649
650 static struct expr_node *
651 parse_binary_operators (struct lexer *lexer, struct expression *e,
652                         const struct operator ops[], size_t n_ops,
653                         parse_recursively_func *parse_next_level,
654                         const char *chain_warning)
655 {
656   struct expr_node *lhs = parse_next_level (lexer, e);
657   if (!lhs)
658     return NULL;
659
660   return parse_binary_operators__ (lexer, e, ops, n_ops, parse_next_level,
661                                    chain_warning, lhs);
662 }
663
664 static struct expr_node *
665 parse_inverting_unary_operator (struct lexer *lexer, struct expression *e,
666                                 const struct operator *op,
667                                 parse_recursively_func *parse_next_level)
668 {
669   int start_ofs = lex_ofs (lexer);
670   unsigned int op_count = 0;
671   while (lex_match (lexer, op->token))
672     op_count++;
673
674   struct expr_node *inner = parse_next_level (lexer, e);
675   if (!inner || !op_count)
676     return inner;
677
678   struct expr_node *outer = expr_allocate_unary (e, op->num_op, inner);
679   expr_add_location (lexer, e, start_ofs, outer);
680
681   if (!type_coercion (e, outer, 0))
682     {
683       assert (operations[outer->type].args[0] != OP_string);
684
685       const char *name = operator_name (op->token);
686       msg_at (SE, expr_location (e, outer),
687               _("The unary %s operator requires a numeric operand."), name);
688
689       msg_at (SN, expr_location (e, outer->args[0]),
690               _("The operand of %s has type '%s'."),
691               name, atom_type_name (expr_node_returns (outer->args[0])));
692
693       return NULL;
694     }
695
696   return op_count % 2 ? outer : outer->args[0];
697 }
698
699 /* Parses the OR level. */
700 static struct expr_node *
701 parse_or (struct lexer *lexer, struct expression *e)
702 {
703   static const struct operator op = { .token = T_OR, .num_op = OP_OR };
704   return parse_binary_operators (lexer, e, &op, 1, parse_and, NULL);
705 }
706
707 /* Parses the AND level. */
708 static struct expr_node *
709 parse_and (struct lexer *lexer, struct expression *e)
710 {
711   static const struct operator op = { .token = T_AND, .num_op = OP_AND };
712
713   return parse_binary_operators (lexer, e, &op, 1, parse_not, NULL);
714 }
715
716 /* Parses the NOT level. */
717 static struct expr_node *
718 parse_not (struct lexer *lexer, struct expression *e)
719 {
720   static const struct operator op = { .token = T_NOT, .num_op = OP_NOT };
721   return parse_inverting_unary_operator (lexer, e, &op, parse_rel);
722 }
723
724 /* Parse relational operators. */
725 static struct expr_node *
726 parse_rel (struct lexer *lexer, struct expression *e)
727 {
728   const char *chain_warning =
729     _("Chaining relational operators (e.g. `a < b < c') will "
730       "not produce the mathematically expected result.  "
731       "Use the AND logical operator to fix the problem "
732       "(e.g. `a < b AND b < c').  "
733       "To disable this warning, insert parentheses.");
734
735   static const struct operator ops[] =
736     {
737       { .token = T_EQUALS, .num_op = OP_EQ, .str_op = OP_EQ_STRING },
738       { .token = T_EQ, .num_op = OP_EQ, .str_op = OP_EQ_STRING },
739       { .token = T_GE, .num_op = OP_GE, .str_op = OP_GE_STRING },
740       { .token = T_GT, .num_op = OP_GT, .str_op = OP_GT_STRING },
741       { .token = T_LE, .num_op = OP_LE, .str_op = OP_LE_STRING },
742       { .token = T_LT, .num_op = OP_LT, .str_op = OP_LT_STRING },
743       { .token = T_NE, .num_op = OP_NE, .str_op = OP_NE_STRING },
744     };
745
746   return parse_binary_operators (lexer, e, ops, sizeof ops / sizeof *ops,
747                                  parse_add, chain_warning);
748 }
749
750 /* Parses the addition and subtraction level. */
751 static struct expr_node *
752 parse_add (struct lexer *lexer, struct expression *e)
753 {
754   static const struct operator ops[] =
755     {
756       { .token = T_PLUS, .num_op = OP_ADD },
757       { .token = T_DASH, .num_op = OP_SUB },
758       { .token = T_NEG_NUM, .num_op = OP_ADD },
759     };
760
761   return parse_binary_operators (lexer, e, ops, sizeof ops / sizeof *ops,
762                                  parse_mul, NULL);
763 }
764
765 /* Parses the multiplication and division level. */
766 static struct expr_node *
767 parse_mul (struct lexer *lexer, struct expression *e)
768 {
769   static const struct operator ops[] =
770     {
771       { .token = T_ASTERISK, .num_op = OP_MUL },
772       { .token = T_SLASH, .num_op = OP_DIV },
773     };
774
775   return parse_binary_operators (lexer, e, ops, sizeof ops / sizeof *ops,
776                                  parse_neg, NULL);
777 }
778
779 /* Parses the unary minus level. */
780 static struct expr_node *
781 parse_neg (struct lexer *lexer, struct expression *e)
782 {
783   static const struct operator op = { .token = T_DASH, .num_op = OP_NEG };
784   return parse_inverting_unary_operator (lexer, e, &op, parse_exp);
785 }
786
787 static struct expr_node *
788 parse_exp (struct lexer *lexer, struct expression *e)
789 {
790   static const struct operator op = { .token = T_EXP, .num_op = OP_POW };
791
792   const char *chain_warning =
793     _("The exponentiation operator (`**') is left-associative: "
794       "`a**b**c' equals `(a**b)**c', not `a**(b**c)'.  "
795       "To disable this warning, insert parentheses.");
796
797   if (lex_token (lexer) != T_NEG_NUM || lex_next_token (lexer, 1) != T_EXP)
798     return parse_binary_operators (lexer, e, &op, 1,
799                                    parse_primary, chain_warning);
800
801   /* Special case for situations like "-5**6", which must be parsed as
802      -(5**6). */
803
804   int start_ofs = lex_ofs (lexer);
805   struct expr_node *lhs = expr_allocate_number (e, -lex_tokval (lexer));
806   lex_get (lexer);
807   expr_add_location (lexer, e, start_ofs, lhs);
808
809   struct expr_node *node = parse_binary_operators__ (
810     lexer, e, &op, 1, parse_primary, chain_warning, lhs);
811   if (!node)
812     return NULL;
813
814   node = expr_allocate_unary (e, OP_NEG, node);
815   expr_add_location (lexer, e, start_ofs, node);
816   return node;
817 }
818
819 static double
820 ymd_to_offset (int y, int m, int d)
821 {
822   char *error;
823   double retval = calendar_gregorian_to_offset (
824     y, m, d, settings_get_fmt_settings (), &error);
825   if (error)
826     {
827       msg (SE, "%s", error);
828       free (error);
829     }
830   return retval;
831 }
832
833 static struct expr_node *
834 expr_date (struct expression *e, int year_digits)
835 {
836   static const char *months[12] =
837     {
838       "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
839       "JUL", "AUG", "SEP", "OCT", "NOV", "DEC",
840     };
841
842   time_t last_proc_time = time_of_last_procedure (e->ds);
843   struct tm *time = localtime (&last_proc_time);
844
845   char *tmp = (year_digits == 2
846                ? xasprintf ("%02d-%s-%02d", time->tm_mday, months[time->tm_mon],
847                             time->tm_year % 100)
848                : xasprintf ("%02d-%s-%04d", time->tm_mday, months[time->tm_mon],
849                             time->tm_year + 1900));
850
851   struct substring s;
852   ss_alloc_substring_pool (&s, ss_cstr (tmp), e->expr_pool);
853
854   free (tmp);
855
856   return expr_allocate_string (e, s);
857 }
858
859 /* Parses system variables. */
860 static struct expr_node *
861 parse_sysvar (struct lexer *lexer, struct expression *e)
862 {
863   if (lex_match_id (lexer, "$CASENUM"))
864     return expr_allocate_nullary (e, OP_CASENUM);
865   else if (lex_match_id (lexer, "$DATE"))
866     return expr_date (e, 2);
867   else if (lex_match_id (lexer, "$DATE11"))
868     return expr_date (e, 4);
869   else if (lex_match_id (lexer, "$TRUE"))
870     return expr_allocate_boolean (e, 1.0);
871   else if (lex_match_id (lexer, "$FALSE"))
872     return expr_allocate_boolean (e, 0.0);
873   else if (lex_match_id (lexer, "$SYSMIS"))
874     return expr_allocate_number (e, SYSMIS);
875   else if (lex_match_id (lexer, "$JDATE"))
876     {
877       time_t time = time_of_last_procedure (e->ds);
878       struct tm *tm = localtime (&time);
879       return expr_allocate_number (e, ymd_to_offset (tm->tm_year + 1900,
880                                                      tm->tm_mon + 1,
881                                                      tm->tm_mday));
882     }
883   else if (lex_match_id (lexer, "$TIME"))
884     {
885       time_t time = time_of_last_procedure (e->ds);
886       struct tm *tm = localtime (&time);
887       return expr_allocate_number (e, ymd_to_offset (tm->tm_year + 1900,
888                                                      tm->tm_mon + 1,
889                                                      tm->tm_mday)
890                                    + tm->tm_hour * 60 * 60.
891                                    + tm->tm_min * 60.
892                                    + tm->tm_sec);
893     }
894   else if (lex_match_id (lexer, "$LENGTH"))
895     return expr_allocate_number (e, settings_get_viewlength ());
896   else if (lex_match_id (lexer, "$WIDTH"))
897     return expr_allocate_number (e, settings_get_viewwidth ());
898   else
899     {
900       msg (SE, _("Unknown system variable %s."), lex_tokcstr (lexer));
901       return NULL;
902     }
903 }
904
905 /* Parses numbers, varnames, etc. */
906 static struct expr_node *
907 parse_primary__ (struct lexer *lexer, struct expression *e)
908 {
909   switch (lex_token (lexer))
910     {
911     case T_ID:
912       if (lex_next_token (lexer, 1) == T_LPAREN)
913         {
914           /* An identifier followed by a left parenthesis may be
915              a vector element reference.  If not, it's a function
916              call. */
917           if (e->ds != NULL && dict_lookup_vector (dataset_dict (e->ds), lex_tokcstr (lexer)) != NULL)
918             return parse_vector_element (lexer, e);
919           else
920             return parse_function (lexer, e);
921         }
922       else if (lex_tokcstr (lexer)[0] == '$')
923         {
924           /* $ at the beginning indicates a system variable. */
925           return parse_sysvar (lexer, e);
926         }
927       else if (e->ds != NULL && dict_lookup_var (dataset_dict (e->ds), lex_tokcstr (lexer)))
928         {
929           /* It looks like a user variable.
930              (It could be a format specifier, but we'll assume
931              it's a variable unless proven otherwise. */
932           return allocate_unary_variable (e, parse_variable (lexer, dataset_dict (e->ds)));
933         }
934       else
935         {
936           /* Try to parse it as a format specifier. */
937           struct fmt_spec fmt;
938           bool ok;
939
940           msg_disable ();
941           ok = parse_format_specifier (lexer, &fmt);
942           msg_enable ();
943
944           if (ok)
945             return expr_allocate_format (e, &fmt);
946
947           /* All attempts failed. */
948           msg (SE, _("Unknown identifier %s."), lex_tokcstr (lexer));
949           return NULL;
950         }
951       break;
952
953     case T_POS_NUM:
954     case T_NEG_NUM:
955       {
956         struct expr_node *node = expr_allocate_number (e, lex_tokval (lexer));
957         lex_get (lexer);
958         return node;
959       }
960
961     case T_STRING:
962       {
963         const char *dict_encoding;
964         struct expr_node *node;
965         char *s;
966
967         dict_encoding = (e->ds != NULL
968                          ? dict_get_encoding (dataset_dict (e->ds))
969                          : "UTF-8");
970         s = recode_string_pool (dict_encoding, "UTF-8", lex_tokcstr (lexer),
971                            ss_length (lex_tokss (lexer)), e->expr_pool);
972         node = expr_allocate_string (e, ss_cstr (s));
973
974         lex_get (lexer);
975         return node;
976       }
977
978     case T_LPAREN:
979       {
980         lex_get (lexer);
981         struct expr_node *node = parse_or (lexer, e);
982         return !node || !lex_force_match (lexer, T_RPAREN) ? NULL : node;
983       }
984
985     default:
986       lex_error (lexer, NULL);
987       return NULL;
988     }
989 }
990
991 static struct expr_node *
992 parse_primary (struct lexer *lexer, struct expression *e)
993 {
994   int start_ofs = lex_ofs (lexer);
995   struct expr_node *node = parse_primary__ (lexer, e);
996   expr_add_location (lexer, e, start_ofs, node);
997   return node;
998 }
999
1000 static struct expr_node *
1001 parse_vector_element (struct lexer *lexer, struct expression *e)
1002 {
1003   int vector_start_ofs = lex_ofs (lexer);
1004
1005   /* Find vector, skip token.
1006      The caller must already have verified that the current token
1007      is the name of a vector. */
1008   const struct vector *vector = dict_lookup_vector (dataset_dict (e->ds),
1009                                                     lex_tokcstr (lexer));
1010   assert (vector != NULL);
1011   lex_get (lexer);
1012
1013   /* Skip left parenthesis token.
1014      The caller must have verified that the lookahead is a left
1015      parenthesis. */
1016   assert (lex_token (lexer) == T_LPAREN);
1017   lex_get (lexer);
1018
1019   int element_start_ofs = lex_ofs (lexer);
1020   struct expr_node *element = parse_or (lexer, e);
1021   if (!element)
1022     return NULL;
1023   expr_add_location (lexer, e, element_start_ofs, element);
1024
1025   if (!lex_match (lexer, T_RPAREN))
1026     return NULL;
1027
1028   operation_type type = (vector_get_type (vector) == VAL_NUMERIC
1029                          ? OP_VEC_ELEM_NUM : OP_VEC_ELEM_STR);
1030   struct expr_node *node = expr_allocate_binary (
1031     e, type, element, expr_allocate_vector (e, vector));
1032   expr_add_location (lexer, e, vector_start_ofs, node);
1033
1034   if (!type_coercion (e, node, 0))
1035     {
1036       msg_at (SE, expr_location (e, node),
1037               _("A vector index must be numeric."));
1038
1039       msg_at (SN, expr_location (e, node->args[0]),
1040               _("This vector index has type '%s'."),
1041               atom_type_name (expr_node_returns (node->args[0])));
1042
1043       return NULL;
1044     }
1045
1046   return node;
1047 }
1048 \f
1049 /* Individual function parsing. */
1050
1051 const struct operation operations[OP_first + n_OP] = {
1052 #include "parse.inc"
1053 };
1054
1055 static bool
1056 word_matches (const char **test, const char **name)
1057 {
1058   size_t test_len = strcspn (*test, ".");
1059   size_t name_len = strcspn (*name, ".");
1060   if (test_len == name_len)
1061     {
1062       if (buf_compare_case (*test, *name, test_len))
1063         return false;
1064     }
1065   else if (test_len < 3 || test_len > name_len)
1066     return false;
1067   else
1068     {
1069       if (buf_compare_case (*test, *name, test_len))
1070         return false;
1071     }
1072
1073   *test += test_len;
1074   *name += name_len;
1075   if (**test != **name)
1076     return false;
1077
1078   if (**test == '.')
1079     {
1080       (*test)++;
1081       (*name)++;
1082     }
1083   return true;
1084 }
1085
1086 /* Returns 0 if TOKEN and FUNC do not match,
1087    1 if TOKEN is an acceptable abbreviation for FUNC,
1088    2 if TOKEN equals FUNC. */
1089 static int
1090 compare_function_names (const char *token_, const char *func_)
1091 {
1092   const char *token = token_;
1093   const char *func = func_;
1094   while (*token || *func)
1095     if (!word_matches (&token, &func))
1096       return 0;
1097   return !c_strcasecmp (token_, func_) ? 2 : 1;
1098 }
1099
1100 static bool
1101 lookup_function (const char *token,
1102                  const struct operation **first,
1103                  const struct operation **last)
1104 {
1105   *first = *last = NULL;
1106   const struct operation *best = NULL;
1107
1108   for (const struct operation *f = operations + OP_function_first;
1109        f <= operations + OP_function_last; f++)
1110     {
1111       int score = compare_function_names (token, f->name);
1112       if (score == 2)
1113         {
1114           best = f;
1115           break;
1116         }
1117       else if (score == 1 && !(f->flags & OPF_NO_ABBREV) && !best)
1118         best = f;
1119     }
1120
1121   if (!best)
1122     return false;
1123
1124   *first = best;
1125
1126   const struct operation *f = best;
1127   while (f <= operations + OP_function_last
1128          && !c_strcasecmp (f->name, best->name))
1129     f++;
1130   *last = f;
1131
1132   return true;
1133 }
1134
1135 static int
1136 extract_min_valid (const char *s)
1137 {
1138   char *p = strrchr (s, '.');
1139   if (p == NULL
1140       || p[1] < '0' || p[1] > '9'
1141       || strspn (p + 1, "0123456789") != strlen (p + 1))
1142     return -1;
1143   *p = '\0';
1144   return atoi (p + 1);
1145 }
1146
1147 static bool
1148 match_function__ (struct expr_node *node, const struct operation *f)
1149 {
1150   if (node->n_args < f->n_args
1151       || (node->n_args > f->n_args && (f->flags & OPF_ARRAY_OPERAND) == 0)
1152       || node->n_args - (f->n_args - 1) < f->array_min_elems)
1153     return false;
1154
1155   node->type = f - operations;
1156   for (size_t i = 0; i < node->n_args; i++)
1157     if (!is_coercible (node, i))
1158       return false;
1159
1160   return true;
1161 }
1162
1163 static const struct operation *
1164 match_function (struct expr_node *node,
1165                 const struct operation *first, const struct operation *last)
1166 {
1167   for (const struct operation *f = first; f < last; f++)
1168     if (match_function__ (node, f))
1169       return f;
1170   return NULL;
1171 }
1172
1173 static bool
1174 validate_function_args (const struct expression *e, const struct expr_node *n,
1175                         const struct operation *f, int n_args, int min_valid)
1176 {
1177   /* Count the function arguments that go into the trailing array (if any).  We
1178      know that there must be at least the minimum number because
1179      match_function() already checked. */
1180   int array_n_args = n_args - (f->n_args - 1);
1181   assert (array_n_args >= f->array_min_elems);
1182
1183   if ((f->flags & OPF_ARRAY_OPERAND)
1184       && array_n_args % f->array_granularity != 0)
1185     {
1186       /* RANGE is the only case we have so far.  It has paired arguments with
1187          one initial argument, and that's the only special case we deal with
1188          here. */
1189       assert (f->array_granularity == 2);
1190       assert (n_args % 2 == 0);
1191       msg_at (SE, expr_location (e, n),
1192               _("%s must have an odd number of arguments."), f->prototype);
1193       return false;
1194     }
1195
1196   if (min_valid != -1)
1197     {
1198       if (f->array_min_elems == 0)
1199         {
1200           assert ((f->flags & OPF_MIN_VALID) == 0);
1201           msg_at (SE, expr_location (e, n),
1202                   _("%s function cannot accept suffix .%d to specify the "
1203                     "minimum number of valid arguments."),
1204                   f->prototype, min_valid);
1205           return false;
1206         }
1207       else
1208         {
1209           assert (f->flags & OPF_MIN_VALID);
1210           if (min_valid > array_n_args)
1211             {
1212               msg_at (SE, expr_location (e, n),
1213                       _("For %s with %d arguments, at most %d (not %d) may be "
1214                         "required to be valid."),
1215                       f->prototype, n_args, array_n_args, min_valid);
1216               return false;
1217             }
1218         }
1219     }
1220
1221   return true;
1222 }
1223
1224 static void
1225 add_arg (struct expr_node ***args, size_t *n_args, size_t *allocated_args,
1226          struct expr_node *arg,
1227          struct expression *e, struct lexer *lexer, int arg_start_ofs)
1228 {
1229   if (*n_args >= *allocated_args)
1230     *args = x2nrealloc (*args, allocated_args, sizeof **args);
1231
1232   expr_add_location (lexer, e, arg_start_ofs, arg);
1233   (*args)[(*n_args)++] = arg;
1234 }
1235
1236 static void
1237 put_invocation (struct string *s,
1238                 const char *func_name, struct expr_node *node)
1239 {
1240   size_t i;
1241
1242   ds_put_format (s, "%s(", func_name);
1243   for (i = 0; i < node->n_args; i++)
1244     {
1245       if (i > 0)
1246         ds_put_cstr (s, ", ");
1247       ds_put_cstr (s, operations[expr_node_returns (node->args[i])].prototype);
1248     }
1249   ds_put_byte (s, ')');
1250 }
1251
1252 static void
1253 no_match (struct expression *e, const char *func_name, struct expr_node *node,
1254           const struct operation *first, const struct operation *last)
1255 {
1256   struct string s;
1257   const struct operation *f;
1258
1259   ds_init_empty (&s);
1260
1261   if (last - first == 1)
1262     {
1263       ds_put_format (&s, _("Type mismatch invoking %s as "), first->prototype);
1264       put_invocation (&s, func_name, node);
1265     }
1266   else
1267     {
1268       ds_put_cstr (&s, _("Function invocation "));
1269       put_invocation (&s, func_name, node);
1270       ds_put_cstr (&s, _(" does not match any known function.  Candidates are:"));
1271
1272       for (f = first; f < last; f++)
1273         ds_put_format (&s, "\n%s", f->prototype);
1274     }
1275   ds_put_byte (&s, '.');
1276
1277   msg_at (SE, expr_location (e, node), "%s", ds_cstr (&s));
1278
1279   ds_destroy (&s);
1280 }
1281
1282 static struct expr_node *
1283 parse_function (struct lexer *lexer, struct expression *e)
1284 {
1285   struct string func_name;
1286   ds_init_substring (&func_name, lex_tokss (lexer));
1287
1288   int min_valid = extract_min_valid (lex_tokcstr (lexer));
1289
1290   const struct operation *first, *last;
1291   if (!lookup_function (lex_tokcstr (lexer), &first, &last))
1292     {
1293       msg (SE, _("No function or vector named %s."), lex_tokcstr (lexer));
1294       ds_destroy (&func_name);
1295       return NULL;
1296     }
1297
1298   int func_start_ofs = lex_ofs (lexer);
1299   lex_get (lexer);
1300   if (!lex_force_match (lexer, T_LPAREN))
1301     {
1302       ds_destroy (&func_name);
1303       return NULL;
1304     }
1305
1306   struct expr_node **args = NULL;
1307   size_t n_args = 0;
1308   size_t allocated_args = 0;
1309   if (lex_token (lexer) != T_RPAREN)
1310     for (;;)
1311       {
1312         int arg_start_ofs = lex_ofs (lexer);
1313         if (lex_token (lexer) == T_ID
1314             && lex_next_token (lexer, 1) == T_TO)
1315           {
1316             const struct variable **vars;
1317             size_t n_vars;
1318
1319             if (!parse_variables_const (lexer, dataset_dict (e->ds),
1320                                         &vars, &n_vars, PV_SINGLE))
1321               goto fail;
1322             for (size_t i = 0; i < n_vars; i++)
1323               add_arg (&args, &n_args, &allocated_args,
1324                        allocate_unary_variable (e, vars[i]),
1325                        e, lexer, arg_start_ofs);
1326             free (vars);
1327           }
1328         else
1329           {
1330             struct expr_node *arg = parse_or (lexer, e);
1331             if (arg == NULL)
1332               goto fail;
1333
1334             add_arg (&args, &n_args, &allocated_args, arg,
1335                      e, lexer, arg_start_ofs);
1336           }
1337         if (lex_match (lexer, T_RPAREN))
1338           break;
1339         else if (!lex_match (lexer, T_COMMA))
1340           {
1341             lex_error_expecting (lexer, "`,'", "`)'");
1342             goto fail;
1343           }
1344       }
1345
1346   struct expr_node *n = expr_allocate_composite (e, first - operations,
1347                                                  args, n_args);
1348   expr_add_location (lexer, e, func_start_ofs, n);
1349   const struct operation *f = match_function (n, first, last);
1350   if (!f)
1351     {
1352       no_match (e, ds_cstr (&func_name), n, first, last);
1353       goto fail;
1354     }
1355   n->type = f - operations;
1356   n->min_valid = min_valid != -1 ? min_valid : f->array_min_elems;
1357
1358   for (size_t i = 0; i < n_args; i++)
1359     if (!type_coercion (e, n, i))
1360       {
1361         /* Unreachable because match_function already checked that the
1362            arguments were coercible. */
1363         NOT_REACHED ();
1364       }
1365   if (!validate_function_args (e, n, f, n_args, min_valid))
1366     goto fail;
1367
1368   if ((f->flags & OPF_EXTENSION) && settings_get_syntax () == COMPATIBLE)
1369     msg_at (SW, expr_location (e, n),
1370             _("%s is a PSPP extension."), f->prototype);
1371   if (f->flags & OPF_UNIMPLEMENTED)
1372     {
1373       msg_at (SE, expr_location (e, n),
1374               _("%s is not available in this version of PSPP."), f->prototype);
1375       goto fail;
1376     }
1377   if ((f->flags & OPF_PERM_ONLY) &&
1378       proc_in_temporary_transformations (e->ds))
1379     {
1380       msg_at (SE, expr_location (e, n),
1381               _("%s may not appear after %s."), f->prototype, "TEMPORARY");
1382       goto fail;
1383     }
1384
1385   if (n->type == OP_LAG_Vn || n->type == OP_LAG_Vs)
1386     dataset_need_lag (e->ds, 1);
1387   else if (n->type == OP_LAG_Vnn || n->type == OP_LAG_Vsn)
1388     {
1389       assert (n->n_args == 2);
1390       assert (n->args[1]->type == OP_pos_int);
1391       dataset_need_lag (e->ds, n->args[1]->integer);
1392     }
1393
1394   free (args);
1395   ds_destroy (&func_name);
1396   return n;
1397
1398 fail:
1399   free (args);
1400   ds_destroy (&func_name);
1401   return NULL;
1402 }
1403 \f
1404 /* Utility functions. */
1405
1406 static struct expression *
1407 expr_create (struct dataset *ds)
1408 {
1409   struct pool *pool = pool_create ();
1410   struct expression *e = pool_alloc (pool, sizeof *e);
1411   *e = (struct expression) {
1412     .expr_pool = pool,
1413     .ds = ds,
1414     .eval_pool = pool_create_subpool (pool),
1415   };
1416   return e;
1417 }
1418
1419 atom_type
1420 expr_node_returns (const struct expr_node *n)
1421 {
1422   assert (n != NULL);
1423   assert (is_operation (n->type));
1424   if (is_atom (n->type))
1425     return n->type;
1426   else if (is_composite (n->type))
1427     return operations[n->type].returns;
1428   else
1429     NOT_REACHED ();
1430 }
1431
1432 static const char *
1433 atom_type_name (atom_type type)
1434 {
1435   assert (is_atom (type));
1436
1437   /* The Boolean type is purely an internal concept that the documentation
1438      doesn't mention, so it might confuse users if we talked about them in
1439      diagnostics. */
1440   return type == OP_boolean ? "number" : operations[type].name;
1441 }
1442
1443 struct expr_node *
1444 expr_allocate_nullary (struct expression *e, operation_type op)
1445 {
1446   return expr_allocate_composite (e, op, NULL, 0);
1447 }
1448
1449 struct expr_node *
1450 expr_allocate_unary (struct expression *e, operation_type op,
1451                      struct expr_node *arg0)
1452 {
1453   return expr_allocate_composite (e, op, &arg0, 1);
1454 }
1455
1456 struct expr_node *
1457 expr_allocate_binary (struct expression *e, operation_type op,
1458                       struct expr_node *arg0, struct expr_node *arg1)
1459 {
1460   struct expr_node *args[2];
1461   args[0] = arg0;
1462   args[1] = arg1;
1463   return expr_allocate_composite (e, op, args, 2);
1464 }
1465
1466 struct expr_node *
1467 expr_allocate_composite (struct expression *e, operation_type op,
1468                          struct expr_node **args, size_t n_args)
1469 {
1470   for (size_t i = 0; i < n_args; i++)
1471     if (!args[i])
1472       return NULL;
1473
1474   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1475   *n = (struct expr_node) {
1476     .type = op,
1477     .n_args = n_args,
1478     .args = pool_clone (e->expr_pool, args, sizeof *n->args * n_args),
1479   };
1480   return n;
1481 }
1482
1483 struct expr_node *
1484 expr_allocate_number (struct expression *e, double d)
1485 {
1486   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1487   *n = (struct expr_node) { .type = OP_number, .number = d };
1488   return n;
1489 }
1490
1491 struct expr_node *
1492 expr_allocate_boolean (struct expression *e, double b)
1493 {
1494   assert (b == 0.0 || b == 1.0 || b == SYSMIS);
1495
1496   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1497   *n = (struct expr_node) { .type = OP_boolean, .number = b };
1498   return n;
1499 }
1500
1501 struct expr_node *
1502 expr_allocate_integer (struct expression *e, int i)
1503 {
1504   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1505   *n = (struct expr_node) { .type = OP_integer, .integer = i };
1506   return n;
1507 }
1508
1509 struct expr_node *
1510 expr_allocate_pos_int (struct expression *e, int i)
1511 {
1512   assert (i > 0);
1513
1514   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1515   *n = (struct expr_node) { .type = OP_pos_int, .integer = i };
1516   return n;
1517 }
1518
1519 struct expr_node *
1520 expr_allocate_vector (struct expression *e, const struct vector *vector)
1521 {
1522   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1523   *n = (struct expr_node) { .type = OP_vector, .vector = vector };
1524   return n;
1525 }
1526
1527 struct expr_node *
1528 expr_allocate_string (struct expression *e, struct substring s)
1529 {
1530   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1531   *n = (struct expr_node) { .type = OP_string, .string = s };
1532   return n;
1533 }
1534
1535 struct expr_node *
1536 expr_allocate_variable (struct expression *e, const struct variable *v)
1537 {
1538   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1539   *n = (struct expr_node) {
1540     .type = var_is_numeric (v) ? OP_num_var : OP_str_var,
1541     .variable = v
1542   };
1543   return n;
1544 }
1545
1546 struct expr_node *
1547 expr_allocate_format (struct expression *e, const struct fmt_spec *format)
1548 {
1549   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1550   *n = (struct expr_node) { .type = OP_format, .format = *format };
1551   return n;
1552 }
1553
1554 struct expr_node *
1555 expr_allocate_expr_node (struct expression *e,
1556                          const struct expr_node *expr_node)
1557 {
1558   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1559   *n = (struct expr_node) { .type = OP_expr_node, .expr_node = expr_node };
1560   return n;
1561 }
1562
1563 /* Allocates a unary composite node that represents the value of
1564    variable V in expression E. */
1565 static struct expr_node *
1566 allocate_unary_variable (struct expression *e, const struct variable *v)
1567 {
1568   assert (v != NULL);
1569   return expr_allocate_unary (e, var_is_numeric (v) ? OP_NUM_VAR : OP_STR_VAR,
1570                               expr_allocate_variable (e, v));
1571 }
1572 \f
1573 /* Export function details to other modules. */
1574
1575 /* Returns the operation structure for the function with the
1576    given IDX. */
1577 const struct operation *
1578 expr_get_function (size_t idx)
1579 {
1580   assert (idx < n_OP_function);
1581   return &operations[OP_function_first + idx];
1582 }
1583
1584 /* Returns the number of expression functions. */
1585 size_t
1586 expr_get_n_functions (void)
1587 {
1588   return n_OP_function;
1589 }
1590
1591 /* Returns the name of operation OP. */
1592 const char *
1593 expr_operation_get_name (const struct operation *op)
1594 {
1595   return op->name;
1596 }
1597
1598 /* Returns the human-readable prototype for operation OP. */
1599 const char *
1600 expr_operation_get_prototype (const struct operation *op)
1601 {
1602   return op->prototype;
1603 }
1604
1605 /* Returns the number of arguments for operation OP. */
1606 int
1607 expr_operation_get_n_args (const struct operation *op)
1608 {
1609   return op->n_args;
1610 }