/************************************************************* * * * Macros defining special characters. * * * *************************************************************/ #define NUL '\0' #define ASCII_MIN '\001' #define ASCII_MAX '\177' /************************************************************* * * * Macros defining lexical categories. * * * *************************************************************/ #define C_LIT 0 /* individual character literal */ #define C_SET 1 /* character set literal */ #define EOS 0 /* end-of-string */ #define LITERAL 1 #define OPSTAR 2 #define OPALT 3 #define OPOPT 4 #define OPCAT 5 #define LPAREN 6 #define RPAREN 7 /************************************************************* * * * Macros for manipulating syntax tree nodes. * * * *************************************************************/ #define lit_type(x) (x->l_type) #define lit_pos(x) (x->pos) #define lit_char(x) ((x->val).c) #define lit_cset(x) ((x->val).cset) #define tok_type(x) (x->type) #define tok_val(x) (x->val) #define tok_op(x) (x->val->op) #define tok_lit(x) ((x->val->refs).lit) #define Op(x) (x->op) #define Lit(x) ((x->refs).lit) #define Child(x) ((x->refs).child) #define Lchild(x) ((x->refs).children.l_child) #define Rchild(x) ((x->refs).children.r_child) #define Nullable(x) (x->nullable) #define Firstpos(x) (x->firstposn) #define Lastpos(x) (x->lastposn) /************************************************************* * * * Macros for manipulating DFA states and sets of states. * * * *************************************************************/ #define Positions(x) (x->posns) #define Final_St(x) (x->final) #define Goto(x, c) ((x->trans)[c]) #define Next_State(x) ((x)->next_state) /*************************************************************/ #define new_node(x) malloc(sizeof(*x)) typedef struct { /* character range literals */ char low_bd, hi_bd; } *Ch_Range; typedef struct ch_set { /* character set literals */ Ch_Range elt; /* rep. as list of ranges */ struct ch_set *rest; } *Ch_Set; typedef struct { /* regular expression literal */ int pos; /* position in syntax tree */ short l_type; /* type of literal */ union { char c; /* for character literals */ Ch_Set cset; /* for character sets */ } val; } *Re_Lit, *(*Re_lit_array)[]; typedef struct pnode { int posnum; struct pnode *nextpos; } *Pset, *(*Pset_array)[]; typedef struct rnode { /* regular expression node */ short op; /* operator at that node */ union { Re_Lit lit; /* child is a leaf node */ struct rnode *child; /* child of unary op */ struct { struct rnode *l_child; struct rnode *r_child; } children; /* children of binary op */ } refs; short nullable; Pset firstposn, lastposn; } *Re_node; typedef struct { /* token node */ short type; Re_node val; } *Tok_node; typedef struct snode { Re_node val; int size; struct snode *next; } *Stack; typedef struct dfa_st { Pset posns; int final; /* 1 if the state is a final state, 0 o/w */ struct dfa_st *trans[128]; } *Dfa_state; typedef struct dfa_stset { Dfa_state st; struct dfa_stset *next_state; } *Dfa_state_set;