-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathbnf.y
91 lines (73 loc) · 1.86 KB
/
bnf.y
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
%start Module
%ebnf
%%
Module
: Source* EOF { return node(T.MODULE, $1, @1) }
;
Source
: SExp
| JSBlock
;
JSBlock
: JSBLOCK { $$ = node(T.JSBLOCK, $1, @1) }
;
SExp
: '(' AtomList ')' {
$$ = node(T.SEXPR, $2 || [], @2)
if ($2 && $2[0]) {
$$.operator = $2.shift()
}
}
;
Array
: '[' AtomList? ']' { $$ = node(T.ARRAY, $2 || [], @2) }
;
QualifiedIdent
: IDENT { $$ = node(T.IDENT, $1, @1) }
| QualifiedIdent '.' IDENT {
$1.content += ('.' + $3);
}
;
Object
: '{' PropertyList? '}' { $$ = node(T.OBJECT, $2 || [], @2) }
;
PropertyList
: Property Separator { $$ = [$1] }
| PropertyList Property Separator { $$.push($2) }
;
Property
: KEY_IDENT AtomNoKeyIdent {
$$ = node(T.PROPERTY)
$$.key = node(T.KEY_IDENT, $1, @1)
$$.value = $2
}
;
AtomList
: Atom Separator { $$ = [$1] }
| AtomList Atom Separator { $$.push($2) }
;
Atom
: AtomNoKeyIdent
| KEY_IDENT { $$ = node(T.KEY_IDENT, $1, @1) }
;
AtomNoKeyIdent
: QualifiedIdent
| SPECIAL_PLACEHOLDER { $$ = node(T.SPECIAL_PLACEHOLDER, $1, @1) }
| STRING { $$ = node(T.STRING, $1, @1) }
| NUMBER { $$ = node(T.NUMBER, $1, @1) }
| REGEXP { $$ = node(T.REGEXP, $1, @1) }
| NIL { $$ = node(T.NIL, $1, @1) }
| BOOLEAN { $$ = node(T.BOOLEAN, $1, @1) }
| JSBlock
| SExp
| Array
| Object
;
Separator
: ','
|
;
%%
var nodes = require('./nodes')
var node = nodes.node
var T = nodes.type