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