-
Notifications
You must be signed in to change notification settings - Fork 3
/
sexp.pegjs
97 lines (70 loc) · 2.07 KB
/
sexp.pegjs
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
sexp
= _ "(" _ contents:( SEXP _ )* ")" _ {
return {
type: "sexp",
value: contents.map(x => x[0])
}
}
SEXP = number / string / array / symbol / sexp / hex
// --------------------------------------------------
// strings
// --------------------------------------------------
string = value:_string { return {type:"string",value:value[1] }}
_string
= ('"' $(DoubleStringCharacter*) '"' )
/ ("'" $(SingleStringCharacter*) "'" )
DoubleStringCharacter
= !('"' / "\\") char:. { return char; }
/ "\\" sequence:EscapeSequence { return sequence; }
SingleStringCharacter
= !("'" / "\\") char:. { return char; }
/ "\\" sequence:EscapeSequence { return sequence; }
EscapeSequence
= "'"
/ '"'
/ "\\"
/ "b" { return "\b"; }
/ "f" { return "\f"; }
/ "n" { return "\n"; }
/ "r" { return "\r"; }
/ "t" { return "\t"; }
/ "v" { return "\x0B"; }
// skipping net, pinfunction, die_llength
// --------------------------------------------------
// BASIC TYPES
// --------------------------------------------------
array
= "[" _ value:(string/symbol/number) _ values:((string/symbol/number) _ "," _ )*"]" {
return {
type: "array",
values: [ value, ...values.map(x => x[0])]
}
}
symbol
= value:$([^0-9 "();'\n\/][^ "();'\n]*) {
return {type:"symbol",value}
}
_ "whitespace"
= [ \t\n\r]*
// <number>::= [<sign>] [<positive_integer> | <real> | <fraction>]
number
= value:$([-+]? (Fraction/Real)) {
return { type:"number", value }
}
Real
= value:$((digits("."(digits?))?) / "." digits) {
return { type:"real", value }
}
Fraction
= n:digits "/" d:digits {
return { type:"fraction", n:n, d:d }
}
// <positive_integer>::= [<digit> | <digit><positive_integer>]
digits = $([0-9]+)
// <sign>::= [+ | -]
// <real>::= [<positive_integer>. | <positive_integer>.<positive_integer> | <positive_integer>]
// <fraction>::= <positive_integer> / <positive_integer>
hex
= value:$([0-9a-fA-F]+) {
return {"type": "hex", value }
}