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