Initial revision
This commit is contained in:
		
							parent
							
								
									b83ab7873e
								
							
						
					
					
						commit
						6b74749c12
					
				
					 1 changed files with 241 additions and 0 deletions
				
			
		
							
								
								
									
										241
									
								
								util/LLgen/src/types.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								util/LLgen/src/types.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,241 @@ | |||
| /*
 | ||||
|  * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. | ||||
|  * | ||||
|  *          This product is part of the Amsterdam Compiler Kit. | ||||
|  * | ||||
|  * Permission to use, sell, duplicate or disclose this software must be | ||||
|  * obtained in writing. Requests for such permissions may be sent to | ||||
|  * | ||||
|  *      Dr. Andrew S. Tanenbaum | ||||
|  *      Wiskundig Seminarium | ||||
|  *      Vrije Universiteit | ||||
|  *      Postbox 7161 | ||||
|  *      1007 MC Amsterdam | ||||
|  *      The Netherlands | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
|  *  L L G E N | ||||
|  * | ||||
|  *  An Extended LL(1) Parser Generator | ||||
|  * | ||||
|  *  Author : Ceriel J.H. Jacobs | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
|  * types.h $Header$ | ||||
|  * Type and structure definitions | ||||
|  */ | ||||
| 
 | ||||
| typedef	int	*p_set;		/* pointer to bitset */ | ||||
| typedef char	*p_mem;		/* pointer to some core */ | ||||
| typedef char	*string; | ||||
| 
 | ||||
| /*
 | ||||
|  * structure for a token | ||||
|  */ | ||||
| typedef struct token { | ||||
| 	int	t_tokno;	/* Lexical token number */ | ||||
| 	union { | ||||
| 		string	t_s;	/* Attribute is either a string or */ | ||||
| 		int	t_v;	/* an integer */ | ||||
| 	} t_x; | ||||
| # define t_string t_x.t_s | ||||
| # define t_num t_x.t_v | ||||
| } t_token; | ||||
| 
 | ||||
| /*
 | ||||
|  * structure for the grammar elements | ||||
|  */ | ||||
| typedef struct gram { | ||||
| 	short	x;		/* for lay-out see comment below */ | ||||
| 	short	g_lineno;	/* element found on this line number */ | ||||
| } t_gram,*p_gram; | ||||
| 
 | ||||
| /*
 | ||||
|  * Layout of the field x: | ||||
|  * | ||||
|  * 15     13 12         9 8                 0 | ||||
|  * ------------------------------------------ | ||||
|  * | type   | nparams    | index            | | ||||
|  * ------------------------------------------ | ||||
|  * of | ||||
|  * 15     13 12                             0 | ||||
|  * ------------------------------------------ | ||||
|  * | type   | index                         | | ||||
|  * ------------------------------------------ | ||||
|  * dependant on type | ||||
|  */ | ||||
| # define UNDEFINED	000777 | ||||
| # define EORULE		00	/* End of (sub)rule */ | ||||
| # define ACTION		01	/* Imbedded action */ | ||||
| # define NONTERM	02	/* A nonterminal */ | ||||
| # define TERMINAL	03	/* A terminal */ | ||||
| # define TERM		04	/* Something between square brackets */ | ||||
| # define ALTERNATION	05	/* Alternation (|) */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Access macros for the x-field of a grammar element | ||||
|  */ | ||||
| # define g_init(p)	{(p)->x = 0;} | ||||
| # define g_gettype(p)	(((p)->x>>13)&07) | ||||
| # define g_getcont(p)	((p)->x&017777) | ||||
| # define g_getnont(p)	((p)->x&0777) | ||||
| # define g_getnpar(p)	(((p)->x>>9)&07) | ||||
| # define g_settype(p,s)	{ assert(((unsigned)(s))<=07);(p)->x=((p)->x&017777)|((s)<<13);} | ||||
| # define g_setcont(p,s) { assert(((unsigned)(s))<=017777);(p)->x=((p)->x&0160000)|(s);} | ||||
| # define g_setnont(p,s) { assert(((unsigned)(s))<=0777);(p)->x=((p)->x&0177000)|(s);} | ||||
| # define g_setnpar(p,s) { assert(((unsigned)(s))<=07);(p)->x=((p)->x&0170777)|((s)<<9);} | ||||
| 
 | ||||
