-
Notifications
You must be signed in to change notification settings - Fork 89
/
Copy pathbnf.bnf
84 lines (67 loc) · 1.58 KB
/
bnf.bnf
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
/**
* BNF grammar grammar.
*
* A BNF parser generated from it can parse its own grammar.
*
* Example:
*
* ./bin/syntax -g examples/bnf.g -f examples/bnf.bnf -m slr1
*/
%%
Spec
: OptModInc '%%' ProductionList
{ return $$ = {bnf: $3, moduleInclude: $1 }; }
;
OptModInc
: MODULE_INCLUDE
{ $$ = $1; }
|
;
ProductionList
: ProductionList Production
{ $$ = $1; $$[$2[0]] = $2[1]; }
| Production
{ $$ = {}; $$[$1[0]] = $1[1]; }
;
Production
: LHS ':' HandleList ';'
{ $$ = [$1, $3]; }
;
LHS
: ID
{ $$ = yytext; }
;
HandleList
: HandleList '|' HandleAction
{ $$ = $1; $$.push($3); }
| HandleAction
{ $$ = [$1]; }
;
HandleAction
: Handle Action
{ $$ = [$1, $2]; }
;
Handle
: Entries
{ $$ = $1; }
|
{ $$ = ''; }
;
Entries
: Entries Entry
{ $$ = $1 + ' ' + $2; }
| Entry
{ $$ = $1; }
;
Entry
: ID
{ $$ = yytext; }
| STRING
{ $$ = yytext; }
;
Action
: CODE
{ $$ = yytext; }
|
{ $$ = null; }
;