/*
#define _DB_
#define _DB_TEST_
*/
/* Debug Options */
#ifdef _DB_
# ifndef _DB_TEST_
# define _DB_TEST_
# endif
# define _DB_RED_
/* # define _DB_EQ_ */
#endif
/* Expressions */
typedef enum {
Bottom, Ind, FunValue, Value, Lub, Top, Argument, Dep
} ExpKind;
typedef struct _exp *Exp;
typedef struct _dependency *Dependency;
typedef struct _dependency {
Exp dep_exp;
Dependency dep_next;
} DependencyRepr;
typedef Exp *ExpP;
typedef struct _exp {
union {
unsigned short u_sym;
struct _fun * u_fun; /* if a value, a function id */
} e_u;
ExpKind e_kind; /* the kind of expression */
unsigned char e_hnf:1, /* set if reduced to hnf */
e_spechnf:1, /* set if reduced in spec context */
e_hasind:1, /* used for indirections */
e_red:1, /* used for reductions */
e_imark:1, /* for marking use with Inds */
e_mark:1, /* for general use */
e_mark2:1; /* not for general use */
Exp *e_args; /* the arguments of the exp */
Exp e_fwd; /* for forwarding pointers */
Dependency e_deps; /* the current dependency list */
#ifdef _DB_
unsigned e_mmark:1, /* used for testing */
e_dmark:1, /* used for dumping */
e_shared:1; /* used for dumping */
unsigned e_add; /* the address of the exp */
#endif /* _DB_ */
} ExpRepr;
#define e_sym e_u.u_sym
#define e_fun e_u.u_fun
typedef enum {
Function, Constructor,
IfFunction, ApFunction, SelFunction,
StrictFunction, FailFunction
} FunKind;
typedef enum {
NotStrict = 0, HnfStrict = 1, SpineStrict = 2, TailStrict = 3
} StrictKind;
typedef struct _strictinfo {
int strict_arity;
union {
StrictKind info_kinds[3];
struct {
StrictKind info_kind;
struct _strictinfo *info_args;
} strict_tuple;
} strict_info;
} StrictInfo;
typedef struct _context *Context;
typedef struct _context {
unsigned context_arity:8,
context_kind:2,
context_speculative:1;
Context * context_args;
} ContextRepr;
#define IsStrictContext(C) ((C)->context_kind != NotStrict)
#define IsSpeculativeContext(C) ((C)->context_speculative)
#define IsTupleInfo(A) ((A)->strict_arity != 1)
#define GetTupleStrictKind(A) ((A)->strict_info.strict_tuple.info_kind)
#define GetTupleInfos(A) ((A)->strict_info.strict_tuple.info_args)
#define GetTupleInfo(A,B) ((A)->strict_info.strict_tuple.info_args[B])
#define GetStrictKinds(A) ((A)->strict_info.info_kinds)
#define GetStrictKind(A,B) ((A)->strict_info.info_kinds[B])
#define InitStrictInfo(A,B) ((A)->strict_info.info_kinds[0] = \
(A)->strict_info.info_kinds[1] = \
(A)->strict_info.info_kinds[2] = (B))
#define ContextToIndex(A) ((A) == NotStrict ? 0 : (A) - 1)
typedef struct _alts *Alts;
typedef struct _alts {
Exp fun_lhs;
Exp fun_rhs;
#ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS
Alts fun_switch_alts;
#endif
Alts fun_next;
Bool fun_has_fail;
#ifdef TRANSFORM_PATTERNS_BEFORE_STRICTNESS_ANALYSIS
Bool fun_is_guard; /* if fun_switch_alts!=NULL */
#endif
} AltsRepr;
typedef struct _fun {
SymbDef fun_symbol;
StrictInfo* fun_strictargs;
Alts fun_alts;
StrictInfo fun_strictresult;
unsigned short fun_arity;
unsigned short fun_single:1; /* TRUE if pattern matching on symbol always succeeds */
FunKind fun_kind;
} Fun;
/* paths used in less-then operator */
typedef struct _apath *APath;
typedef struct _apath {
Exp ap_e1;
Exp ap_e2;
APath ap_next;
} APathRepr;
/* paths used during reduction */
typedef struct _path *Path;
typedef struct _path {
Exp p_exp;
Exp p_root;
Path p_next;
} PathRepr;
/* abstract matching results */
typedef enum {
NoMatch, InfiniteMatch, PartialMatch, PartialInfiniteMatch,
TotalMatch, LubMatch, ReduceMatch
} MatchKind;