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…
Reference in a new issue