better 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       "If chaining is really intended, parentheses will disable "
734       "this warning (e.g. `(a < b) < c'.)");
735
736   static const struct operator ops[] =
737     {
738       { .token = T_EQUALS, .num_op = OP_EQ, .str_op = OP_EQ_STRING },
739       { .token = T_EQ, .num_op = OP_EQ, .str_op = OP_EQ_STRING },
740       { .token = T_GE, .num_op = OP_GE, .str_op = OP_GE_STRING },
741       { .token = T_GT, .num_op = OP_GT, .str_op = OP_GT_STRING },
742       { .token = T_LE, .num_op = OP_LE, .str_op = OP_LE_STRING },
743       { .token = T_LT, .num_op = OP_LT, .str_op = OP_LT_STRING },
744       { .token = T_NE, .num_op = OP_NE, .str_op = OP_NE_STRING },
745     };
746
747   return parse_binary_operators (lexer, e, ops, sizeof ops / sizeof *ops,
748                                  parse_add, chain_warning);
749 }
750
751 /* Parses the addition and subtraction level. */
752 static struct expr_node *
753 parse_add (struct lexer *lexer, struct expression *e)
754 {
755   static const struct operator ops[] =
756     {
757       { .token = T_PLUS, .num_op = OP_ADD },
758       { .token = T_DASH, .num_op = OP_SUB },
759       { .token = T_NEG_NUM, .num_op = OP_ADD },
760     };
761
762   return parse_binary_operators (lexer, e, ops, sizeof ops / sizeof *ops,
763                                  parse_mul, NULL);
764 }
765
766 /* Parses the multiplication and division level. */
767 static struct expr_node *
768 parse_mul (struct lexer *lexer, struct expression *e)
769 {
770   static const struct operator ops[] =
771     {
772       { .token = T_ASTERISK, .num_op = OP_MUL },
773       { .token = T_SLASH, .num_op = OP_DIV },
774     };
775
776   return parse_binary_operators (lexer, e, ops, sizeof ops / sizeof *ops,
777                                  parse_neg, NULL);
778 }
779
780 /* Parses the unary minus level. */
781 static struct expr_node *
782 parse_neg (struct lexer *lexer, struct expression *e)
783 {
784   static const struct operator op = { .token = T_DASH, .num_op = OP_NEG };
785   return parse_inverting_unary_operator (lexer, e, &op, parse_exp);
786 }
787
788 static struct expr_node *
789 parse_exp (struct lexer *lexer, struct expression *e)
790 {
791   static const struct operator op = { .token = T_EXP, .num_op = OP_POW };
792
793   const char *chain_warning =
794     _("The exponentiation operator (`**') is left-associative: "
795       "`a**b**c' equals `(a**b)**c', not as `a**(b**c)'.  "
796       "To disable this warning, insert parentheses.");
797
798   if (lex_token (lexer) != T_NEG_NUM || lex_next_token (lexer, 1) != T_EXP)
799     return parse_binary_operators (lexer, e, &op, 1,
800                                    parse_primary, chain_warning);
801
802   /* Special case for situations like "-5**6", which must be parsed as
803      -(5**6). */
804
805   int start_ofs = lex_ofs (lexer);
806   struct expr_node *lhs = expr_allocate_number (e, -lex_tokval (lexer));
807   lex_get (lexer);
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         /* Count number of left parentheses so that we can match them against
981            an equal number of right parentheses.  This defeats trivial attempts
982            to exhaust the stack with a lot of left parentheses.  (More
983            sophisticated attacks will still succeed.) */
984         size_t n = 0;
985         while (lex_match (lexer, T_LPAREN))
986           n++;
987
988         struct expr_node *node = parse_or (lexer, e);
989         if (!node)
990           return NULL;
991
992         for (size_t i = 0; i < n; i++)
993           if (!lex_force_match (lexer, T_RPAREN))
994             return NULL;
995
996         return node;
997       }
998
999     default:
1000       lex_error (lexer, NULL);
1001       return NULL;
1002     }
1003 }
1004
1005 static struct expr_node *
1006 parse_primary (struct lexer *lexer, struct expression *e)
1007 {
1008   int start_ofs = lex_ofs (lexer);
1009   struct expr_node *node = parse_primary__ (lexer, e);
1010   expr_add_location (lexer, e, start_ofs, node);
1011   return node;
1012 }
1013
1014 static struct expr_node *
1015 parse_vector_element (struct lexer *lexer, struct expression *e)
1016 {
1017   int vector_start_ofs = lex_ofs (lexer);
1018
1019   /* Find vector, skip token.
1020      The caller must already have verified that the current token
1021      is the name of a vector. */
1022   const struct vector *vector = dict_lookup_vector (dataset_dict (e->ds),
1023                                                     lex_tokcstr (lexer));
1024   assert (vector != NULL);
1025   lex_get (lexer);
1026
1027   /* Skip left parenthesis token.
1028      The caller must have verified that the lookahead is a left
1029      parenthesis. */
1030   assert (lex_token (lexer) == T_LPAREN);
1031   lex_get (lexer);
1032
1033   int element_start_ofs = lex_ofs (lexer);
1034   struct expr_node *element = parse_or (lexer, e);
1035   if (!element)
1036     return NULL;
1037   expr_add_location (lexer, e, element_start_ofs, element);
1038
1039   if (!lex_match (lexer, T_RPAREN))
1040     return NULL;
1041
1042   operation_type type = (vector_get_type (vector) == VAL_NUMERIC
1043                          ? OP_VEC_ELEM_NUM : OP_VEC_ELEM_STR);
1044   struct expr_node *node = expr_allocate_binary (
1045     e, type, element, expr_allocate_vector (e, vector));
1046   expr_add_location (lexer, e, vector_start_ofs, node);
1047
1048   if (!type_coercion (e, node, 0))
1049     {
1050       msg_at (SE, expr_location (e, node),
1051               _("A vector index must be numeric."));
1052
1053       msg_at (SN, expr_location (e, node->args[0]),
1054               _("This vector index has type '%s'."),
1055               atom_type_name (expr_node_returns (node->args[0])));
1056
1057       return NULL;
1058     }
1059
1060   return node;
1061 }
1062 \f
1063 /* Individual function parsing. */
1064
1065 const struct operation operations[OP_first + n_OP] = {
1066 #include "parse.inc"
1067 };
1068
1069 static bool
1070 word_matches (const char **test, const char **name)
1071 {
1072   size_t test_len = strcspn (*test, ".");
1073   size_t name_len = strcspn (*name, ".");
1074   if (test_len == name_len)
1075     {
1076       if (buf_compare_case (*test, *name, test_len))
1077         return false;
1078     }
1079   else if (test_len < 3 || test_len > name_len)
1080     return false;
1081   else
1082     {
1083       if (buf_compare_case (*test, *name, test_len))
1084         return false;
1085     }
1086
1087   *test += test_len;
1088   *name += name_len;
1089   if (**test != **name)
1090     return false;
1091
1092   if (**test == '.')
1093     {
1094       (*test)++;
1095       (*name)++;
1096     }
1097   return true;
1098 }
1099
1100 /* Returns 0 if TOKEN and FUNC do not match,
1101    1 if TOKEN is an acceptable abbreviation for FUNC,
1102    2 if TOKEN equals FUNC. */
1103 static int
1104 compare_function_names (const char *token_, const char *func_)
1105 {
1106   const char *token = token_;
1107   const char *func = func_;
1108   while (*token || *func)
1109     if (!word_matches (&token, &func))
1110       return 0;
1111   return !c_strcasecmp (token_, func_) ? 2 : 1;
1112 }
1113
1114 static bool
1115 lookup_function (const char *token,
1116                  const struct operation **first,
1117                  const struct operation **last)
1118 {
1119   *first = *last = NULL;
1120   const struct operation *best = NULL;
1121
1122   for (const struct operation *f = operations + OP_function_first;
1123        f <= operations + OP_function_last; f++)
1124     {
1125       int score = compare_function_names (token, f->name);
1126       if (score == 2)
1127         {
1128           best = f;
1129           break;
1130         }
1131       else if (score == 1 && !(f->flags & OPF_NO_ABBREV) && !best)
1132         best = f;
1133     }
1134
1135   if (!best)
1136     return false;
1137
1138   *first = best;
1139
1140   const struct operation *f = best;
1141   while (f <= operations + OP_function_last
1142          && !c_strcasecmp (f->name, best->name))
1143     f++;
1144   *last = f;
1145
1146   return true;
1147 }
1148
1149 static int
1150 extract_min_valid (const char *s)
1151 {
1152   char *p = strrchr (s, '.');
1153   if (p == NULL
1154       || p[1] < '0' || p[1] > '9'
1155       || strspn (p + 1, "0123456789") != strlen (p + 1))
1156     return -1;
1157   *p = '\0';
1158   return atoi (p + 1);
1159 }
1160
1161 static bool
1162 match_function__ (struct expr_node *node, const struct operation *f)
1163 {
1164   if (node->n_args < f->n_args
1165       || (node->n_args > f->n_args && (f->flags & OPF_ARRAY_OPERAND) == 0)
1166       || node->n_args - (f->n_args - 1) < f->array_min_elems)
1167     return false;
1168
1169   node->type = f - operations;
1170   for (size_t i = 0; i < node->n_args; i++)
1171     if (!is_coercible (node, i))
1172       return false;
1173
1174   return true;
1175 }
1176
1177 static const struct operation *
1178 match_function (struct expr_node *node,
1179                 const struct operation *first, const struct operation *last)
1180 {
1181   for (const struct operation *f = first; f < last; f++)
1182     if (match_function__ (node, f))
1183       return f;
1184   return NULL;
1185 }
1186
1187 static bool
1188 validate_function_args (const struct expression *e, const struct expr_node *n,
1189                         const struct operation *f, int n_args, int min_valid)
1190 {
1191   /* Count the function arguments that go into the trailing array (if any).  We
1192      know that there must be at least the minimum number because
1193      match_function() already checked. */
1194   int array_n_args = n_args - (f->n_args - 1);
1195   assert (array_n_args >= f->array_min_elems);
1196
1197   if ((f->flags & OPF_ARRAY_OPERAND)
1198       && array_n_args % f->array_granularity != 0)
1199     {
1200       /* RANGE is the only case we have so far.  It has paired arguments with
1201          one initial argument, and that's the only special case we deal with
1202          here. */
1203       assert (f->array_granularity == 2);
1204       assert (n_args % 2 == 0);
1205       msg_at (SE, expr_location (e, n),
1206               _("%s must have an odd number of arguments."), f->prototype);
1207       return false;
1208     }
1209
1210   if (min_valid != -1)
1211     {
1212       if (f->array_min_elems == 0)
1213         {
1214           assert ((f->flags & OPF_MIN_VALID) == 0);
1215           msg_at (SE, expr_location (e, n),
1216                   _("%s function cannot accept suffix .%d to specify the "
1217                     "minimum number of valid arguments."),
1218                   f->prototype, min_valid);
1219           return false;
1220         }
1221       else
1222         {
1223           assert (f->flags & OPF_MIN_VALID);
1224           if (min_valid > array_n_args)
1225             {
1226               msg_at (SE, expr_location (e, n),
1227                       _("For %s with %d arguments, at most %d (not %d) may be "
1228                         "required to be valid."),
1229                       f->prototype, n_args, array_n_args, min_valid);
1230               return false;
1231             }
1232         }
1233     }
1234
1235   return true;
1236 }
1237
1238 static void
1239 add_arg (struct expr_node ***args, size_t *n_args, size_t *allocated_args,
1240          struct expr_node *arg,
1241          struct expression *e, struct lexer *lexer, int arg_start_ofs)
1242 {
1243   if (*n_args >= *allocated_args)
1244     *args = x2nrealloc (*args, allocated_args, sizeof **args);
1245
1246   expr_add_location (lexer, e, arg_start_ofs, arg);
1247   (*args)[(*n_args)++] = arg;
1248 }
1249
1250 static void
1251 put_invocation (struct string *s,
1252                 const char *func_name, struct expr_node *node)
1253 {
1254   size_t i;
1255
1256   ds_put_format (s, "%s(", func_name);
1257   for (i = 0; i < node->n_args; i++)
1258     {
1259       if (i > 0)
1260         ds_put_cstr (s, ", ");
1261       ds_put_cstr (s, operations[expr_node_returns (node->args[i])].prototype);
1262     }
1263   ds_put_byte (s, ')');
1264 }
1265
1266 static void
1267 no_match (struct expression *e, const char *func_name, struct expr_node *node,
1268           const struct operation *first, const struct operation *last)
1269 {
1270   struct string s;
1271   const struct operation *f;
1272
1273   ds_init_empty (&s);
1274
1275   if (last - first == 1)
1276     {
1277       ds_put_format (&s, _("Type mismatch invoking %s as "), first->prototype);
1278       put_invocation (&s, func_name, node);
1279     }
1280   else
1281     {
1282       ds_put_cstr (&s, _("Function invocation "));
1283       put_invocation (&s, func_name, node);
1284       ds_put_cstr (&s, _(" does not match any known function.  Candidates are:"));
1285
1286       for (f = first; f < last; f++)
1287         ds_put_format (&s, "\n%s", f->prototype);
1288     }
1289   ds_put_byte (&s, '.');
1290
1291   msg_at (SE, expr_location (e, node), "%s", ds_cstr (&s));
1292
1293   ds_destroy (&s);
1294 }
1295
1296 static struct expr_node *
1297 parse_function (struct lexer *lexer, struct expression *e)
1298 {
1299   struct string func_name;
1300   ds_init_substring (&func_name, lex_tokss (lexer));
1301
1302   int min_valid = extract_min_valid (lex_tokcstr (lexer));
1303
1304   const struct operation *first, *last;
1305   if (!lookup_function (lex_tokcstr (lexer), &first, &last))
1306     {
1307       msg (SE, _("No function or vector named %s."), lex_tokcstr (lexer));
1308       ds_destroy (&func_name);
1309       return NULL;
1310     }
1311
1312   int func_start_ofs = lex_ofs (lexer);
1313   lex_get (lexer);
1314   if (!lex_force_match (lexer, T_LPAREN))
1315     {
1316       ds_destroy (&func_name);
1317       return NULL;
1318     }
1319
1320   struct expr_node **args = NULL;
1321   size_t n_args = 0;
1322   size_t allocated_args = 0;
1323   if (lex_token (lexer) != T_RPAREN)
1324     for (;;)
1325       {
1326         int arg_start_ofs = lex_ofs (lexer);
1327         if (lex_token (lexer) == T_ID
1328             && lex_next_token (lexer, 1) == T_TO)
1329           {
1330             const struct variable **vars;
1331             size_t n_vars;
1332
1333             if (!parse_variables_const (lexer, dataset_dict (e->ds),
1334                                         &vars, &n_vars, PV_SINGLE))
1335               goto fail;
1336             for (size_t i = 0; i < n_vars; i++)
1337               add_arg (&args, &n_args, &allocated_args,
1338                        allocate_unary_variable (e, vars[i]),
1339                        e, lexer, arg_start_ofs);
1340             free (vars);
1341           }
1342         else
1343           {
1344             struct expr_node *arg = parse_or (lexer, e);
1345             if (arg == NULL)
1346               goto fail;
1347
1348             add_arg (&args, &n_args, &allocated_args, arg,
1349                      e, lexer, arg_start_ofs);
1350           }
1351         if (lex_match (lexer, T_RPAREN))
1352           break;
1353         else if (!lex_match (lexer, T_COMMA))
1354           {
1355             lex_error_expecting (lexer, "`,'", "`)'");
1356             goto fail;
1357           }
1358       }
1359
1360   struct expr_node *n = expr_allocate_composite (e, first - operations,
1361                                                  args, n_args);
1362   expr_add_location (lexer, e, func_start_ofs, n);
1363   const struct operation *f = match_function (n, first, last);
1364   if (!f)
1365     {
1366       no_match (e, ds_cstr (&func_name), n, first, last);
1367       goto fail;
1368     }
1369   n->type = f - operations;
1370   n->min_valid = min_valid != -1 ? min_valid : f->array_min_elems;
1371
1372   for (size_t i = 0; i < n_args; i++)
1373     if (!type_coercion (e, n, i))
1374       {
1375         /* Unreachable because match_function already checked that the
1376            arguments were coercible. */
1377         NOT_REACHED ();
1378       }
1379   if (!validate_function_args (e, n, f, n_args, min_valid))
1380     goto fail;
1381
1382   if ((f->flags & OPF_EXTENSION) && settings_get_syntax () == COMPATIBLE)
1383     msg_at (SW, expr_location (e, n),
1384             _("%s is a PSPP extension."), f->prototype);
1385   if (f->flags & OPF_UNIMPLEMENTED)
1386     {
1387       msg_at (SE, expr_location (e, n),
1388               _("%s is not available in this version of PSPP."), f->prototype);
1389       goto fail;
1390     }
1391   if ((f->flags & OPF_PERM_ONLY) &&
1392       proc_in_temporary_transformations (e->ds))
1393     {
1394       msg_at (SE, expr_location (e, n),
1395               _("%s may not appear after %s."), f->prototype, "TEMPORARY");
1396       goto fail;
1397     }
1398
1399   if (n->type == OP_LAG_Vn || n->type == OP_LAG_Vs)
1400     dataset_need_lag (e->ds, 1);
1401   else if (n->type == OP_LAG_Vnn || n->type == OP_LAG_Vsn)
1402     {
1403       assert (n->n_args == 2);
1404       assert (n->args[1]->type == OP_pos_int);
1405       dataset_need_lag (e->ds, n->args[1]->integer);
1406     }
1407
1408   free (args);
1409   ds_destroy (&func_name);
1410   return n;
1411
1412 fail:
1413   free (args);
1414   ds_destroy (&func_name);
1415   return NULL;
1416 }
1417 \f
1418 /* Utility functions. */
1419
1420 static struct expression *
1421 expr_create (struct dataset *ds)
1422 {
1423   struct pool *pool = pool_create ();
1424   struct expression *e = pool_alloc (pool, sizeof *e);
1425   *e = (struct expression) {
1426     .expr_pool = pool,
1427     .ds = ds,
1428     .eval_pool = pool_create_subpool (pool),
1429   };
1430   return e;
1431 }
1432
1433 atom_type
1434 expr_node_returns (const struct expr_node *n)
1435 {
1436   assert (n != NULL);
1437   assert (is_operation (n->type));
1438   if (is_atom (n->type))
1439     return n->type;
1440   else if (is_composite (n->type))
1441     return operations[n->type].returns;
1442   else
1443     NOT_REACHED ();
1444 }
1445
1446 static const char *
1447 atom_type_name (atom_type type)
1448 {
1449   assert (is_atom (type));
1450
1451   /* The Boolean type is purely an internal concept that the documentation
1452      doesn't mention, so it might confuse users if we talked about them in
1453      diagnostics. */
1454   return type == OP_boolean ? "number" : operations[type].name;
1455 }
1456
1457 struct expr_node *
1458 expr_allocate_nullary (struct expression *e, operation_type op)
1459 {
1460   return expr_allocate_composite (e, op, NULL, 0);
1461 }
1462
1463 struct expr_node *
1464 expr_allocate_unary (struct expression *e, operation_type op,
1465                      struct expr_node *arg0)
1466 {
1467   return expr_allocate_composite (e, op, &arg0, 1);
1468 }
1469
1470 struct expr_node *
1471 expr_allocate_binary (struct expression *e, operation_type op,
1472                       struct expr_node *arg0, struct expr_node *arg1)
1473 {
1474   struct expr_node *args[2];
1475   args[0] = arg0;
1476   args[1] = arg1;
1477   return expr_allocate_composite (e, op, args, 2);
1478 }
1479
1480 struct expr_node *
1481 expr_allocate_composite (struct expression *e, operation_type op,
1482                          struct expr_node **args, size_t n_args)
1483 {
1484   for (size_t i = 0; i < n_args; i++)
1485     if (!args[i])
1486       return NULL;
1487
1488   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1489   *n = (struct expr_node) {
1490     .type = op,
1491     .n_args = n_args,
1492     .args = pool_clone (e->expr_pool, args, sizeof *n->args * n_args),
1493   };
1494   return n;
1495 }
1496
1497 struct expr_node *
1498 expr_allocate_number (struct expression *e, double d)
1499 {
1500   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1501   *n = (struct expr_node) { .type = OP_number, .number = d };
1502   return n;
1503 }
1504
1505 struct expr_node *
1506 expr_allocate_boolean (struct expression *e, double b)
1507 {
1508   assert (b == 0.0 || b == 1.0 || b == SYSMIS);
1509
1510   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1511   *n = (struct expr_node) { .type = OP_boolean, .number = b };
1512   return n;
1513 }
1514
1515 struct expr_node *
1516 expr_allocate_integer (struct expression *e, int i)
1517 {
1518   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1519   *n = (struct expr_node) { .type = OP_integer, .integer = i };
1520   return n;
1521 }
1522
1523 struct expr_node *
1524 expr_allocate_pos_int (struct expression *e, int i)
1525 {
1526   assert (i > 0);
1527
1528   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1529   *n = (struct expr_node) { .type = OP_pos_int, .integer = i };
1530   return n;
1531 }
1532
1533 struct expr_node *
1534 expr_allocate_vector (struct expression *e, const struct vector *vector)
1535 {
1536   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1537   *n = (struct expr_node) { .type = OP_vector, .vector = vector };
1538   return n;
1539 }
1540
1541 struct expr_node *
1542 expr_allocate_string (struct expression *e, struct substring s)
1543 {
1544   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1545   *n = (struct expr_node) { .type = OP_string, .string = s };
1546   return n;
1547 }
1548
1549 struct expr_node *
1550 expr_allocate_variable (struct expression *e, const struct variable *v)
1551 {
1552   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1553   *n = (struct expr_node) {
1554     .type = var_is_numeric (v) ? OP_num_var : OP_str_var,
1555     .variable = v
1556   };
1557   return n;
1558 }
1559
1560 struct expr_node *
1561 expr_allocate_format (struct expression *e, const struct fmt_spec *format)
1562 {
1563   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1564   *n = (struct expr_node) { .type = OP_format, .format = *format };
1565   return n;
1566 }
1567
1568 struct expr_node *
1569 expr_allocate_expr_node (struct expression *e,
1570                          const struct expr_node *expr_node)
1571 {
1572   struct expr_node *n = pool_alloc (e->expr_pool, sizeof *n);
1573   *n = (struct expr_node) { .type = OP_expr_node, .expr_node = expr_node };
1574   return n;
1575 }
1576
1577 /* Allocates a unary composite node that represents the value of
1578    variable V in expression E. */
1579 static struct expr_node *
1580 allocate_unary_variable (struct expression *e, const struct variable *v)
1581 {
1582   assert (v != NULL);
1583   return expr_allocate_unary (e, var_is_numeric (v) ? OP_NUM_VAR : OP_STR_VAR,
1584                               expr_allocate_variable (e, v));
1585 }
1586 \f
1587 /* Export function details to other modules. */
1588
1589 /* Returns the operation structure for the function with the
1590    given IDX. */
1591 const struct operation *
1592 expr_get_function (size_t idx)
1593 {
1594   assert (idx < n_OP_function);
1595   return &operations[OP_function_first + idx];
1596 }
1597
1598 /* Returns the number of expression functions. */
1599 size_t
1600 expr_get_n_functions (void)
1601 {
1602   return n_OP_function;
1603 }
1604
1605 /* Returns the name of operation OP. */
1606 const char *
1607 expr_operation_get_name (const struct operation *op)
1608 {
1609   return op->name;
1610 }
1611
1612 /* Returns the human-readable prototype for operation OP. */
1613 const char *
1614 expr_operation_get_prototype (const struct operation *op)
1615 {
1616   return op->prototype;
1617 }
1618
1619 /* Returns the number of arguments for operation OP. */
1620 int
1621 expr_operation_get_n_args (const struct operation *op)
1622 {
1623   return op->n_args;
1624 }