| /*
 | ||||
|  * Some constants to communicate with the symbol table search routine | ||||
|  */ | ||||
| # define LITERAL	01	/* Not equal to NONTERM or TERMINAL */ | ||||
| # define UNKNOWN	00	/* Not equal to NONTERM, TERMINAL or LITERAL */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Some constants for safety | ||||
|  */ | ||||
| # define SAFE		0 | ||||
| # define SAFESCANDONE	1 | ||||
| # define SCANDONE	2 | ||||
| # define NOSCANDONE	3 | ||||
| # define NOSAFETY	4 | ||||
| 
 | ||||
| /*
 | ||||
|  * nonterminal structure | ||||
|  */ | ||||
| typedef	struct { | ||||
| 	short	n_flags;	/* low order three bits are reserved
 | ||||
| 				 * for "safety" information, | ||||
| 				 * the next three bits are reserved for | ||||
| 				 * the parameter count | ||||
| 				 */ | ||||
| # define getntsafe(f)	((f)&07) | ||||
| # define setntsafe(p,i)	{assert(((unsigned)(i))<=7);*(p)&=~07;*(p)|=(i);} | ||||
| 
 | ||||
| # define RECURSIVE	00100	/* Set if the default rule is recursive */ | ||||
| # define NNOSCAN	00200	/* Set if the nonterminal does not scan ahead */ | ||||
| # define CONTIN		00400	/* continuation already computed? */ | ||||
| # define BUSY		01000	/* or are we busy computing it? */ | ||||
| # define PARAMS		02000	/* tells if a nonterminal has parameters */ | ||||
| # define PRODUCE	04000	/* tells if a nonterminal produces anything */ | ||||
| # define EMPTY		010000	/* tells if a nonterminal produces empty */ | ||||
| # define LOCALS		020000  /* local declarations ? */ | ||||
| # define REACHABLE	040000	/* can this nonterminal be reached ? */ | ||||
| # define VERBOSE	0100000	/* Set if in LL.output file */ | ||||
| 	short	n_count;	/* pieces of code before this rule */ | ||||
| 	int	n_lineno;	/* declared on line ... */ | ||||
| 	p_gram	n_rule;		/* pointer to right hand side of rule */ | ||||
| 	union { | ||||
| 		p_set	n_f;	/* ptr to "first" set */ | ||||
| 		string	n_s;	/* If this nonterminal is not declared,
 | ||||
| 				 * This field indicates the filename in | ||||
| 				 * which it occurred | ||||
| 				 */ | ||||
| 	} n_x; | ||||
| # define n_first  n_x.n_f | ||||
| # define n_string n_x.n_s | ||||
| 	p_set	n_follow;	/* pointer to the "follow" set	*/ | ||||
| 	p_set	n_contains;	/* pointer to symbols that can be produced */ | ||||
| } t_nont, *p_nont; | ||||
| 
 | ||||
| /* 
 | ||||
|  * hash table structure | ||||
|  */ | ||||
| typedef struct h_entry { | ||||
| 	string		h_name;		/* pointer to name */ | ||||
| 	int		h_num;		/* numbering of terminals */ | ||||
| 	struct h_entry	*h_next;	/* next in hash chain */ | ||||
| } t_entry, *p_entry; | ||||
| 
 | ||||
