expressions: Simplify type declarations for nodes.
[pspp] / src / language / expressions / private.h
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 1997-9, 2000, 2011 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 #ifndef EXPRESSIONS_PRIVATE_H
18 #define EXPRESSIONS_PRIVATE_H
19
20 #include <assert.h>
21 #include <stddef.h>
22
23 #include "data/format.h"
24 #include "operations.h"
25 #include "public.h"
26 #include "libpspp/str.h"
27
28 enum operation_flags
29   {
30     /* Most operations produce a missing output value if any
31        input value is missing.  Setting this bit indicates that
32        this operation may produce a non-missing result given
33        missing input values (although it is not obliged to do
34        so).  Unless this bit is set, the operation's evaluation
35        function will never be passed a missing argument. */
36     OPF_ABSORB_MISS = 004,
37
38     /* If set, this operation's final operand is an array of one
39        or more elements. */
40     OPF_ARRAY_OPERAND = 001,
41
42     /* If set, the user can specify the minimum number of array
43        elements that must be non-missing for the function result
44        to be non-missing.  The operation must have an array
45        operand and the array must contain `double's.  Both
46        OPF_ABSORB_MISS and OPF_ARRAY_OPERAND must also be set. */
47     OPF_MIN_VALID = 002,
48
49     /* If set, operation is non-optimizable in general.  Unless
50        combined with OPF_ABSORB_MISS, missing input values are
51        still assumed to yield missing results. */
52     OPF_NONOPTIMIZABLE = 010,
53
54     /* If set, this operation is not implemented. */
55     OPF_UNIMPLEMENTED = 020,
56
57     /* If set, this operation is a PSPP extension. */
58     OPF_EXTENSION = 040,
59
60     /* If set, this operation may not occur after TEMPORARY.
61        (Currently this applies only to LAG.) */
62     OPF_PERM_ONLY = 0100,
63
64     /* If set, this operation's name may not be abbreviated. */
65     OPF_NO_ABBREV = 0200
66   };
67
68 #define EXPR_ARG_MAX 4
69 struct operation
70   {
71     const char *name;
72     const char *prototype;
73     enum operation_flags flags;
74     atom_type returns;       /* Usually OP_number, OP_string, or OP_boolean. */
75     int n_args;
76     atom_type args[EXPR_ARG_MAX];
77     int array_min_elems;
78     int array_granularity;
79   };
80
81 extern const struct operation operations[];
82
83 /* Expression parse tree. */
84 struct expr_node
85   {
86     operation_type type;
87     struct msg_location *location;
88
89     union
90       {
91         /* OP_number. */
92         double number;
93
94         /* OP_string. */
95         struct substring string;
96
97         /* OP_variable. */
98         const struct variable *variable;
99
100         /* OP_integer. */
101         int integer;
102
103         /* OP_vector. */
104         const struct vector *vector;
105
106         /* OP_format. */
107         struct fmt_spec format;
108
109         /* All the other node types. */
110         struct
111           {
112             size_t n_args;         /* Number of arguments. */
113             struct expr_node **args; /* Arguments. */
114             size_t min_valid;   /* Min valid array args to get valid result. */
115           };
116       };
117   };
118
119 union operation_data
120   {
121     operation_type operation;
122     double number;
123     struct substring string;
124     const struct variable *variable;
125     const struct vector *vector;
126     struct fmt_spec *format;
127     int integer;
128   };
129
130 /* An expression. */
131 struct expression
132   {
133     struct pool *expr_pool;     /* Pool for expression static data. */
134     struct dataset *ds ;        /* The dataset */
135     atom_type type;             /* Type of expression result. */
136
137     union operation_data *ops;  /* Expression data. */
138     operation_type *op_types;   /* ops[] element types (for debugging). */
139     size_t n_ops, allocated_ops; /* Number of ops, amount of allocated space. */
140
141     double *number_stack;       /* Evaluation stack: numerics, Booleans. */
142     struct substring *string_stack; /* Evaluation stack: strings. */
143     struct pool *eval_pool;     /* Pool for evaluation temporaries. */
144   };
145
146 struct expression *expr_parse_any (struct lexer *lexer, struct dataset *,  bool optimize);
147 void expr_debug_print_postfix (const struct expression *);
148
149 struct expr_node *expr_optimize (struct expr_node *, struct expression *);
150 void expr_flatten (struct expr_node *, struct expression *);
151
152 atom_type expr_node_returns (const struct expr_node *);
153
154 struct expr_node *expr_allocate_nullary (struct expression *e, operation_type);
155 struct expr_node *expr_allocate_unary (struct expression *e,
156                                      operation_type, struct expr_node *);
157 struct expr_node *expr_allocate_binary (struct expression *e, operation_type,
158                                  struct expr_node *, struct expr_node *);
159 struct expr_node *expr_allocate_composite (struct expression *e, operation_type,
160                                          struct expr_node **, size_t);
161 struct expr_node *expr_allocate_number (struct expression *e, double);
162 struct expr_node *expr_allocate_boolean (struct expression *e, double);
163 struct expr_node *expr_allocate_integer (struct expression *e, int);
164 struct expr_node *expr_allocate_pos_int (struct expression *e, int);
165 struct expr_node *expr_allocate_string (struct expression *e, struct substring);
166 struct expr_node *expr_allocate_variable (struct expression *e,
167                                         const struct variable *);
168 struct expr_node *expr_allocate_format (struct expression *e,
169                                  const struct fmt_spec *);
170 struct expr_node *expr_allocate_vector (struct expression *e,
171                                       const struct vector *);
172
173 #endif /* expressions/private.h */