aboutsummaryrefslogtreecommitdiff
path: root/backendC/CleanCompilerSources/syntaxtr.t
diff options
context:
space:
mode:
Diffstat (limited to 'backendC/CleanCompilerSources/syntaxtr.t')
-rw-r--r--backendC/CleanCompilerSources/syntaxtr.t1134
1 files changed, 1134 insertions, 0 deletions
diff --git a/backendC/CleanCompilerSources/syntaxtr.t b/backendC/CleanCompilerSources/syntaxtr.t
new file mode 100644
index 0000000..aa337bd
--- /dev/null
+++ b/backendC/CleanCompilerSources/syntaxtr.t
@@ -0,0 +1,1134 @@
+/*
+ Version 1.1 23-1-1996
+*/
+
+#include "compiledefines.h"
+
+#define D 0
+
+#define class class_is_keyword
+#define new new_is_keyword
+
+#define STRUCT(struct_name,type_name) \
+ typedef struct struct_name type_name##S; \
+ typedef struct struct_name *type_name; \
+ typedef struct struct_name *type_name##P; \
+ struct struct_name
+
+typedef unsigned long BITVECT;
+
+typedef enum
+{ NoAttr, DeferAttr, CopyAttr
+} GraphAttributeKind;
+
+typedef enum
+{ NotUsed, UniquelyUsed, SelectivelyUsed, MultiplyUsed, ObservinglyUsed
+} OccurrenceKind;
+
+typedef enum {
+ TupleState, ArrayState, RecordState, SimpleState
+} StateType;
+
+/* the order of the StateKinds is used by IsLazyState and ExpectsResultNode */
+typedef enum {
+ OnB, LazyRedirection, StrictRedirection, /* strict states, no result node */
+ StrictOnA, /* strict state, result node */
+ OnA, SemiStrict, Parallel, Undefined, UnderEval /* lazy states, result node */
+} StateKind;
+
+typedef enum {
+ UnknownObj,
+#if ABSTRACT_OBJECT
+ AbstractObj,
+#endif
+ IntObj, BoolObj, CharObj, RealObj, FileObj, StringObj,
+ TupleObj, ListObj, RecordObj, ArrayObj, StrictArrayObj, UnboxedArrayObj,
+ WorldObj, ProcIdObj, RedIdObj
+#ifdef CLEAN2
+ ,DynamicObj
+#endif
+ , NrOfObjects
+} ObjectKind;
+
+#if ABSTRACT_OBJECT
+# define BASIC_ELEMS_STRING "uuibcrfsaaaaaaippa" /* index by ObjectKind */
+#else
+# define BASIC_ELEMS_STRING "uibcrfsaaaaaaippa" /* index by ObjectKind */
+#endif
+
+typedef enum {
+ int_type, bool_type, char_type, real_type,
+ file_type, string_type,world_type, procid_type,
+ redid_type,
+ Nr_Of_Basic_Types,
+ int_denot, bool_denot, char_denot, real_denot,
+ Nr_Of_Basic_Denots,
+ string_denot,
+ fun_type, array_type, strict_array_type, unboxed_array_type, list_type, tuple_type, empty_type,
+#ifdef CLEAN2
+ dynamic_type,
+#endif
+ Nr_Of_Predef_Types,
+ tuple_symb, cons_symb, nil_symb,
+ apply_symb, if_symb, fail_symb, all_symb,
+ select_symb,
+ Nr_Of_Predef_FunsOrConses,
+ definition, newsymbol, instance_symb, empty_symbol, field_symbol_list,
+ erroneous_symb
+} SymbKind;
+
+#ifdef THINK_C
+#define DSymbKind(v) ( \
+ v==definition?"definition": \
+ v==int_denot?"int_denot": \
+ v==tuple_symb?"tuple_symb": \
+ v==cons_symb?"cons_symb": \
+ v==nil_symb?"nil_symb": \
+ v==select_symb?"select_symb": \
+ v==apply_symb?"apply_symb": \
+ v==if_symb?"if_symb": \
+ v==newsymbol?"newsymbol": \
+ v==emptysymbol?"emptysymbol": \
+ v==field_symbol_list?"field_symbol_list": \
+ "")
+#endif
+
+#if D
+
+STRUCT (state,State){
+ union {
+ struct {
+ StateKind arg_kind; /* for SimpleState */
+ ObjectKind arg_object;
+ } state_arg;
+ struct state * state_args; /* for TupleState and ArrayState */
+ struct record_state_descr * state_rs; /* for RecordState */
+ };
+ short state_arity;
+ unsigned char state_type; /* StateType */
+ unsigned char state_mark;
+};
+
+#define state_kind state_arg.arg_kind
+#define state_object state_arg.arg_object
+
+#define state_record_symbol state_rs->rs_symb
+#define state_record_arguments state_rs->rs_args
+#define state_record_desc state_rs
+#define state_tuple_arguments state_args
+#define state_array_arguments state_args
+
+#else
+
+STRUCT (state,State){
+ union {
+ struct state * sd_args; /* for TupleState and ArrayState */
+ struct record_state_descr * sd_rs; /* for RecordState */
+ unsigned long sd_unq_type_args; /* for SimpleState with STATE_UNIQUE_TYPE_ARGUMENTS_MASK */
+ } state_descr;
+ short state_arity;
+ unsigned char state_kind:4; /* StateKind, for SimpleState */
+ unsigned char state_mark:4;
+ unsigned char state_object:6; /* ObjectKind, for SimpleState */
+ unsigned char state_type:2; /* StateType */
+};
+
+#define state_unq_type_args state_descr.sd_unq_type_args
+
+#define STATE_UNIQUE_TYPE_ARGUMENTS_MASK 8
+
+# define state_record_symbol state_descr.sd_rs->rs_symb
+# define state_record_arguments state_descr.sd_rs->rs_args
+# define state_record_desc state_descr.sd_rs
+# define state_tuple_arguments state_descr.sd_args
+# define state_array_arguments state_descr.sd_args
+#endif
+
+typedef struct state *States;
+
+#define STATE_PARALLEL_MASK 1
+#define STATE_UNBOXED_ARRAY_MASK 2 /* for ArrayState */
+#define STATE_ELEMENTS_UPDATEABLE_MASK 2 /* for TupleState */
+#define STATE_UNIQUE_MASK 4
+
+typedef struct record_state_descr {
+ struct symbol_def * rs_symb;
+ StateS rs_args[1];
+} *RecordStateDescr;
+
+typedef enum {
+ SymbolIdTable, TypeSymbolIdTable, TypeVarIdTable, ModuleIdTable, FieldIdTable, KeyWordTable, InternalIdTable
+} TableKind;
+
+typedef union symb_value {
+ struct ident * val_ident;
+ struct symbol_def * val_def;
+ char * val_int;
+ Bool val_bool;
+ char * val_char;
+ char * val_string;
+ char * val_real;
+ char * val_error_mess;
+ int val_arity;
+ struct symbol_type * val_type; /* for cons_symb, nil_symb apply_symbol ? */
+ struct symbol * val_symb; /* for field_symbol_list */
+ struct overloaded_instance * val_instance;
+} SymbValue;
+
+STRUCT (symbol,Symbol) {
+ SymbValue symb_val;
+ Symbol symb_next;
+ unsigned symb_kind:8; /* SymbKind */
+ Bool symb_infix:1;
+ unsigned symb_infix_priority:4;
+ unsigned symb_infix_assoc:2; /* Assoc */
+};
+
+#define symb_ident symb_val.val_ident
+#define symb_def symb_val.val_def
+#define symb_int symb_val.val_int
+#define symb_bool symb_val.val_bool
+#define symb_char symb_val.val_char
+#define symb_string symb_val.val_string
+#define symb_real symb_val.val_real
+#define symb_arity symb_val.val_arity
+#define symb_type symb_val.val_type
+#define symb_arrfun symb_val.val_arrfun
+#define symb_symb symb_val.val_symb
+#define symb_instance symb_val.val_instance
+
+#define symb_member symb_val.val_member
+#define symb_error_mess symb_val.val_error_mess
+
+STRUCT(ident,Ident){
+ char * ident_name;
+ char * ident_environ;
+ union{
+ Symbol ident_u1_symbol;
+ struct node_id * ident_u1_nodeid;
+ struct type_var * ident_u1_tv;
+ struct uni_var * ident_u1_uni_var;
+ char * ident_u1_instructions;
+ } ident_union1;
+
+#ifdef SHORT_CLASS_NAMES
+ union{
+ struct local_def * ident_u2_local_defs;
+ struct module_info * ident_u2_mod_info;
+ } ident_union2;
+#else
+ struct local_def * ident_local_defs;
+#endif
+
+ struct ident * ident_next;
+ unsigned char ident_table; /* TableKind */
+ unsigned char ident_mark;
+};
+
+#define ident_symbol ident_union1.ident_u1_symbol
+#define ident_nodeid ident_union1.ident_u1_nodeid
+#define ident_tv ident_union1.ident_u1_tv
+#define ident_uni_var ident_union1.ident_u1_uni_var
+#define ident_instructions ident_union1.ident_u1_instructions
+
+#ifdef SHORT_CLASS_NAMES
+#define ident_local_defs ident_union2.ident_u2_local_defs
+#define ident_mod_info ident_union2.ident_u2_mod_info
+#endif
+
+#define IMPORT_MASK 1
+#define IMPORTED_MASK 2
+#define BOUND_MASK 4
+#define INLINE_MASK 8
+#define IMPLICITLY_IMPORTED_MASK 16
+#define ID_UNIVAR_MASK (1 << 5)
+#define ID_TYPEVAR_MASK (1 << 6)
+#define ID_CLASSVAR_MASK (1 << 7)
+
+/*
+ The order in which the annotationkinds appear in the enum type
+ determines their priority
+*/
+
+typedef enum {
+ NoAnnot, StrictAnnot,
+ /* parallel annotations: */
+ ContinueAnnot, ParallelAnnot,
+ LazyParallelAnnot, InterleavedAnnot, LazyInterleavedAnnot,
+ ProcessAnnot,ParallelAtAnnot, DeferAnnot, ContInterleavedAnnot, WaitAnnot,
+ ParallelNFAnnot, InterleavedNFAnnot
+} Annotation;
+
+typedef enum { AssocNone=0, AssocLeft=1, AssocRight=2 } Assoc;
+
+typedef struct ident_string *IdentStringP;
+
+struct ident_string {
+ IdentStringP left;
+ IdentStringP right;
+ Ident ident;
+ char *string;
+};
+
+typedef struct symb_list SymbElem,*SymbList;
+
+struct symb_list {
+ IdentStringP slist_ident_string;
+ SymbList slist_next;
+ unsigned slist_line;
+};
+
+typedef struct def_repr DefRepr,*DefMod;
+
+typedef struct import_list ImportElem,*ImportList;
+
+struct import_list {
+ Symbol ilist_module;
+ Bool ilist_all;
+ unsigned ilist_line;
+ SymbList ilist_symbs;
+ DefMod ilist_def;
+ ImportList ilist_next;
+};
+
+typedef struct node_def *NodeDefs;
+
+typedef struct {
+ short index_a;
+ short index_b;
+} Index;
+
+struct _exp;
+
+#if D
+
+extern void error (void);
+
+#define UNION_FIELD(type,field,field_i,field_n)\
+ inline type const &field (void){ return field_i!=field_n ? error(),_##field : _##field; };\
+ inline type &field##_ (void){ field_i=field_n; return _##field; }
+
+#define UNION2(i,t1,f1,t2,f2)\
+ union {\
+ t1 _##f1;\
+ t2 _##f2;\
+ };\
+ UNION_FIELD(t1,f1,i,1);\
+ UNION_FIELD(t2,f2,i,2)
+
+#define UNION4(i,t1,f1,t2,f2,t3,f3,t4,f4)\
+ union {\
+ t1 _##f1;\
+ t2 _##f2;\
+ t3 _##f3;\
+ t4 _##f4;\
+ };\
+ UNION_FIELD(t1,f1,i,1);\
+ UNION_FIELD(t2,f2,i,2);\
+ UNION_FIELD(t3,f3,i,3);\
+ UNION_FIELD(t4,f4,i,4)
+
+STRUCT (node_id,NodeId){
+private:
+ unsigned int nid_u1:4;
+ unsigned int nid_u2:4;
+ unsigned int nid_u3:4;
+ unsigned int nid_u4:4;
+ unsigned int nid_u5:4;
+public:
+ node_id (void) {
+ nid_u1=0;
+ nid_u2=0;
+ nid_u3=0;
+ nid_u4=0;
+ nid_u5=0;
+ };
+
+ Ident nid_ident;
+ unsigned short nid_mark;
+ unsigned short nid_mark2;
+ int nid_refcount;
+ int nid_number;
+
+ UNION4 (nid_u1,
+ struct node_id * ,nid_forward_node_id,
+ struct type_cell * ,nid_type,
+ Index ,nid_index,
+ struct node_id_ref_count_list * ,nid_node_id_ref_count_element /* pattern_match: graph */
+ );
+ #define nid_forward_node_id nid_forward_node_id()
+ #define nid_forward_node_id_ nid_forward_node_id_()
+ #define nid_type nid_type()
+ #define nid_type_ nid_type_()
+ #define nid_index nid_index()
+ #define nid_index_ nid_index_()
+ #define nid_node_id_ref_count_element nid_node_id_ref_count_element()
+ #define nid_node_id_ref_count_element_ nid_node_id_ref_count_element_()
+
+ union {
+ struct {
+ union {
+ struct node * s1_subst_node;
+ struct node_id * s1_subst_node_id;
+ struct reference_info * s1_ref_info;
+ };
+ int s1_ref_count_copy;
+ } nid_s1;
+ StateS _nid_state;
+ };
+
+ inline struct node *const &nid_subst_node (void){ return nid_u4!=1 ? error(),nid_s1.s1_subst_node : nid_s1.s1_subst_node; };
+ inline struct node * &nid_subst_node_ (void){ nid_u4=1; return nid_s1.s1_subst_node; }
+ #define nid_subst_node nid_subst_node()
+ #define nid_subst_node_ nid_subst_node_()
+
+ inline struct node_id *const &nid_subst_node_id (void){ return (nid_u4!=2 || nid_u5!=1) ? error(),nid_s1.s1_subst_node_id : nid_s1.s1_subst_node_id; };
+ inline struct node_id * &nid_subst_node_id_ (void){ nid_u4=2; return nid_s1.s1_subst_node_id; }
+ #define nid_subst_node_id nid_subst_node_id()
+ #define nid_subst_node_id_ nid_subst_node_id_()
+
+ inline struct reference_info *const &nid_ref_info (void){ return (nid_u4!=3 || nid_u5!=1) ? error(),nid_s1.s1_ref_info : nid_s1.s1_ref_info; };
+ inline struct reference_info * &nid_ref_info_ (void){ nid_u4=3; return nid_s1.s1_ref_info; }
+ #define nid_reference_info nid_ref_info()
+ #define nid_reference_info_ nid_ref_info_()
+
+ inline int const &nid_ref_count_copy (void){ return nid_u5!=1 ? error(),nid_s1.s1_ref_count_copy : nid_s1.s1_ref_count_copy; };
+ inline int &nid_ref_count_copy_ (void){ nid_u5=1; return nid_s1.s1_ref_count_copy; }
+ inline int &nid_ref_count_copy__ (void){ return nid_u5!=1 ? error(),nid_s1.s1_ref_count_copy : nid_s1.s1_ref_count_copy; };
+ #define nid_ref_count_copy nid_ref_count_copy()
+ #define nid_ref_count_copy_ nid_ref_count_copy_()
+ #define nid_ref_count_copy__ nid_ref_count_copy__()
+
+ inline StateS const &nid_state (void){ return (nid_u4!=4 || nid_u5!=2) ? error(),_nid_state : _nid_state; };
+ inline StateS &nid_state_ (void){ nid_u4=4; nid_u5=2; return _nid_state; }
+ inline StateS &nid_state__ (void){ return (nid_u4!=4 || nid_u5!=2) ? error(),_nid_state : _nid_state; };
+ #define nid_state nid_state()
+ #define nid_state_ nid_state_()
+ #define nid_state__ nid_state__()
+
+ int nid_scope;
+ struct node * nid_node;
+
+ UNION2(nid_u2,
+ struct _exp * ,nid_exp,
+ struct node_id* ,nid_lhs_tuple_node_id
+ );
+ #define nid_exp nid_exp()
+ #define nid_exp_ nid_exp_()
+ #define nid_lhs_tuple_node_id nid_lhs_tuple_node_id()
+ #define nid_lhs_tuple_node_id_ nid_lhs_tuple_node_id_()
+
+ UNION2(nid_u3,
+ NodeDefs ,nid_node_def, /* only for rhs */
+ struct state * ,nid_lhs_state_p /* only for lhs */
+ );
+ #define nid_node_def nid_node_def()
+ #define nid_node_def_ nid_node_def_()
+ #define nid_lhs_state_p nid_lhs_state_p()
+ #define nid_lhs_state_p_ nid_lhs_state_p_()
+};
+
+#define nid_a_index nid_index.index_a /* codegen2,instructions */
+#define nid_a_index_ nid_index_.index_a /* codegen2,instructions */
+#define nid_b_index nid_index.index_b /* codegen2,instructions */
+#define nid_b_index_ nid_index_.index_b /* codegen2,instructions */
+
+#else
+
+STRUCT (node_id,NodeId){
+ Ident nid_ident;
+ unsigned short nid_mark;
+ unsigned short nid_mark2;
+ int nid_refcount;
+ int nid_number;
+ union {
+ struct node_id * inf2_forward_node_id;
+ struct type_cell * inf2_type;
+ Index inf2_index;
+ int inf2_lazy_selector_ref_count;
+ } nid_inf2;
+ union {
+ struct {
+ union {
+ struct node * u1_subst_node;
+ struct node_id * u1_subst_node_id;
+ struct reference_info * u1_ref_info;
+/* NodeDefs u1_nodedef; */
+ } s_u1;
+ int s_ref_count_copy;
+ } inf1_s;
+ StateS inf1_state;
+ } nid_inf1;
+ int nid_scope;
+ struct node * nid_node;
+ union {
+ struct _exp * u3_exp;
+ struct node_id* u3_lhs_tuple_node_id;
+ struct node_id_ref_count_list * u3_ref_count_element; /* pattern_match: graph */
+ } nid_u3;
+ union {
+ NodeDefs u4_node_def; /* only for rhs */
+ struct state * u4_lhs_state_p; /* only for lhs */
+ } nid_u4;
+};
+
+#define nid_subst_node nid_inf1.inf1_s.s_u1.u1_subst_node /* macros */
+#define nid_subst_node_id nid_inf1.inf1_s.s_u1.u1_subst_node_id /* macros */
+#define nid_reference_info nid_inf1.inf1_s.s_u1.u1_ref_info /* refcountanal */
+/* #define nid_node_def nid_inf1.inf1_s.s_u1.u1_nodedef ** buildtree,sa,statesgen,optimisations */
+#define nid_ref_count_copy nid_inf1.inf1_s.s_ref_count_copy /* statesgen */
+#define nid_state nid_inf1.inf1_state /* codegen2,instructions */
+
+#define nid_type nid_inf2.inf2_type /* comparser,typechecker */
+#define nid_forward_node_id nid_inf2.inf2_forward_node_id /* checker,transform */
+#define nid_node_id_ref_count_element nid_u3.u3_ref_count_element /* pattern_match */
+#define nid_node_id_ref_count_element_ nid_u3.u3_ref_count_element /* pattern_match */
+#define nid_a_index nid_inf2.inf2_index.index_a /* codegen2,instructions */
+#define nid_b_index nid_inf2.inf2_index.index_b /* codegen2,instructions */
+
+#define nid_lazy_selector_ref_count nid_inf2.inf2_lazy_selector_ref_count/* statesgen */
+
+#define nid_type_ nid_inf2.inf2_type /* comparser,typechecker */
+#define nid_forward_node_id_ nid_inf2.inf2_forward_node_id /* checker,transform */
+#define nid_a_index_ nid_inf2.inf2_index.index_a /* codegen2,instructions */
+#define nid_b_index_ nid_inf2.inf2_index.index_b /* codegen2,instructions */
+
+#define nid_exp nid_u3.u3_exp /* sa */
+#define nid_lhs_tuple_node_id nid_u3.u3_lhs_tuple_node_id
+
+#define nid_node_def nid_u4.u4_node_def /* buildtree,sa,statesgen,optimisations */
+#define nid_lhs_state_p nid_u4.u4_lhs_state_p
+
+#define nid_ref_count_copy_ nid_ref_count_copy
+#define nid_ref_count_copy__ nid_ref_count_copy
+#define nid_node_def_ nid_node_def
+#define nid_state_ nid_state
+#define nid_state__ nid_state
+#define nid_lhs_tuple_node_id_ nid_lhs_tuple_node_id
+#define nid_subst_node_ nid_subst_node
+#define nid_subst_node_id_ nid_subst_node_id
+#define nid_exp_ nid_exp
+#define nid_lhs_state_p_ nid_lhs_state_p
+#define nid_reference_info_ nid_reference_info
+#endif
+
+/* Masks for nid_mark */
+
+#define SHARED_NODES_COLLECTED_MASK 1
+#define NID_ALIAS_MASK 2
+#define NID_ALIAS_MARK_MASK 4
+#define NID_COUNTED_AND_USED_IN_INNER_SCOPE 8
+#define NID_EXTRA_REFCOUNT_MASK 16
+#define COPY_NODE_MASK 64
+#define ON_A_CYCLE_MASK 128
+#define NID_VERIFY_MASK 256 /* macros */
+#define NID_THEN_ELSE_NON_LOCAL_NODE_ID 512 /* pattern_match */
+
+#define NID_TYPE_CHECKED_MASK 1024 /* typechecker */
+#define NID_TYPE_ATTRIBUTED_MASK 2048 /* typechecker */
+#define NID_EXTRA_REFCOUNT_SUBTRACTED_MASK 4096 /* checker */
+
+#define NID_STRICT_LHS_TUPLE_ELEMENT_MASK 8192 /* codegen1,codegen2 */
+#define NID_SHARED_SELECTION_NODE_ID 16384
+#define NID_LIFTED_BY_OPTIMISE 32768 /* optimisations */
+
+/* Masks for nid_mark2 */
+
+#define NID_HAS_REF_COUNT_INFO_MASK (1 << 0) /* refcountanal */
+#define NID_DETERMINE_REF_COUNT_MASK (1 << 1) /* refcountanal */
+#define NID_REF_COUNT_DETERMINED_MASK (1 << 2) /* refcountanal */
+#define NID_LHS_ROOT_ID (1 << 3) /* refcountanal */
+#define NID_READ_ONLY_ID (1 << 4) /* typechecker */
+#define NID_FIELD_NAME_MASK (1 << 5) /* typechecker */
+
+#define NID_COMPONENT_DETERMINED_MASK 256 /* optimise_lambda */
+#define NID_LIFTED_CONSTANT_CHECKED_MASK 512 /* checker */
+#define NID_LIFTED_MASK 1024 /* checker */
+#define NID_REFERENCE_NOT_COUNTED_MASK 2048 /* checker */
+#define NID_LHS_PUSHED 4096 /* codegen1 */
+
+#define NID_HAS_LAZY_SELECTOR_COUNTER 8192 /* statesgen */
+#define NID_CALL_VIA_LAZY_SELECTIONS_ONLY 16384 /* statesgen */
+#define NID_HAS_REFCOUNT_WITHOUT_UPDATES 32768
+
+typedef struct imp_rule *ImpRules;
+typedef struct rule_type *RuleTypes;
+
+STRUCT (strict_node_id,StrictNodeId){
+ union {
+ NodeId val_node_id; /* if snid_kind==0 */
+ Ident val_ident; /* if snid_kind==1 */
+ } snid_val;
+ struct strict_node_id * snid_next;
+ unsigned snid_mark:8;
+#ifdef OBSERVE_ARRAY_SELECTS_IN_PATTERN
+ unsigned snid_array_select_in_pattern:1;
+#endif
+};
+
+#define STRICT_NODE_ID_IDENT_MASK 1
+#define STRICT_NODE_ID_OBSERVE_MASK 2
+
+#define snid_node_id snid_val.val_node_id
+#define snid_ident snid_val.val_ident
+
+STRUCT (if_node_contents,IfNodeContents){
+ NodeDefs if_then_node_defs;
+ ImpRules if_then_rules;
+ union {
+ StrictNodeIdP u_strict_node_ids;
+ struct poly_list * u_observer_list;
+ struct node_id_ref_count_list * u_node_id_ref_counts;
+ } if_then_u;
+ NodeDefs if_else_node_defs;
+ ImpRules if_else_rules;
+ union {
+ StrictNodeIdP u_strict_node_ids;
+ struct poly_list * u_observer_list;
+ struct node_id_ref_count_list * u_node_id_ref_counts;
+ } if_else_u;
+ int if_local_scope;
+};
+
+#define if_then_strict_node_ids if_then_u.u_strict_node_ids
+#define if_else_strict_node_ids if_else_u.u_strict_node_ids
+#define if_then_observer_list if_then_u.u_observer_list
+#define if_else_observer_list if_else_u.u_observer_list
+#define node_then_node_id_ref_counts node_contents.contents_if->if_then_u.u_node_id_ref_counts
+#define node_else_node_id_ref_counts node_contents.contents_if->if_else_u.u_node_id_ref_counts
+
+typedef enum {
+ IfNode, NormalNode, SelectorNode, NodeIdNode, UpdateNode, MatchNode, /* normal nodes */
+ RecordNode, IdentNode, ApplyNode, PrefixNode, ScopeNode, /* nodes in parser and checker */
+ IndirectionNode, /* nodes in optimise_lambda */
+ OverloadedNode, RecursionNode, UpdateNodeInTC, /* nodes in typechecker */
+ SwitchNode, CaseNode, DefaultNode, PushNode, GuardNode, TupleSelectorsNode, FillUniqueNode /* nodes in codegen */
+} NodeKind;
+
+#ifdef THINK_C
+#define DNodeKind(v) ( \
+ v==IfNode?"IfNode": \
+ v==NormalNode?"NormalNode": \
+ v==SelectorNode?"SelectorNode": \
+ v==NodeIdNode?"NodeIdNode": \
+ v==RecordNode?"RecordNode": \
+ v==UpdateNode?"UpdateNode": \
+ v==IdentNode?"IdentNode": \
+ v==ApplyNode?"ApplyNode": \
+ v==PrefixNode?"PrefixNode" \
+ :"")
+#endif
+
+#define SELECTOR_U 2
+#define SELECTOR_F 3
+#define SELECTOR_L 4
+#define SELECTOR_N 5
+
+#ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS
+STRUCT (case_node_contents,CaseNodeContents){
+ struct node_id_ref_count_list * case_node_id_ref_counts;
+ StrictNodeIdP case_strict_node_ids;
+};
+#endif
+
+STRUCT (node,Node){
+ union {
+ struct if_node_contents * contents_if;
+ Symbol contents_symbol;
+ NodeId contents_node_id;
+ Ident contents_ident;
+ struct node * contents_node;
+ struct node_id_list_element *contents_node_ids;
+#ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS
+ StrictNodeIdP contents_guard_strict_node_ids;
+#endif
+ } node_contents;
+
+ struct arg * node_arguments;
+
+ union {
+ StateS su_state;
+ struct {
+ union {
+ Symbol u_record_symbol; /* comparser,checker */
+ struct symbol_type * u_type_info; /* typechecker */
+ struct recursive_call * u_recursive_call; /* typechecker */
+ struct overloaded_function *u_overloaded_application; /* typechecker */
+ } s_u;
+ int s_line; /* size for PushNode */
+ } su_s;
+ struct {
+ struct node_def * u_node_defs; /* for CaseNode,DefaultNode and GuardNode */
+#ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS
+ struct case_node_contents * u_case;
+#else
+ struct node_id_ref_count_list * u_node_id_ref_counts;
+#endif
+ } su_u;
+ struct {
+ struct node_def * scope_node_defs;
+ struct imp_rule * scope_imp_rules;
+ } su_scope; /* for ScopeNode */
+ } node_su;
+
+ short node_arity;
+ unsigned char node_kind; /* NodeKind */
+ signed char node_number:2; /* statesgen: -1,0 or 1,pattern_match ? */
+ Annotation node_annotation:6;
+};
+
+#ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS
+# define node_node_id_ref_counts node_su.su_u.u_case->case_node_id_ref_counts
+# define node_strict_node_ids node_su.su_u.u_case->case_strict_node_ids
+#else
+# define node_node_id_ref_counts node_su.su_u.u_node_id_ref_counts
+#endif
+
+#define node_state node_su.su_state
+#define node_record_symbol node_su.su_s.s_u.u_record_symbol
+#define node_type node_su.su_s.s_u.u_type_info
+#define node_recursive_call node_su.su_s.s_u.u_recursive_call
+#define node_overloaded_application node_su.su_s.s_u.u_overloaded_application
+#define node_line node_su.su_s.s_line
+#define node_node_defs node_su.su_u.u_node_defs
+#define node_symbol node_contents.contents_symbol
+#define node_node_id node_contents.contents_node_id
+#define node_ident node_contents.contents_ident
+#define node_node node_contents.contents_node
+#define node_node_ids node_contents.contents_node_ids
+
+#ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS
+#define node_guard_strict_node_ids node_contents.contents_guard_strict_node_ids
+#endif
+
+#define node_then_node_defs node_contents.contents_if->if_then_node_defs
+#define node_then_rules node_contents.contents_if->if_then_rules
+#define node_then_strict_node_ids node_contents.contents_if->if_then_strict_node_ids
+#define node_else_node_defs node_contents.contents_if->if_else_node_defs
+#define node_else_rules node_contents.contents_if->if_else_rules
+#define node_else_strict_node_ids node_contents.contents_if->if_else_strict_node_ids
+#define node_if_scope node_contents.contents_if->if_local_scope
+
+#define node_scope_node_defs node_su.su_scope.scope_node_defs
+#define node_scope_imp_rules node_su.su_scope.scope_imp_rules
+
+#define node_then_observer_list node_contents.contents_if->if_then_observer_list
+#define node_else_observer_list node_contents.contents_if->if_else_observer_list
+
+STRUCT (arg,Arg){
+ Node arg_node;
+ struct arg * arg_next;
+ union {
+ StateS u_state;
+ unsigned long u_occurrence; /* OccurrenceKind */
+ } arg_u;
+};
+typedef struct arg *Args;
+
+#define arg_state arg_u.u_state
+#define arg_occurrence arg_u.u_occurrence
+
+STRUCT (node_def,NodeDef){
+ union {
+ NodeId u1_id;
+ Node u1_pattern;
+ } def_u1;
+ Node def_node;
+ NodeDefs def_next;
+ int def_mark;
+};
+
+#define def_id def_u1.u1_id
+#define def_pattern def_u1.u1_pattern
+
+#define NODE_DEF_HAS_LHS_PATTERN_MASK 1
+#define NODE_DEF_NEW_SCOPE_MASK 2
+#define NODE_DEF_NORMAL_SCOPE_MASK 4
+#define NODE_DEF_MARKED 8
+#define NODE_DEF_OBSERVE_MASK 16
+#define NODE_DEF_SELECT_AND_REMOVE_MASK 32
+
+typedef struct local_def {
+ union {
+ NodeId contents_node_id; /* ldef_node_id, if ldef_kind==0 */
+ Symbol contents_symbol; /* ldef_symbol, if ldef_kind==1 */
+ } ldef_contents;
+ struct local_def * ldef_next;
+ int ldef_scope;
+ char ldef_kind;
+ char ldef_lifted;
+} LocalDef,*LocalDefP;
+
+#define ldef_node_id ldef_contents.contents_node_id
+#define ldef_symbol ldef_contents.contents_symbol
+
+/* for implementing calls to C or the OS */
+
+typedef struct parameter Parameter,*Parameters;
+
+struct parameter {
+ union {
+ NodeId val_node_id; /* if par_kind == 0 */
+ Ident val_ident; /* if par_kind == 1 */
+ } par_val;
+ Ident par_loc;
+ Parameters par_next;
+ int par_kind;
+};
+
+#define par_node_id par_val.val_node_id
+#define par_ident par_val.val_ident
+
+typedef struct instruction Instruction,*Instructions;
+
+struct instruction {
+ char * instr_this;
+ Instructions instr_next;
+};
+
+STRUCT (code_block,CodeBlock){
+ Parameters co_parin;
+ Parameters co_parout;
+ Instructions co_instr;
+ Bool co_is_abc_code;
+#ifdef CLEAN2
+ Bool co_is_inline;
+#endif
+};
+
+typedef enum {
+ Contractum, ExternalCall
+} RhsKind;
+
+typedef struct rule_alt *RuleAlts;
+
+STRUCT (rule_alt,RuleAlt){
+ Node alt_lhs_root;
+ NodeDefs alt_lhs_defs;
+ union {
+ Node rhs_root;
+ CodeBlock rhs_code;
+ } alt_rhs;
+ NodeDefs alt_rhs_defs;
+ union {
+ StrictNodeIdP u_alt_strict_node_ids;
+ struct poly_list * u_alt_observer_list;
+ } alt_u;
+ struct lifted_node_id * alt_lifted_node_ids;
+ ImpRules alt_local_imp_rules;
+ RuleAlts alt_next;
+ unsigned alt_line;
+ BITVECT alt_used_arguments;
+#ifdef OS2
+ unsigned alt_kind:4; /* RhsKind */
+#else
+ unsigned alt_kind:3; /* RhsKind */
+#endif
+ Bool alt_write_access:1;
+ Bool alt_may_fail:1;
+};
+
+#define alt_rhs_root alt_rhs.rhs_root
+#define alt_rhs_code alt_rhs.rhs_code
+#define alt_strict_node_ids alt_u.u_alt_strict_node_ids
+#define alt_observer_list alt_u.u_alt_observer_list
+
+typedef struct macro Macro,*Macros;
+
+struct macro {
+ RuleAlts macro_rule;
+ Node macro_root;
+ unsigned macro_line;
+ Macros macro_next;
+};
+
+typedef enum {
+ NEWDEFINITION, ABSTYPE, TYPE, TYPESYN, DEFRULE, IMPRULE,
+ CONSTRUCTOR, SYSRULE, MACRORULE,
+ RECORDTYPE, FIELDSELECTOR,
+ OVERLOADEDRULE,
+ INSTANCE, CLASS, CLASSINSTANCE, CLASSLIST
+} SDefKind;
+
+#define SDefKindSize 5
+#define DERIVEDRULE 16
+
+typedef enum {
+ Indefinite, CurrentlyChecked, TypeChecked,
+ Predefined, Expanded, TotallyExpanded,
+ ConvertingToState, ConvertedToState
+} CheckStatus;
+
+typedef enum {
+ CreateArrayFun, ArraySelectFun, UnqArraySelectFun, ArrayUpdateFun,
+ ArrayReplaceFun, ArraySizeFun, UnqArraySizeFun,
+ _CreateArrayFun,_UnqArraySelectFun,_UnqArraySelectNextFun,_UnqArraySelectLastFun,
+ _ArrayUpdateFun,
+ NoArrayFun
+} ArrayFunKind;
+
+#define ArrayFunKindBitSize 4
+
+#include "syntax_tree_types.h"
+
+STRUCT (imp_rule,ImpRule){
+ NodeP rule_root;
+ RuleAlts rule_alts;
+ struct type_alt * rule_type;
+ StateP rule_state_p;
+ ImpRules rule_next;
+ union {
+ struct depend_function *u_depend_functions;
+ ImpRuleP u_next_changed_function;
+ ImpRuleP u_next_used_function;
+ ImpRuleP u_next_function_with_more_arguments;
+ } rule_u;
+ struct node * rule_lazy_call_node;
+#if STORE_STRICT_CALL_NODES
+ struct node * rule_strict_call_node;
+ struct node * rule_strict_call_node2;
+#endif
+ unsigned rule_line;
+ unsigned rule_mark;
+ unsigned rule_ref_count;
+};
+
+#define RULE_CHECKED_MASK 1
+#define RULE_CAF_MASK 2
+#define RULE_LAZY_CALL_NODE_MASK 4
+#if STORE_STRICT_CALL_NODES
+# define RULE_STRICT_CALL_NODE_MASK 8
+# define RULE_STRICT_CALL_NODE2_MASK 16
+#endif
+#define RULE_HAS_VERSION_WITH_MORE_ARGUMENTS 32
+#define RULE_UNBOXED_LAZY_CALL 64
+#define RULE_INTERNAL_FUNCTION_MASK 128
+#define RULE_LAMBDA_FUNCTION_MASK 256
+#define RULE_HAS_REF_COUNT_MASK 512
+
+#define RULE_CALL_VIA_LAZY_SELECTIONS_ONLY 1024
+
+#define rule_depend_functions rule_u.u_depend_functions /* comparser,checker,macros */
+#define rule_next_changed_function rule_u.u_next_changed_function /* optimisations */
+#define rule_next_used_function rule_u.u_next_used_function /* optimisations */
+#define rule_next_function_with_more_arguments rule_u.u_next_function_with_more_arguments /* statesgen */
+
+STRUCT (symbol_def,SymbDef){
+ char *sdef_module;
+ Ident sdef_ident;
+ union
+ { Types u_type;
+ RuleTypes u_rule_type;
+ SynTypes u_syn_type;
+ AbsTypes u_abs_type;
+ ImpRules u_rule;
+ Macros u_macro;
+ Overloaded u_overloaded;
+ Instance u_instance;
+ ClassDefinition u_class;
+ ClassInstance u_class_instance;
+ SymbolList u_class_symb_list;
+ } sdef_u;
+ union
+ { struct symbol_type_info * sti_rule_type_info;
+ struct symbol_type * sti_type_cons_info;
+ unsigned long sti_class_instance_info;
+ StateS typeinfo_record_state;
+ struct
+ { FieldList fieldinfo_sel_field;
+ Node fieldinfo_sel_node;
+ int fieldinfo_sel_field_number;
+ } sdef_fieldinfo;
+ struct constructor_list * typeinfo_constructor; /* for CONSTRUCTOR */
+ } sdef_typeinfo;
+
+ unsigned sdef_number;
+ unsigned sdef_ancestor;
+ short sdef_arity;
+ short sdef_cons_arity;
+ short sdef_over_arity;
+ unsigned short sdef_nr_of_lifted_nodeids;
+
+ union {
+ struct _fun * u3_sa_fun; /* sa.c */
+ unsigned u3_instantiation_depth;
+ } sdef_u3;
+
+ struct symbol_def * sdef_dcl_icl; /* to dcl if sdef_exported, to icl if sdef_main_dcl */
+
+ union {
+ struct symbol_def * u1_next_scc;
+ Symbol u1_subst_symbol;
+ } sdef_u1;
+
+ union {
+ struct symbol_def * sdef_u2_parent;
+ struct member_item * sdef_u2_class_members;
+/* struct symbol_def * sdef_u2_aliases; */
+ struct type_cons_repr * sdef_u2_type_cons_repr;
+ struct symbol_def * sdef_u2_next_version; /* for IMPRULES */
+ } sdef_u2;
+
+ unsigned sdef_line;
+ int sdef_mark;
+
+ Bool sdef_isused:1;
+ Bool sdef_is_local_function:1;
+
+ Bool sdef_is_instantiated:1;
+
+ Bool sdef_no_sa:1;
+ Bool sdef_explicitly_imported:1;
+ Bool sdef_has_aliases:1;
+
+ Bool sdef_attributed:1;
+ Bool sdef_returnsnode:1;
+ Bool sdef_calledwithrootnode:1;
+
+ Bool sdef_has_inftype:1;
+ Bool sdef_typable:1;
+ Bool sdef_contains_freevars:1;
+ Bool sdef_noncoercible:1;
+ Bool sdef_unq_attributed:1;
+ Bool sdef_is_cyclic:1;
+ Bool sdef_is_redirection:1;
+ Bool sdef_is_observing:1;
+ Bool sdef_is_hyperstrict:1;
+ Bool sdef_with_uniqueness_variables:1;
+ Bool sdef_current_type_vars_mark:1; /* for TYPESYN */
+ Bool sdef_abstract_type_synonym:1; /* for TYPESYN */
+ Bool sdef_strict_constructor:1; /* for CONSTRUCTOR and RECORDTYPE */
+ Bool sdef_exported:1;
+ Bool sdef_main_dcl:1; /* if in .dcl of main .icl */
+ Bool sdef_first_group_element:1;
+ Bool sdef_infix:1;
+#ifdef OS2
+ int sdef_stupid_gcc;
+ SDefKind sdef_kind:SDefKindSize;
+ unsigned sdef_infix_priority:4;
+ unsigned sdef_checkstatus:4; /* CheckStatus */
+ unsigned sdef_prop_status:4; /* CheckStatus */
+ unsigned sdef_arfun:ArrayFunKindBitSize; /* ArrayFunKind */
+ unsigned sdef_infix_assoc:2; /* Assoc */
+#else
+ unsigned sdef_kind:SDefKindSize;
+ unsigned sdef_infix_priority:4;
+ unsigned sdef_infix_assoc:2; /* Assoc */
+ unsigned sdef_checkstatus:3; /* CheckStatus */
+ unsigned sdef_prop_status:3; /* CheckStatus */
+ unsigned sdef_arfun:ArrayFunKindBitSize; /* ArrayFunKind */
+#endif
+};
+
+#define sdef_type sdef_u.u_type
+#define sdef_rule_type sdef_u.u_rule_type
+#define sdef_syn_type sdef_u.u_syn_type
+#define sdef_abs_type sdef_u.u_abs_type
+#define sdef_rule sdef_u.u_rule
+#define sdef_macro sdef_u.u_macro
+#define sdef_rc sdef_u.u_rc
+#define sdef_overloaded sdef_u.u_overloaded
+#define sdef_instance sdef_u.u_instance
+#define sdef_class_instance sdef_u.u_class_instance
+#define sdef_class_symb_list sdef_u.u_class_symb_list
+
+#define sdef_class sdef_u.u_class
+
+#define sdef_instantiation_depth sdef_u3.u3_instantiation_depth
+#define sdef_sa_fun sdef_u3.u3_sa_fun
+
+#define sdef_next_scc sdef_u1.u1_next_scc
+#define sdef_subst_symbol sdef_u1.u1_subst_symbol /* macros */
+
+#define SDEF_USED_LAZILY_MASK 1
+#define SDEF_USED_STRICTLY_MASK 2
+#define SDEF_USED_CURRIED_MASK 4
+#define SDEF_LOCAL_MACRO_FUNCTION_MASK 8
+#define SDEF_NEXT_IMP_RULE_VERSION_MASK 32
+#define SDEF_HAS_IMP_RULE_VERSIONS_MASK 64
+#define SDEF_OPTIMISED_FUNCTION_MASK 128
+
+/* some macros to reuse bit fields */
+
+#define sdef_group_number sdef_ancestor
+#define sdef_has_instance_info sdef_used_as_instance
+
+#define sdef_parent sdef_u2.sdef_u2_parent
+#define sdef_class_members sdef_u2.sdef_u2_class_members
+#define sdef_aliases sdef_u2.sdef_u2_aliases
+#define sdef_type_cons_repr sdef_u2.sdef_u2_type_cons_repr
+
+#define sdef_next_version sdef_u2.sdef_u2_next_version
+
+#define sdef_constructor sdef_typeinfo.typeinfo_constructor
+
+#define sdef_rule_type_info sdef_typeinfo.sti_rule_type_info
+#define sdef_type_cons_info sdef_typeinfo.sti_type_cons_info
+#define sdef_class_instance_info sdef_typeinfo.sti_class_instance_info
+
+#define sdef_rule_cons_type_info sdef_rc->rc_type_info
+
+#define sdef_rule_cons_imprule sdef_rc->rc_imprule
+#define sdef_rule_cons_defrule sdef_rc->rc_defrule
+
+#define sdef_record_state sdef_typeinfo.typeinfo_record_state
+#define sdef_ar_fun_aps sdef_typeinfo.typeinfo_ar_fun_aps
+#define sdef_sel_field sdef_typeinfo.sdef_fieldinfo.fieldinfo_sel_field
+#define sdef_sel_node sdef_typeinfo.sdef_fieldinfo.fieldinfo_sel_node
+
+#define sdef_sel_field_number sdef_typeinfo.sdef_fieldinfo.fieldinfo_sel_field_number
+
+#if IMPORT_OBJ_AND_LIB
+struct string_list {
+ char * sl_string;
+ struct string_list *sl_next;
+};
+#endif
+
+typedef struct {
+ Symbol im_name;
+ Symbol im_symbols;
+ ImportList im_imports;
+ Types im_types;
+ SynTypes im_syn_types;
+ ImpRules im_rules;
+ Macros im_macros;
+ struct symbol_def * im_start;
+ Bool im_main;
+ DefMod im_def_module;
+ ClassDefinition im_classes;
+ ClassInstance im_instances;
+
+#ifdef SHORT_CLASS_NAMES
+ struct module_info * im_module_info;
+#endif
+#if IMPORT_OBJ_AND_LIB
+ struct string_list * im_imported_objs;
+ struct string_list * im_imported_libs;
+#endif
+#if WRITE_DCL_MODIFICATION_TIME
+ FileTime im_modification_time;
+#endif
+} *ImpMod, ImpRepr;
+
+struct def_repr {
+ Symbol dm_name;
+ Symbol dm_symbols;
+ ImportList dm_imports;
+ ExportList dm_exports;
+ Types dm_types;
+ SynTypes dm_syn_types;
+ AbsTypes dm_abs_types;
+ RuleTypes dm_rules;
+ Macros dm_macros;
+ Bool dm_system_module;
+ ClassDefinition dm_classes;
+ ClassInstance dm_instances;
+
+#ifdef SHORT_CLASS_NAMES
+ struct module_info * dm_module_info;
+#endif
+#if WRITE_DCL_MODIFICATION_TIME
+ FileTime dm_modification_time;
+#endif
+};