| /*
 | ||||
|  * link	structure to link alternations | ||||
|  */ | ||||
| typedef struct link { | ||||
| 	unsigned int	l_flag; | ||||
| # define COND		01		/* Set if this alternative has a %if */ | ||||
| # define DEF		02		/* This alternative is default */ | ||||
| # define PREFERING	010		/* %prefer */ | ||||
| # define AVOIDING	020		/* %avoid */ | ||||
| # define NOCONF		01000		/* Set if there is a resolver without | ||||
| 					 * conflict | ||||
| 					 */ | ||||
| 	p_gram		l_rule;		/* pointer to this rule	*/ | ||||
| 	p_set		l_symbs;	/* set,	when to take this rule */ | ||||
| 	p_set		l_others;	/* set, when to take another rule */ | ||||
| } t_link, *p_link; | ||||
| 
 | ||||
| /*
 | ||||
|  * Structure for a repitition specification | ||||
|  */ | ||||
| typedef short t_reps,*p_reps; | ||||
| 
 | ||||
| # define FIXED		00	/* a fixed number */ | ||||
| # define STAR		01	/* 0 or more times */ | ||||
| # define PLUS		02	/* 1 or more times */ | ||||
| # define OPT		03	/* 0 or 1 times */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Access macros for repitition | ||||
|  */ | ||||
| # define r_init(p)	{*(p)=0;} | ||||
| # define r_getkind(p)	(*(p)&03) | ||||
| # define r_getnum(p)	((*(p)>>2)&037777) | ||||
| # define r_setkind(p,s)	{ assert(((unsigned)(s))<=03);*(p)=(*(p)&0177774)|(s);} | ||||
| # define r_setnum(p,s)	{ assert(((unsigned)(s))<=037777);*(p)=(*(p)&03)|((s)<<2);} | ||||
| 
 | ||||
| /*
 | ||||
|  * header structure for	a term | ||||
|  */ | ||||
| typedef struct term { | ||||
| 	t_reps	t_reps;		/* repeats ? */ | ||||
| 	short	t_flags; | ||||
| # define PERSISTENT	010	/* Set if this term has %persistent */ | ||||
| # define RESOLVER	020	/* Set if this term has %while */ | ||||
| # define EMPTYFIRST	0100	/* Error, empty first */ | ||||
| # define EMPTYTERM	0200	/* Error, term can produce empty */ | ||||
| # define TNOSCAN	0400	/* Set if this term does not scan ahead */ | ||||
| /* # define NOCONF	01000	see link structure */ | ||||
| 
 | ||||
| 	p_gram	t_rule;		/* pointer to this term	*/ | ||||
| 	p_set	t_follow;	/* set of followers */ | ||||
| 	p_set	t_first;	/* set of firsts */ | ||||
| 	p_set	t_contains; | ||||
| } t_term, *p_term; | ||||
| 
 | ||||
| /*
 | ||||
|  * structure for firstmacros list | ||||
|  */ | ||||
| typedef struct ff_firsts { | ||||
| 	string	ff_name;	/* Name of the macro */ | ||||
| 	p_nont	ff_nont;	/* for this nonterminal */ | ||||
| 	struct ff_firsts *ff_next; | ||||
| } t_first, *p_first; | ||||
| 
 | ||||
| /*
 | ||||
|  * structure for start symbol list | ||||
|  */ | ||||
| typedef t_first t_start; | ||||
| typedef p_first p_start; | ||||
| 
 | ||||
| /*
 | ||||
|  * structure for file names and info | ||||
|  */ | ||||
| typedef struct f_file { | ||||
| 	string	f_name;		/* File name */ | ||||
| 	p_first f_firsts;	/* ptr to list of firstmacros that must be
 | ||||
| 				 * generated in the target file for this | ||||
| 				 * grammar file | ||||
| 				 */ | ||||
| 	short	*f_start,*f_end;/* pointers in the "order" array,
 | ||||
| 				 * Indicating which nonterminals were defined | ||||
| 				 * in this file | ||||
| 				 */ | ||||
| } t_file, *p_file; | ||||
| # ifdef NDEBUG | ||||
| # define STATIC static | ||||
| # else not NDEBUG | ||||
| # define STATIC extern | ||||
| # endif not NDEBUG | ||||
		Loading…
	
	Add table
		
		Reference in a new issue