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 const 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 const 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 const 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_nstates; 54 state *d_state; /* Array of states */ 55 bitset d_first; 56 } dfa; 57 58 /* A grammar */ 59 60 typedef struct { 61 int g_ndfas; 62 const dfa *g_dfa; /* Array of DFAs */ 63 const labellist g_ll; 64 int g_start; /* Start symbol of the grammar */ 65 int g_accel; /* Set if accelerators present */ 66 } grammar; 67 68 /* FUNCTIONS */ 69 const dfa *PyGrammar_FindDFA(grammar *g, int type); 70 const char *PyGrammar_LabelRepr(label *lb); 71 void PyGrammar_AddAccelerators(grammar *g); 72 void PyGrammar_RemoveAccelerators(grammar *); 73 74 #ifdef __cplusplus 75 } 76 #endif 77 #endif /* !Py_GRAMMAR_H */ 78