|  | 
 | /* 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 */ |