70 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #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)))
 |