1 /** 2 Mirror _grammar.h 3 4 Grammar interface 5 */ 6 module deimos.python.grammar; 7 8 import core.stdc.stdio; 9 10 extern(C): 11 // Python-header-file: Include/object.h: 12 13 /** A label of an arc */ 14 struct label{ 15 /// _ 16 int lb_type; 17 /// _ 18 char* lb_str; 19 } 20 21 /** Label number 0 is by definition the empty label */ 22 enum EMPTY = 0; 23 24 /** A list of labels */ 25 struct labellist{ 26 /// _ 27 int ll_nlabels; 28 /// _ 29 label* ll_label; 30 } 31 32 /** An arc from one state to another */ 33 struct arc{ 34 /** Label of this arc */ 35 short a_lbl; 36 /** State where this arc goes to */ 37 short a_arrow; 38 } 39 40 /** A state in a DFA */ 41 struct state{ 42 /// _ 43 int s_narcs; 44 /** Array of arcs */ 45 arc* s_arc; 46 47 /* Optional accelerators */ 48 /** Lowest label index */ 49 int s_lower; 50 /** Highest label index */ 51 int s_upper; 52 /** Accelerator */ 53 int* s_accel; 54 /** Nonzero for accepting state */ 55 int s_accept; 56 } 57 58 /** A DFA */ 59 struct dfa{ 60 /** Non-terminal this represents */ 61 int d_type; 62 /** For printing */ 63 char* d_name; 64 /** Initial state */ 65 int d_initial; 66 /// _ 67 int d_nstates; 68 /** Array of states */ 69 state* d_state; 70 /// _ 71 void*/*bitset*/ d_first; 72 } 73 74 /** A grammar */ 75 struct grammar{ 76 /// _ 77 int g_ndfas; 78 /** Array of DFAs */ 79 dfa* g_dfa; 80 /// _ 81 labellist g_ll; 82 /** Start symbol of the grammar */ 83 int g_start; 84 /** Set if accelerators present */ 85 int g_accel; 86 } 87 88 /* FUNCTIONS */ 89 90 /// _ 91 grammar* newgrammar(int start); 92 /// _ 93 dfa* adddfa(grammar* g, int type, char* name); 94 /// _ 95 int addstate(dfa* d); 96 /// _ 97 void addarc(dfa* d, int from, int to, int lbl); 98 /// _ 99 dfa *PyGrammar_FindDFA(grammar* g, int type); 100 101 /// _ 102 int addlabel(labellist* ll, int type, char* str); 103 /// _ 104 int findlabel(labellist* ll, int type, char* str); 105 /// _ 106 char* PyGrammar_LabelRepr(label* lb); 107 /// _ 108 void translatelabels(grammar* g); 109 110 /// _ 111 void addfirstsets(grammar* g); 112 113 /// _ 114 void PyGrammar_AddAccelerators(grammar* g); 115 /// _ 116 void PyGrammar_RemoveAccelerators(grammar*); 117 118 /// _ 119 void printgrammar(grammar* g, FILE* fp); 120 /// _ 121 void printnonterminals(grammar* g, FILE* fp); 122