start updating expression tests
[pspp] / src / language / expressions / generate.py
index e530cd8208a11542c71e62f364e98890258aa974..ed041f7efd1699fc9e74fe36c1a397053a4499ae 100644 (file)
@@ -46,6 +46,8 @@ def init_all_types():
                      'string', 'ss', 'empty_string'),
         Type.new_any('boolean', 'double', 'number', 'n',
                      'boolean', 'ns', 'SYSMIS'),
+        Type.new_any('integer', 'int', 'number', 'n',
+                     'integer', 'ns', 'SYSMIS'),
 
         # Format types.
         Type.new_atom('format'),
@@ -55,8 +57,6 @@ def init_all_types():
                       'format', 'f', 'num_output_format'),
 
         # Integer types.
-        Type.new_leaf('integer', 'int', 'integer', 'n',
-                      'integer'),
         Type.new_leaf('pos_int', 'int', 'integer', 'n',
                       'positive_integer_constant'),
 
@@ -75,6 +75,7 @@ def init_all_types():
 
         # Types that appear only as auxiliary data.
         Type.new_auxonly('expression', 'struct expression *', 'e'),
+        Type.new_auxonly('expr_node', 'const struct expr_node *', 'n'),
         Type.new_auxonly('case', 'const struct ccase *', 'c'),
         Type.new_auxonly('case_idx', 'size_t', 'case_idx'),
         Type.new_auxonly('dataset', 'struct dataset *', 'ds'),
@@ -87,6 +88,7 @@ def init_all_types():
 
         # Used only for debugging purposes.
         Type.new_atom('operation'),
+        Type.new_atom('exprnode'),
     ]:
         types[t.name] = t
 
@@ -313,6 +315,10 @@ class Op:
             flags += ['OPF_PERM_ONLY']
         if self.no_abbrev:
             flags += ['OPF_NO_ABBREV']
+        for aux in self.aux:
+            if aux['TYPE'].name == 'expr_node':
+                flags += ['OPF_EXPR_NODE']
+                break
         return ' | '.join(flags) if flags else '0'
 
 
@@ -755,6 +761,10 @@ def generate_evaluate_inc():
                 decls += ['%saux_%s = op++->%s'
                           % (type_.c_type, name, type_.atom)]
                 args += ['aux_%s' % name]
+            elif type_.name == 'expr_node':
+                decls += ['%saux_%s = op++->node'
+                          % (type_.c_type, name)]
+                args += ['aux_%s' % name]
             elif type_.role == 'auxonly':
                 args += [type_.auxonly_value]
 
@@ -884,6 +894,8 @@ def generate_optimize_inc():
                 func = 'get_%s_arg' % type_.atom
                 args += '%s (node, %s)' % (func, arg_idx)
                 arg_idx += 1
+            elif type_.name == 'expr_node':
+                args += ['node']
             elif type_.role == 'auxonly':
                 args += [type_.auxonly_value]
             else: