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