#define LLALT 9999 /* Alternative is following */ #define LLTERMINAL 1 /* Symbol is a terminal */ #define LLNONTERMINAL 2 /* Symbol is a nonterminal */ #define LLEORULE 0 /* No more alternatives */ struct lhs { /* LHS of a rule */ int nr; /* Nr of the nonterminal */ struct symbol *rhs; /* Pointer to RHS */ char first[LLSETSIZE]; /* First set */ char follow[LLSETSIZE]; /* Follow set */ char empty; /* Set if nonterminal produces empty */ }; struct symbol { /* Symbol in the RHS of a rule */ int x; /* LLTERMINAL or LLNONTERMINAL */ int nr; /* Nr of the symbol */ struct symbol *link; /* Ptr to next rule with this symbol */ struct symbol *next; /* Ptr to next symbol in this rule */ struct lhs *lhs; /* Ptr to LHS */ }; struct terminal { /* Array with links to terminals in a */ struct symbol *link; /* rule */ }; struct nonterminal { /* Array with links to nt's in a rule */ struct symbol *link; /* and pointer to LHS's */ struct lhs *rule; }; struct stack_elt { /* Stack element */ int flags; /* Some flags */ int nr; /* Nr of symbol */ int ref_count; /* Nr of predecessors */ int hyp_ref_count; /* Temporary nr of predecessors */ int matched; /* Nr of LHS trying to match */ int nr_nexts; /* Nr of successors */ struct edge *edges; /* Array of edges to other stack elt's*/ }; /* Possible flags in a stack element */ #define LLHEAD 1 /* Stack element is a head */ #define LLDUMMY 2 /* Stack element is substituted */ #define LLGEN_SEARCH 8 /* Set by 'generate_heads()' */ struct edge { /* Edges of a stack element */ char flags; /* Some flags */ struct stack_elt *ptr; /* Array with pointers to stack elt's */ }; /* Possible flags in an edge */ #define LLLOOP 1 /* Belongs to a loop */ #define LLLOOP_SEARCH 2 /* Used by 'loop()' */ #define LLHYP_SEARCH 4 /* Used by 'hyp_run()' */ #define PRINT_SEARCH 8 /* DEBUG */ #define LLMARK_SEARCH 16 /* Used by 'mark_loop()' */ #define LLYES 32 #define LLNO 64 #define LLEOSTACK -1 /* Indicates last element of a stack */ #define LLHEADS_BUF_INCR 10 /* Nr of elements the buffer will be */ #define LLCLEANUP_BUF_INCR 25 /* increased by */ #define LL_VIS_INCR 200 /* Macro's to manipulate bit sets */ #define LLIN(a, i) ((a)[(i)/8] & (1 << ((i) % 8))) #define LLPUTIN(a, i) ((a)[(i)/8] |= (1 << ((i) % 8)))