antelope 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +11 -0
- data/bin/antelope +3 -3
- data/examples/{example.err → example.ace.err} +9 -9
- data/examples/{example.inf → example.ace.inf} +57 -9
- data/examples/example.ate +70 -0
- data/examples/example.ate.err +192 -0
- data/examples/example.ate.inf +432 -0
- data/lib/antelope/ace/compiler.rb +4 -4
- data/lib/antelope/ace/errors.rb +0 -18
- data/lib/antelope/ace.rb +6 -12
- data/lib/antelope/cli.rb +1 -1
- data/lib/antelope/dsl/compiler.rb +117 -0
- data/lib/antelope/dsl/contexts/base.rb +29 -0
- data/lib/antelope/dsl/contexts/main.rb +63 -0
- data/lib/antelope/dsl/contexts/match.rb +24 -0
- data/lib/antelope/dsl/contexts/precedence.rb +20 -0
- data/lib/antelope/dsl/contexts/production.rb +24 -0
- data/lib/antelope/dsl/contexts/terminal.rb +28 -0
- data/lib/antelope/dsl/contexts.rb +16 -0
- data/lib/antelope/dsl.rb +9 -0
- data/lib/antelope/errors.rb +18 -1
- data/lib/antelope/generation/constructor/first.rb +10 -12
- data/lib/antelope/generation/constructor/follow.rb +6 -6
- data/lib/antelope/generation/constructor/nullable.rb +6 -6
- data/lib/antelope/generation/constructor.rb +4 -4
- data/lib/antelope/generation/recognizer/rule.rb +17 -17
- data/lib/antelope/generation/recognizer/state.rb +9 -10
- data/lib/antelope/generation/recognizer.rb +8 -11
- data/lib/antelope/generation/tableizer.rb +2 -2
- data/lib/antelope/generator/base.rb +7 -7
- data/lib/antelope/generator/ruby.rb +1 -1
- data/lib/antelope/grammar/generation.rb +77 -0
- data/lib/antelope/grammar/loading.rb +84 -0
- data/lib/antelope/{ace → grammar}/precedence.rb +2 -4
- data/lib/antelope/grammar/precedences.rb +64 -0
- data/lib/antelope/{ace → grammar}/production.rb +11 -12
- data/lib/antelope/grammar/productions.rb +154 -0
- data/lib/antelope/grammar/symbols.rb +64 -0
- data/lib/antelope/{ace → grammar}/token/epsilon.rb +1 -2
- data/lib/antelope/{ace → grammar}/token/error.rb +1 -3
- data/lib/antelope/{ace → grammar}/token/nonterminal.rb +1 -3
- data/lib/antelope/{ace → grammar}/token/terminal.rb +1 -3
- data/lib/antelope/{ace → grammar}/token.rb +12 -15
- data/lib/antelope/grammar.rb +68 -0
- data/lib/antelope/version.rb +1 -1
- data/lib/antelope.rb +12 -6
- data/spec/antelope/ace/compiler_spec.rb +6 -6
- data/spec/antelope/ace/scanner_spec.rb +7 -7
- data/spec/antelope/generation/constructor_spec.rb +131 -0
- data/spec/support/grammar_helper.rb +2 -3
- metadata +32 -19
- data/lib/antelope/ace/grammar/generation.rb +0 -80
- data/lib/antelope/ace/grammar/loading.rb +0 -53
- data/lib/antelope/ace/grammar/precedences.rb +0 -68
- data/lib/antelope/ace/grammar/productions.rb +0 -156
- data/lib/antelope/ace/grammar/symbols.rb +0 -66
- data/lib/antelope/ace/grammar.rb +0 -69
- data/spec/antelope/constructor_spec.rb +0 -133
@@ -0,0 +1,432 @@
|
|
1
|
+
Productions:
|
2
|
+
15/n1: expression → NUMBER { match[0][1] }
|
3
|
+
26/n0: $start → expression $end
|
4
|
+
79/r4: expression → expression "^" expression { match[0] ** match[2] }
|
5
|
+
85/l2: expression → expression "+" expression { match[0] + match[2] }
|
6
|
+
91/l2: expression → expression "-" expression { match[0] - match[2] }
|
7
|
+
97/l3: expression → expression "*" expression { match[0] * match[2] }
|
8
|
+
103/l3: expression → expression "/" expression { match[0] / match[2] }
|
9
|
+
109/n1: expression → "(" expression ")" { match[1] }
|
10
|
+
110/n1: expression → "(" $error ")" { match[1] }
|
11
|
+
|
12
|
+
|
13
|
+
Precedence:
|
14
|
+
--- highest
|
15
|
+
right 4:
|
16
|
+
{EXPONENTIATE}
|
17
|
+
left 3:
|
18
|
+
{MULTIPLY, DIVIDE}
|
19
|
+
left 2:
|
20
|
+
{ADD, SUBTRACT}
|
21
|
+
nonassoc 1:
|
22
|
+
{_}
|
23
|
+
nonassoc 0:
|
24
|
+
{$end}
|
25
|
+
--- lowest
|
26
|
+
|
27
|
+
State 0:
|
28
|
+
0/n0: $start → • expression $end
|
29
|
+
{}
|
30
|
+
1/n1: expression → • NUMBER
|
31
|
+
{}
|
32
|
+
2/r4: expression → • expression "^" expression
|
33
|
+
{}
|
34
|
+
3/l2: expression → • expression "+" expression
|
35
|
+
{}
|
36
|
+
4/l2: expression → • expression "-" expression
|
37
|
+
{}
|
38
|
+
5/l3: expression → • expression "*" expression
|
39
|
+
{}
|
40
|
+
6/l3: expression → • expression "/" expression
|
41
|
+
{}
|
42
|
+
7/n1: expression → • "(" expression ")"
|
43
|
+
{}
|
44
|
+
8/n1: expression → • "(" $error ")"
|
45
|
+
{}
|
46
|
+
9/n0: $start → expression • $end
|
47
|
+
{}
|
48
|
+
10/r4: expression → expression • "^" expression
|
49
|
+
{}
|
50
|
+
11/l2: expression → expression • "+" expression
|
51
|
+
{}
|
52
|
+
12/l2: expression → expression • "-" expression
|
53
|
+
{}
|
54
|
+
13/l3: expression → expression • "*" expression
|
55
|
+
{}
|
56
|
+
14/l3: expression → expression • "/" expression
|
57
|
+
{}
|
58
|
+
15/n1: expression → NUMBER •
|
59
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
60
|
+
16/n1: expression → "(" • expression ")"
|
61
|
+
{}
|
62
|
+
17/n1: expression → "(" • $error ")"
|
63
|
+
{}
|
64
|
+
26/n0: $start → expression $end •
|
65
|
+
{}
|
66
|
+
27/r4: expression → expression "^" • expression
|
67
|
+
{}
|
68
|
+
36/l2: expression → expression "+" • expression
|
69
|
+
{}
|
70
|
+
45/l2: expression → expression "-" • expression
|
71
|
+
{}
|
72
|
+
54/l3: expression → expression "*" • expression
|
73
|
+
{}
|
74
|
+
63/l3: expression → expression "/" • expression
|
75
|
+
{}
|
76
|
+
72/n1: expression → "(" expression • ")"
|
77
|
+
{}
|
78
|
+
78/n1: expression → "(" $error • ")"
|
79
|
+
{}
|
80
|
+
79/r4: expression → expression "^" expression •
|
81
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
82
|
+
85/l2: expression → expression "+" expression •
|
83
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
84
|
+
91/l2: expression → expression "-" expression •
|
85
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
86
|
+
97/l3: expression → expression "*" expression •
|
87
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
88
|
+
103/l3: expression → expression "/" expression •
|
89
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
90
|
+
109/n1: expression → "(" expression ")" •
|
91
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
92
|
+
110/n1: expression → "(" $error ")" •
|
93
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
94
|
+
transitions:
|
95
|
+
expression: State 1
|
96
|
+
NUMBER: State 2
|
97
|
+
"(": State 3
|
98
|
+
|
99
|
+
State 1:
|
100
|
+
9/n0: $start → expression • $end
|
101
|
+
{}
|
102
|
+
10/r4: expression → expression • "^" expression
|
103
|
+
{}
|
104
|
+
11/l2: expression → expression • "+" expression
|
105
|
+
{}
|
106
|
+
12/l2: expression → expression • "-" expression
|
107
|
+
{}
|
108
|
+
13/l3: expression → expression • "*" expression
|
109
|
+
{}
|
110
|
+
14/l3: expression → expression • "/" expression
|
111
|
+
{}
|
112
|
+
transitions:
|
113
|
+
$end: State 4
|
114
|
+
"^": State 5
|
115
|
+
"+": State 6
|
116
|
+
"-": State 7
|
117
|
+
"*": State 8
|
118
|
+
"/": State 9
|
119
|
+
|
120
|
+
State 2:
|
121
|
+
15/n1: expression → NUMBER •
|
122
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
123
|
+
reductions:
|
124
|
+
$default: Rule 1
|
125
|
+
|
126
|
+
State 3:
|
127
|
+
16/n1: expression → "(" • expression ")"
|
128
|
+
{}
|
129
|
+
17/n1: expression → "(" • $error ")"
|
130
|
+
{}
|
131
|
+
18/n1: expression → • NUMBER
|
132
|
+
{}
|
133
|
+
19/r4: expression → • expression "^" expression
|
134
|
+
{}
|
135
|
+
20/l2: expression → • expression "+" expression
|
136
|
+
{}
|
137
|
+
21/l2: expression → • expression "-" expression
|
138
|
+
{}
|
139
|
+
22/l3: expression → • expression "*" expression
|
140
|
+
{}
|
141
|
+
23/l3: expression → • expression "/" expression
|
142
|
+
{}
|
143
|
+
24/n1: expression → • "(" expression ")"
|
144
|
+
{}
|
145
|
+
25/n1: expression → • "(" $error ")"
|
146
|
+
{}
|
147
|
+
transitions:
|
148
|
+
expression: State 10
|
149
|
+
$error: State 11
|
150
|
+
NUMBER: State 2
|
151
|
+
"(": State 3
|
152
|
+
|
153
|
+
State 4:
|
154
|
+
26/n0: $start → expression $end •
|
155
|
+
{}
|
156
|
+
accepting:
|
157
|
+
$end: Rule 0
|
158
|
+
|
159
|
+
State 5:
|
160
|
+
27/r4: expression → expression "^" • expression
|
161
|
+
{}
|
162
|
+
28/n1: expression → • NUMBER
|
163
|
+
{}
|
164
|
+
29/r4: expression → • expression "^" expression
|
165
|
+
{}
|
166
|
+
30/l2: expression → • expression "+" expression
|
167
|
+
{}
|
168
|
+
31/l2: expression → • expression "-" expression
|
169
|
+
{}
|
170
|
+
32/l3: expression → • expression "*" expression
|
171
|
+
{}
|
172
|
+
33/l3: expression → • expression "/" expression
|
173
|
+
{}
|
174
|
+
34/n1: expression → • "(" expression ")"
|
175
|
+
{}
|
176
|
+
35/n1: expression → • "(" $error ")"
|
177
|
+
{}
|
178
|
+
transitions:
|
179
|
+
expression: State 12
|
180
|
+
NUMBER: State 2
|
181
|
+
"(": State 3
|
182
|
+
|
183
|
+
State 6:
|
184
|
+
36/l2: expression → expression "+" • expression
|
185
|
+
{}
|
186
|
+
37/n1: expression → • NUMBER
|
187
|
+
{}
|
188
|
+
38/r4: expression → • expression "^" expression
|
189
|
+
{}
|
190
|
+
39/l2: expression → • expression "+" expression
|
191
|
+
{}
|
192
|
+
40/l2: expression → • expression "-" expression
|
193
|
+
{}
|
194
|
+
41/l3: expression → • expression "*" expression
|
195
|
+
{}
|
196
|
+
42/l3: expression → • expression "/" expression
|
197
|
+
{}
|
198
|
+
43/n1: expression → • "(" expression ")"
|
199
|
+
{}
|
200
|
+
44/n1: expression → • "(" $error ")"
|
201
|
+
{}
|
202
|
+
transitions:
|
203
|
+
expression: State 13
|
204
|
+
NUMBER: State 2
|
205
|
+
"(": State 3
|
206
|
+
|
207
|
+
State 7:
|
208
|
+
45/l2: expression → expression "-" • expression
|
209
|
+
{}
|
210
|
+
46/n1: expression → • NUMBER
|
211
|
+
{}
|
212
|
+
47/r4: expression → • expression "^" expression
|
213
|
+
{}
|
214
|
+
48/l2: expression → • expression "+" expression
|
215
|
+
{}
|
216
|
+
49/l2: expression → • expression "-" expression
|
217
|
+
{}
|
218
|
+
50/l3: expression → • expression "*" expression
|
219
|
+
{}
|
220
|
+
51/l3: expression → • expression "/" expression
|
221
|
+
{}
|
222
|
+
52/n1: expression → • "(" expression ")"
|
223
|
+
{}
|
224
|
+
53/n1: expression → • "(" $error ")"
|
225
|
+
{}
|
226
|
+
transitions:
|
227
|
+
expression: State 14
|
228
|
+
NUMBER: State 2
|
229
|
+
"(": State 3
|
230
|
+
|
231
|
+
State 8:
|
232
|
+
54/l3: expression → expression "*" • expression
|
233
|
+
{}
|
234
|
+
55/n1: expression → • NUMBER
|
235
|
+
{}
|
236
|
+
56/r4: expression → • expression "^" expression
|
237
|
+
{}
|
238
|
+
57/l2: expression → • expression "+" expression
|
239
|
+
{}
|
240
|
+
58/l2: expression → • expression "-" expression
|
241
|
+
{}
|
242
|
+
59/l3: expression → • expression "*" expression
|
243
|
+
{}
|
244
|
+
60/l3: expression → • expression "/" expression
|
245
|
+
{}
|
246
|
+
61/n1: expression → • "(" expression ")"
|
247
|
+
{}
|
248
|
+
62/n1: expression → • "(" $error ")"
|
249
|
+
{}
|
250
|
+
transitions:
|
251
|
+
expression: State 15
|
252
|
+
NUMBER: State 2
|
253
|
+
"(": State 3
|
254
|
+
|
255
|
+
State 9:
|
256
|
+
63/l3: expression → expression "/" • expression
|
257
|
+
{}
|
258
|
+
64/n1: expression → • NUMBER
|
259
|
+
{}
|
260
|
+
65/r4: expression → • expression "^" expression
|
261
|
+
{}
|
262
|
+
66/l2: expression → • expression "+" expression
|
263
|
+
{}
|
264
|
+
67/l2: expression → • expression "-" expression
|
265
|
+
{}
|
266
|
+
68/l3: expression → • expression "*" expression
|
267
|
+
{}
|
268
|
+
69/l3: expression → • expression "/" expression
|
269
|
+
{}
|
270
|
+
70/n1: expression → • "(" expression ")"
|
271
|
+
{}
|
272
|
+
71/n1: expression → • "(" $error ")"
|
273
|
+
{}
|
274
|
+
transitions:
|
275
|
+
expression: State 16
|
276
|
+
NUMBER: State 2
|
277
|
+
"(": State 3
|
278
|
+
|
279
|
+
State 10:
|
280
|
+
72/n1: expression → "(" expression • ")"
|
281
|
+
{}
|
282
|
+
73/r4: expression → expression • "^" expression
|
283
|
+
{}
|
284
|
+
74/l2: expression → expression • "+" expression
|
285
|
+
{}
|
286
|
+
75/l2: expression → expression • "-" expression
|
287
|
+
{}
|
288
|
+
76/l3: expression → expression • "*" expression
|
289
|
+
{}
|
290
|
+
77/l3: expression → expression • "/" expression
|
291
|
+
{}
|
292
|
+
transitions:
|
293
|
+
")": State 17
|
294
|
+
"^": State 5
|
295
|
+
"+": State 6
|
296
|
+
"-": State 7
|
297
|
+
"*": State 8
|
298
|
+
"/": State 9
|
299
|
+
|
300
|
+
State 11:
|
301
|
+
78/n1: expression → "(" $error • ")"
|
302
|
+
{}
|
303
|
+
transitions:
|
304
|
+
")": State 18
|
305
|
+
|
306
|
+
State 12:
|
307
|
+
79/r4: expression → expression "^" expression •
|
308
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
309
|
+
80/r4: expression → expression • "^" expression
|
310
|
+
{}
|
311
|
+
81/l2: expression → expression • "+" expression
|
312
|
+
{}
|
313
|
+
82/l2: expression → expression • "-" expression
|
314
|
+
{}
|
315
|
+
83/l3: expression → expression • "*" expression
|
316
|
+
{}
|
317
|
+
84/l3: expression → expression • "/" expression
|
318
|
+
{}
|
319
|
+
transitions:
|
320
|
+
"^": State 5
|
321
|
+
reductions:
|
322
|
+
"+": Rule 2
|
323
|
+
"-": Rule 2
|
324
|
+
"*": Rule 2
|
325
|
+
"/": Rule 2
|
326
|
+
$end: Rule 2
|
327
|
+
")": Rule 2
|
328
|
+
|
329
|
+
State 13:
|
330
|
+
85/l2: expression → expression "+" expression •
|
331
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
332
|
+
86/r4: expression → expression • "^" expression
|
333
|
+
{}
|
334
|
+
87/l2: expression → expression • "+" expression
|
335
|
+
{}
|
336
|
+
88/l2: expression → expression • "-" expression
|
337
|
+
{}
|
338
|
+
89/l3: expression → expression • "*" expression
|
339
|
+
{}
|
340
|
+
90/l3: expression → expression • "/" expression
|
341
|
+
{}
|
342
|
+
transitions:
|
343
|
+
"^": State 5
|
344
|
+
"*": State 8
|
345
|
+
"/": State 9
|
346
|
+
reductions:
|
347
|
+
"+": Rule 3
|
348
|
+
"-": Rule 3
|
349
|
+
$end: Rule 3
|
350
|
+
")": Rule 3
|
351
|
+
|
352
|
+
State 14:
|
353
|
+
91/l2: expression → expression "-" expression •
|
354
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
355
|
+
92/r4: expression → expression • "^" expression
|
356
|
+
{}
|
357
|
+
93/l2: expression → expression • "+" expression
|
358
|
+
{}
|
359
|
+
94/l2: expression → expression • "-" expression
|
360
|
+
{}
|
361
|
+
95/l3: expression → expression • "*" expression
|
362
|
+
{}
|
363
|
+
96/l3: expression → expression • "/" expression
|
364
|
+
{}
|
365
|
+
transitions:
|
366
|
+
"^": State 5
|
367
|
+
"*": State 8
|
368
|
+
"/": State 9
|
369
|
+
reductions:
|
370
|
+
"+": Rule 4
|
371
|
+
"-": Rule 4
|
372
|
+
$end: Rule 4
|
373
|
+
")": Rule 4
|
374
|
+
|
375
|
+
State 15:
|
376
|
+
97/l3: expression → expression "*" expression •
|
377
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
378
|
+
98/r4: expression → expression • "^" expression
|
379
|
+
{}
|
380
|
+
99/l2: expression → expression • "+" expression
|
381
|
+
{}
|
382
|
+
100/l2: expression → expression • "-" expression
|
383
|
+
{}
|
384
|
+
101/l3: expression → expression • "*" expression
|
385
|
+
{}
|
386
|
+
102/l3: expression → expression • "/" expression
|
387
|
+
{}
|
388
|
+
transitions:
|
389
|
+
"^": State 5
|
390
|
+
reductions:
|
391
|
+
"+": Rule 5
|
392
|
+
"-": Rule 5
|
393
|
+
"*": Rule 5
|
394
|
+
"/": Rule 5
|
395
|
+
$end: Rule 5
|
396
|
+
")": Rule 5
|
397
|
+
|
398
|
+
State 16:
|
399
|
+
103/l3: expression → expression "/" expression •
|
400
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
401
|
+
104/r4: expression → expression • "^" expression
|
402
|
+
{}
|
403
|
+
105/l2: expression → expression • "+" expression
|
404
|
+
{}
|
405
|
+
106/l2: expression → expression • "-" expression
|
406
|
+
{}
|
407
|
+
107/l3: expression → expression • "*" expression
|
408
|
+
{}
|
409
|
+
108/l3: expression → expression • "/" expression
|
410
|
+
{}
|
411
|
+
transitions:
|
412
|
+
"^": State 5
|
413
|
+
reductions:
|
414
|
+
"+": Rule 6
|
415
|
+
"-": Rule 6
|
416
|
+
"*": Rule 6
|
417
|
+
"/": Rule 6
|
418
|
+
$end: Rule 6
|
419
|
+
")": Rule 6
|
420
|
+
|
421
|
+
State 17:
|
422
|
+
109/n1: expression → "(" expression ")" •
|
423
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
424
|
+
reductions:
|
425
|
+
$default: Rule 7
|
426
|
+
|
427
|
+
State 18:
|
428
|
+
110/n1: expression → "(" $error ")" •
|
429
|
+
{$end, "^", "+", "-", "*", "/", ")"}
|
430
|
+
reductions:
|
431
|
+
$default: Rule 8
|
432
|
+
|
@@ -53,7 +53,7 @@ module Antelope
|
|
53
53
|
|
54
54
|
# Options defined by directives in the first part of the file.
|
55
55
|
#
|
56
|
-
# - **`:terminals`** (`Array<Symbol, String
|
56
|
+
# - **`:terminals`** (`Array<Symbol, String?>)` — A list
|
57
57
|
# of all of the terminals in the language. If this is not
|
58
58
|
# properly defined, the grammar will throw an error saying
|
59
59
|
# that a symbol used in the grammar is not defined.
|
@@ -105,9 +105,9 @@ module Antelope
|
|
105
105
|
# Pretty inspect.
|
106
106
|
#
|
107
107
|
# @return [String]
|
108
|
-
def inspect
|
109
|
-
|
110
|
-
end
|
108
|
+
# def inspect
|
109
|
+
# "#<#{self.class} state=#{@state.inspect} options=#{options.inspect}>"
|
110
|
+
# end
|
111
111
|
|
112
112
|
# Runs the compiler on the input tokens. For each token,
|
113
113
|
# it calls `compile_<type>` with `<type>` being the first
|
data/lib/antelope/ace/errors.rb
CHANGED
@@ -9,35 +9,17 @@ module Antelope
|
|
9
9
|
class Error < Antelope::Error
|
10
10
|
end
|
11
11
|
|
12
|
-
# Used primarily in the {Compiler}, this is raised when the
|
13
|
-
# version requirement of the Ace file doesn't match the running
|
14
|
-
# version of Ace.
|
15
|
-
class IncompatibleVersionError < Error
|
16
|
-
end
|
17
|
-
|
18
12
|
# Used primarily in the {Scanner}, this is raised when an input
|
19
13
|
# is malformed. The message should contain a snippet of the input
|
20
14
|
# which caused the error.
|
21
15
|
class SyntaxError < Error
|
22
16
|
end
|
23
17
|
|
24
|
-
# This is used primarily in the {Grammar}; if a rule references a
|
25
|
-
# token (a nonterminal or a terminal) that was not previously
|
26
|
-
# defined, this is raised.
|
27
|
-
class UndefinedTokenError < Error
|
28
|
-
end
|
29
|
-
|
30
18
|
# Primarily used in the {Compiler}, if a scanner token appears
|
31
19
|
# that should not be in the current state, this is raised.
|
32
20
|
class InvalidStateError < Error
|
33
21
|
end
|
34
22
|
|
35
|
-
# Primarily used in the {Grammar} (specifically
|
36
|
-
# {Grammar::Generation}), if the grammar could not determine the
|
37
|
-
# generator to use for the generation, it raises this.
|
38
|
-
class NoTypeError < Error
|
39
|
-
end
|
40
|
-
|
41
23
|
# Primarily used in the {Compiler}, it is raised if it encounters
|
42
24
|
# a directive it cannot handle. This is more to warn the
|
43
25
|
# developer that a directive they wrote may not be accepted by any
|
data/lib/antelope/ace.rb
CHANGED
@@ -1,15 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require "antelope/ace/token"
|
7
|
-
require "antelope/ace/precedence"
|
8
|
-
require "antelope/ace/production"
|
9
|
-
require "antelope/ace/grammar"
|
3
|
+
require 'antelope/ace/errors'
|
4
|
+
require 'antelope/ace/scanner'
|
5
|
+
require 'antelope/ace/compiler'
|
10
6
|
|
11
7
|
module Antelope
|
12
|
-
|
13
8
|
# Defines the Ace file. The Ace file format works similarly to
|
14
9
|
# bison's y file format. The Ace file is seperated into three
|
15
10
|
# parts:
|
@@ -27,18 +22,18 @@ module Antelope
|
|
27
22
|
# %%
|
28
23
|
#
|
29
24
|
# The first part consists of _directives_ and _blocks_; directives
|
30
|
-
# look something like `
|
25
|
+
# look something like `'%' <directive>[ <argument>]*\n`, with
|
31
26
|
# `<directive>` being any alphanumerical character, including
|
32
27
|
# underscores and dashes, and `<argument>` being any word character
|
33
28
|
# or a quote-delimited string. Blocks consist of
|
34
|
-
# `
|
29
|
+
# `'%{" <content> "\n" "\s"* "%}'`, with `<content>` being any
|
35
30
|
# characters. The content is copied directly into the body of the
|
36
31
|
# output.
|
37
32
|
#
|
38
33
|
# The second part consists of rules. Rules look something like
|
39
34
|
# this:
|
40
35
|
#
|
41
|
-
# <nonterminal>: (<nonterminal> | <terminal>)* [
|
36
|
+
# <nonterminal>: (<nonterminal> | <terminal>)* ['{" <content> "}"] ["|" (<nonterminal> | <terminal>)* ["{" <content> "}']]* [;]
|
42
37
|
#
|
43
38
|
# Where `<nonterminal>` is any lowercase alphabetical cahracter,
|
44
39
|
# `<terminal>` is any uppercase alphabetical character, and
|
@@ -48,6 +43,5 @@ module Antelope
|
|
48
43
|
# The third part consists of a body, which is copied directly into
|
49
44
|
# the output.
|
50
45
|
module Ace
|
51
|
-
|
52
46
|
end
|
53
47
|
end
|
data/lib/antelope/cli.rb
CHANGED
@@ -0,0 +1,117 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems/requirement'
|
4
|
+
|
5
|
+
module Antelope
|
6
|
+
module DSL
|
7
|
+
class Compiler
|
8
|
+
# The body of the output compiler. This should be formatted in
|
9
|
+
# the language that the parser is to be written in. Some output
|
10
|
+
# generators may have special syntax that allows the parser to
|
11
|
+
# be put in the body; see the output generators for more.
|
12
|
+
#
|
13
|
+
# For the DSL compiler, this is the :default template; if the
|
14
|
+
# :default template does not exist, the compilation will error.
|
15
|
+
#
|
16
|
+
# @return [String]
|
17
|
+
attr_reader :body
|
18
|
+
|
19
|
+
# A list of all the rules that are defined in the file. The
|
20
|
+
# rules are defined as such:
|
21
|
+
#
|
22
|
+
# - **`label`** (`Symbol`) — The left-hand side of the rule;
|
23
|
+
# this is the nonterminal that the right side reduces to.
|
24
|
+
# - **`set`** (`Array<Symbol>`) — The right-hand side of the
|
25
|
+
# rule. This is a combination of terminals and nonterminals.
|
26
|
+
# - **`block`** (`String`) — The code to be run on a reduction.
|
27
|
+
# this should be formatted in the language that the output
|
28
|
+
# parser is written in. Optional; default value is `""`.
|
29
|
+
# - **`prec`** (`String`) — The precedence level for the
|
30
|
+
# rule. This should be a nonterminal or terminal. Optional;
|
31
|
+
# default value is `""`.
|
32
|
+
#
|
33
|
+
# @return [Array<Hash>]
|
34
|
+
attr_reader :rules
|
35
|
+
|
36
|
+
# Options defined by the file itself.
|
37
|
+
#
|
38
|
+
# - **`:terminals`** (`Array<Symbol, String?)>)` — A list
|
39
|
+
# of all of the terminals in the language. If this is not
|
40
|
+
# properly defined, the grammar will throw an error saying
|
41
|
+
# that a symbol used in the grammar is not defined.
|
42
|
+
# - **`:prec`** (`Array<(Symbol, Array<Symbol>)>`) — A list
|
43
|
+
# of the precedence rules of the grammar. The first element
|
44
|
+
# of each element is the _type_ of precedence (and should be
|
45
|
+
# any of `:left`, `:right`, or `:nonassoc`), and the second
|
46
|
+
# element should be the symbols that are on that level.
|
47
|
+
# - **`:type`** (`String`) — The type of generator to
|
48
|
+
# generate; this should be a language.
|
49
|
+
# - **`:extra`** (`Hash<Symbol, Array<Object>>`) — Extra
|
50
|
+
# options that are not defined here.
|
51
|
+
# @return [Hash]
|
52
|
+
attr_reader :options
|
53
|
+
|
54
|
+
def self.compile(env = {}, &block)
|
55
|
+
new(env, &block).tap(&:compile)
|
56
|
+
end
|
57
|
+
|
58
|
+
def initialize(env = {}, &block)
|
59
|
+
@env = env
|
60
|
+
@options = {}
|
61
|
+
@block = block
|
62
|
+
end
|
63
|
+
|
64
|
+
def compile
|
65
|
+
call
|
66
|
+
handle_requirement
|
67
|
+
handle_rules
|
68
|
+
handle_options
|
69
|
+
@body = @context[:templates].fetch(:default)
|
70
|
+
end
|
71
|
+
|
72
|
+
def call
|
73
|
+
@context ||= Contexts::Main.new(options.fetch(:context, {}))
|
74
|
+
.call(&@block)
|
75
|
+
end
|
76
|
+
|
77
|
+
protected
|
78
|
+
|
79
|
+
def handle_requirement
|
80
|
+
required = @options.fetch(:require, ">= 0.0.0")
|
81
|
+
antelope_version = Gem::Version.new(Antelope::VERSION)
|
82
|
+
required_version = Gem::Requirement.new(required)
|
83
|
+
|
84
|
+
raise IncompatibleVersionError, "Grammar requires " \
|
85
|
+
"#{required}, have #{Antelope::VERSION}" unless
|
86
|
+
required_version =~ antelope_version
|
87
|
+
end
|
88
|
+
|
89
|
+
def handle_rules
|
90
|
+
@rules = []
|
91
|
+
|
92
|
+
@context[:productions].each do |label, rules|
|
93
|
+
rules.each do |rule|
|
94
|
+
@rules << { label: label,
|
95
|
+
set: rule[:body].map { |x| [x, nil] },
|
96
|
+
block: rule[:action],
|
97
|
+
prec: rule[:prec] }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def handle_options
|
103
|
+
@options[:prec] = @context[:precedences]
|
104
|
+
@options[:extra] = @context[:defines]
|
105
|
+
@options[:type] = @env[:output]
|
106
|
+
@options[:nonterminals] = []
|
107
|
+
@options[:terminals] = @context[:terminals].map do |name, value|
|
108
|
+
if value.is_a?(TrueClass)
|
109
|
+
[name.intern, nil, nil, nil]
|
110
|
+
else
|
111
|
+
[name.intern, nil, nil, value]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Antelope
|
2
|
+
module DSL
|
3
|
+
module Contexts
|
4
|
+
# The base context, which implements some helper methods.
|
5
|
+
class Base
|
6
|
+
attr_reader :options
|
7
|
+
|
8
|
+
def initialize(options)
|
9
|
+
@options = options
|
10
|
+
@contexts = Hash.new { |h, k| h[k] = k.new(@options) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(&block)
|
14
|
+
before_call
|
15
|
+
instance_exec(self, &block)
|
16
|
+
data
|
17
|
+
end
|
18
|
+
|
19
|
+
def context(name, &block)
|
20
|
+
@contexts[name].call(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def before_call; end
|
24
|
+
|
25
|
+
def data; end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|