1 2 /* Grammar interface */ 3 4 #ifndef Py_GRAMMAR_H 5 #define Py_GRAMMAR_H 6 #ifdef __cplusplus 7 extern "C" { 8 #endif 9 10 #include "bitset.h" /* Sigh... */ 11 12 /* A label of an arc */ 13 14 typedef struct { 15 int lb_type; 16 char *lb_str; 17 } label; 18 19 #define EMPTY 0 /* Label number 0 is by definition the empty label */ 20 21 /* A list of labels */ 22 23 typedef struct { 24 int ll_nlabels; 25 label *ll_label; 26 } labellist; 27 28 /* An arc from one state to another */ 29 30 typedef struct { 31 short a_lbl; /* Label of this arc */ 32 short a_arrow; /* State where this arc goes to */ 33 } arc; 34 35 /* A state in a DFA */ 36 37 typedef struct { 38 int s_narcs; 39 arc *s_arc; /* Array of arcs */ 40 41 /* Optional accelerators */ 42 int s_lower; /* Lowest label index */ 43 int s_upper; /* Highest label index */ 44 int *s_accel; /* Accelerator */ 45 int s_accept; /* Nonzero for accepting state */ 46 } state; 47 48 /* A DFA */ 49 50 typedef struct { 51 int d_type; /* Non-terminal this represents */ 52 char *d_name; /* For printing */ 53 int d_initial; /* Initial state */ 54 int d_nstates; 55 state *d_state; /* Array of states */ 56 bitset d_first; 57 } dfa; 58 59 /* A grammar */ 60 61 typedef struct { 62 int g_ndfas; 63 dfa *g_dfa; /* Array of DFAs */ 64 labellist g_ll; 65 int g_start; /* Start symbol of the grammar */ 66 int g_accel; /* Set if accelerators present */ 67 } grammar; 68 69 /* FUNCTIONS */ 70 71 grammar *newgrammar(int start); 72 dfa *adddfa(grammar *g, int type, char *name); 73 int addstate(dfa *d); 74 void addarc(dfa *d, int from, int to, int lbl); 75 dfa *PyGrammar_FindDFA(grammar *g, int type); 76 77 int addlabel(labellist *ll, int type, char *str); 78 int findlabel(labellist *ll, int type, char *str); 79 char *PyGrammar_LabelRepr(label *lb); 80 void translatelabels(grammar *g); 81 82 void addfirstsets(grammar *g); 83 84 void PyGrammar_AddAccelerators(grammar *g); 85 void PyGrammar_RemoveAccelerators(grammar *); 86 87 void printgrammar(grammar *g, FILE *fp); 88 void printnonterminals(grammar *g, FILE *fp); 89 90 #ifdef __cplusplus 91 } 92 #endif 93 #endif /* !Py_GRAMMAR_H */ 94