|  |  | 
|  | /* Grammar interface */ | 
|  |  | 
|  | #ifndef Py_GRAMMAR_H | 
|  | #define Py_GRAMMAR_H | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | #include "bitset.h" /* Sigh... */ | 
|  |  | 
|  | /* A label of an arc */ | 
|  |  | 
|  | typedef struct { | 
|  | int		 lb_type; | 
|  | char	*lb_str; | 
|  | } label; | 
|  |  | 
|  | #define EMPTY 0		/* Label number 0 is by definition the empty label */ | 
|  |  | 
|  | /* A list of labels */ | 
|  |  | 
|  | typedef struct { | 
|  | int		 ll_nlabels; | 
|  | label	*ll_label; | 
|  | } labellist; | 
|  |  | 
|  | /* An arc from one state to another */ | 
|  |  | 
|  | typedef struct { | 
|  | short	a_lbl;		/* Label of this arc */ | 
|  | short	a_arrow;	/* State where this arc goes to */ | 
|  | } arc; | 
|  |  | 
|  | /* A state in a DFA */ | 
|  |  | 
|  | typedef struct { | 
|  | int		 s_narcs; | 
|  | arc		*s_arc;		/* Array of arcs */ | 
|  |  | 
|  | /* Optional accelerators */ | 
|  | int		 s_lower;	/* Lowest label index */ | 
|  | int		 s_upper;	/* Highest label index */ | 
|  | int		*s_accel;	/* Accelerator */ | 
|  | int		 s_accept;	/* Nonzero for accepting state */ | 
|  | } state; | 
|  |  | 
|  | /* A DFA */ | 
|  |  | 
|  | typedef struct { | 
|  | int		 d_type;	/* Non-terminal this represents */ | 
|  | char	*d_name;	/* For printing */ | 
|  | int		 d_initial;	/* Initial state */ | 
|  | int		 d_nstates; | 
|  | state	*d_state;	/* Array of states */ | 
|  | bitset	 d_first; | 
|  | } dfa; | 
|  |  | 
|  | /* A grammar */ | 
|  |  | 
|  | typedef struct { | 
|  | int		 g_ndfas; | 
|  | dfa		*g_dfa;		/* Array of DFAs */ | 
|  | labellist	 g_ll; | 
|  | int		 g_start;	/* Start symbol of the grammar */ | 
|  | int		 g_accel;	/* Set if accelerators present */ | 
|  | } grammar; | 
|  |  | 
|  | /* FUNCTIONS */ | 
|  |  | 
|  | grammar *newgrammar(int start); | 
|  | dfa *adddfa(grammar *g, int type, char *name); | 
|  | int addstate(dfa *d); | 
|  | void addarc(dfa *d, int from, int to, int lbl); | 
|  | dfa *PyGrammar_FindDFA(grammar *g, int type); | 
|  |  | 
|  | int addlabel(labellist *ll, int type, char *str); | 
|  | int findlabel(labellist *ll, int type, char *str); | 
|  | char *PyGrammar_LabelRepr(label *lb); | 
|  | void translatelabels(grammar *g); | 
|  |  | 
|  | void addfirstsets(grammar *g); | 
|  |  | 
|  | void PyGrammar_AddAccelerators(grammar *g); | 
|  | void PyGrammar_RemoveAccelerators(grammar *); | 
|  |  | 
|  | void printgrammar(grammar *g, FILE *fp); | 
|  | void printnonterminals(grammar *g, FILE *fp); | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  | #endif /* !Py_GRAMMAR_H */ |