-
Notifications
You must be signed in to change notification settings - Fork 22
/
grammar.h
181 lines (139 loc) · 3.29 KB
/
grammar.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/*********************************************************************
Gazelle: a system for building fast, reusable parsers
grammar.h
This file presents the data structures for representing a compiled
Gazelle grammar, and a function for loading one from a bytecode file.
There are a lot of structures, but they should all be considered
read-only.
A compiled Gazelle grammar consists of a bunch of state machines of
various kinds -- see the manual for more details.
*********************************************************************/
#ifndef GAZELLE_GRAMMAR
#define GAZELLE_GRAMMAR
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
/*
* RTN
*/
struct gzl_rtn_state;
struct gzl_rtn_transition;
struct gzl_rtn
{
char *name;
int num_slots;
int num_states;
struct gzl_rtn_state *states; /* start state is first */
int num_transitions;
struct gzl_rtn_transition *transitions;
};
struct gzl_rtn_transition
{
enum {
GZL_TERMINAL_TRANSITION,
GZL_NONTERM_TRANSITION,
} transition_type;
union {
char *terminal_name;
struct gzl_rtn *nonterminal;
} edge;
struct gzl_rtn_state *dest_state;
char *slotname;
int slotnum;
};
struct gzl_rtn_state
{
bool is_final;
enum {
GZL_STATE_HAS_INTFA,
GZL_STATE_HAS_GLA,
GZL_STATE_HAS_NEITHER
} lookahead_type;
union {
struct gzl_intfa *state_intfa;
struct gzl_gla *state_gla;
} d;
int num_transitions;
struct gzl_rtn_transition *transitions;
};
/*
* GLA
*/
struct gzl_gla_state;
struct gzl_gla_transition;
struct gzl_gla
{
int num_states;
struct gzl_gla_state *states; /* start state is first */
int num_transitions;
struct gzl_gla_transition *transitions;
};
struct gzl_gla_transition
{
char *term; /* if NULL, then the term is EOF */
struct gzl_gla_state *dest_state;
};
struct gzl_gla_state
{
bool is_final;
union {
struct gzl_nonfinal_info {
struct gzl_intfa *intfa;
int num_transitions;
struct gzl_gla_transition *transitions;
} nonfinal;
struct gzl_final_info {
int transition_offset; /* 1-based -- 0 is "return" */
} final;
} d;
};
/*
* IntFA
*/
struct gzl_intfa_state;
struct gzl_intfa_transition;
struct gzl_intfa
{
int num_states;
struct gzl_intfa_state *states; /* start state is first */
int num_transitions;
struct gzl_intfa_transition *transitions;
};
struct gzl_intfa_transition
{
int ch_low;
int ch_high;
struct gzl_intfa_state *dest_state;
};
struct gzl_intfa_state
{
char *final; /* NULL if not final */
int num_transitions;
struct gzl_intfa_transition *transitions;
};
struct gzl_grammar
{
char **strings;
int num_rtns;
struct gzl_rtn *rtns;
int num_glas;
struct gzl_gla *glas;
int num_intfas;
struct gzl_intfa *intfas;
};
/* Functions for loading a grammar from a bytecode file. */
struct gzl_grammar *gzl_load_grammar(struct bc_read_stream *s);
void gzl_free_grammar(struct gzl_grammar *g);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* GAZELLE_GRAMMAR */
/*
* Local Variables:
* c-file-style: "bsd"
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
* vim:et:sts=4:sw=4
*/