/* $Id$ */ #define MAX_ARITY 2 typedef int ItemSetNum; typedef int OperatorNum; typedef int NonTerminalNum; typedef int RuleNum; typedef int ArityNum; typedef int ERuleNum; extern NonTerminalNum last_user_nonterminal; extern NonTerminalNum max_nonterminal; extern RuleNum max_rule; extern ERuleNum max_erule_num; extern int max_arity; #ifdef __STDC__ #define ARGS(x) x #else #define ARGS(x) () #endif #ifndef NOLEX #define DELTAWIDTH 4 typedef short DeltaCost[DELTAWIDTH]; typedef short *DeltaPtr; extern void ASSIGNCOST ARGS((DeltaPtr, DeltaPtr)); extern void ADDCOST ARGS((DeltaPtr, DeltaPtr)); extern void MINUSCOST ARGS((DeltaPtr, DeltaPtr)); extern void ZEROCOST ARGS((DeltaPtr)); extern int LESSCOST ARGS((DeltaPtr, DeltaPtr)); extern int EQUALCOST ARGS((DeltaPtr, DeltaPtr)); #define PRINCIPLECOST(x) (x[0]) #else #define DELTAWIDTH 1 typedef int DeltaCost; typedef int DeltaPtr; #define ASSIGNCOST(l, r) ((l) = (r)) #define ADDCOST(l, r) ((l) += (r)) #define MINUSCOST(l, r) ((l) -= (r)) #define ZEROCOST(x) ((x) = 0) #define LESSCOST(l, r) ((l) < (r)) #define EQUALCOST(l, r) ((l) == (r)) #define PRINCIPLECOST(x) (x) #endif /* NOLEX */ #define NODIVERGE(c,state,nt,base) if (prevent_divergence > 0) CHECKDIVERGE(c,state,nt,base); struct list { void *x; struct list *next; }; typedef struct list *List; struct intlist { int x; struct intlist *next; }; typedef struct intlist *IntList; struct operator { char *name; unsigned int ref:1; OperatorNum num; ItemSetNum baseNum; ItemSetNum stateCount; ArityNum arity; struct table *table; }; typedef struct operator *Operator; struct nonterminal { char *name; NonTerminalNum num; ItemSetNum baseNum; ItemSetNum ruleCount; struct plankMap *pmap; struct rule *sampleRule; /* diagnostic---gives "a" rule that with this lhs */ }; typedef struct nonterminal *NonTerminal; struct pattern { NonTerminal normalizer; Operator op; /* NULL if NonTerm -> NonTerm */ NonTerminal children[MAX_ARITY]; }; typedef struct pattern *Pattern; struct rule { DeltaCost delta; ERuleNum erulenum; RuleNum num; RuleNum newNum; NonTerminal lhs; Pattern pat; unsigned int used:1; }; typedef struct rule *Rule; struct item { DeltaCost delta; Rule rule; }; typedef struct item Item; typedef short *Relevant; /* relevant non-terminals */ typedef Item *ItemArray; struct item_set { /* indexed by NonTerminal */ ItemSetNum num; ItemSetNum newNum; Operator op; struct item_set *kids[2]; struct item_set *representative; Relevant relevant; ItemArray virgin; ItemArray closed; }; typedef struct item_set *Item_Set; #define DIM_MAP_SIZE (1 << 8) #define GLOBAL_MAP_SIZE (1 << 15) struct mapping { /* should be a hash table for TS -> int */ List *hash; int hash_size; int max_size; ItemSetNum count; Item_Set *set; /* map: int <-> Item_Set */ }; typedef struct mapping *Mapping; struct index_map { ItemSetNum max_size; Item_Set *class; }; typedef struct index_map Index_Map; struct dimension { Relevant relevant; Index_Map index_map; Mapping map; ItemSetNum max_size; struct plankMap *pmap; }; typedef struct dimension *Dimension; struct table { Operator op; List rules; Relevant relevant; Dimension dimen[MAX_ARITY]; /* 1 for each dimension */ Item_Set *transition; /* maps local indices to global itemsets */ }; typedef struct table *Table; struct relation { Rule rule; DeltaCost chain; NonTerminalNum nextchain; DeltaCost sibling; int sibFlag; int sibComputed; }; typedef struct relation *Relation; struct queue { List head; List tail; }; typedef struct queue *Queue; struct plank { char *name; List fields; int width; }; typedef struct plank *Plank; struct except { short index; short value; }; typedef struct except *Exception; struct plankMap { List exceptions; int offset; struct stateMap *values; }; typedef struct plankMap *PlankMap; struct stateMap { char *fieldname; Plank plank; int width; short *value; }; typedef struct stateMap *StateMap; struct stateMapTable { List maps; }; extern void CHECKDIVERGE ARGS((DeltaPtr, Item_Set, int, int)); extern void zero ARGS((Item_Set)); extern ItemArray newItemArray ARGS((void)); extern ItemArray itemArrayCopy ARGS((ItemArray)); extern Item_Set newItem_Set ARGS((Relevant)); extern void freeItem_Set ARGS((Item_Set)); extern Mapping newMapping ARGS((int)); extern NonTerminal newNonTerminal ARGS((char *)); extern int nonTerminalName ARGS((char *, int)); extern Operator newOperator ARGS((char *, OperatorNum, ArityNum)); extern Pattern newPattern ARGS((Operator)); extern Rule newRule ARGS((DeltaPtr, ERuleNum, NonTerminal, Pattern)); extern List newList ARGS((void *, List)); extern IntList newIntList ARGS((int, IntList)); extern int length ARGS((List)); extern List appendList ARGS((void *, List)); extern Table newTable ARGS((Operator)); extern Queue newQ ARGS((void)); extern void addQ ARGS((Queue, Item_Set)); extern Item_Set popQ ARGS((Queue)); extern int equivSet ARGS((Item_Set, Item_Set)); extern Item_Set decode ARGS((Mapping, ItemSetNum)); extern Item_Set encode ARGS((Mapping, Item_Set, int *)); extern void build ARGS((void)); extern Item_Set *transLval ARGS((Table, int, int)); typedef void * (*ListFn) ARGS((void *)); extern void foreachList ARGS((ListFn, List)); extern void reveachList ARGS((ListFn, List)); extern void addToTable ARGS((Table, Item_Set)); extern void closure ARGS((Item_Set)); extern void trim ARGS((Item_Set)); extern void findChainRules ARGS((void)); extern void findAllPairs ARGS((void)); extern void addRelevant ARGS((Relevant, NonTerminalNum)); extern void *zalloc ARGS((unsigned int)); extern void zfree ARGS((void *)); extern NonTerminal start; extern List rules; extern List chainrules; extern List operators; extern List leaves; extern List nonterminals; extern List grammarNts; extern Queue globalQ; extern Mapping globalMap; extern int exceptionTolerance; extern int prevent_divergence; extern int principleCost; extern int lexical; extern struct rule stub_rule; extern Relation *allpairs; extern Item_Set *sortedStates; extern Item_Set errorState; extern void dumpRelevant ARGS((Relevant)); extern void dumpOperator ARGS((Operator, int)); extern void dumpOperator_s ARGS((Operator)); extern void dumpOperator_l ARGS((Operator)); extern void dumpNonTerminal ARGS((NonTerminal)); extern void dumpRule ARGS((Rule)); extern void dumpRuleList ARGS((List)); extern void dumpItem ARGS((Item *)); extern void dumpItem_Set ARGS((Item_Set)); extern void dumpMapping ARGS((Mapping)); extern void dumpQ ARGS((Queue)); extern void dumpIndex_Map ARGS((Index_Map *)); extern void dumpDimension ARGS((Dimension)); extern void dumpPattern ARGS((Pattern)); extern void dumpTable ARGS((Table, int)); extern void dumpTransition ARGS((Table)); extern void dumpCost ARGS((DeltaCost)); extern void dumpAllPairs ARGS((void)); extern void dumpRelation ARGS((Relation)); extern void dumpSortedStates ARGS((void)); extern void dumpSortedRules ARGS((void)); extern int debugTrim; #ifdef DEBUG #define debug(a,b) if (a) b #else #define debug(a,b) #endif extern int debugTables; #define TABLE_INCR 8 #define STATES_INCR 64 #ifdef NDEBUG #define assert(c) ((void) 0) #else #define assert(c) ((void) ((c) || fatal(__FILE__,__LINE__))) #endif extern void doStart ARGS((char *)); extern void exit ARGS((int)); extern int fatal ARGS((const char *, int)); extern void yyerror ARGS((const char *)); extern void yyerror1 ARGS((const char *));