-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathscheem.peg
92 lines (70 loc) · 1.68 KB
/
scheem.peg
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
start =
e: expression+
{ if (e.length === 1) {return e[0]; } else { e.unshift('begin'); return e;} }
quote =
_ "'" _ e: expression
{return ["quote", e]}
expression =
_ n : NumericLiteral
{return n}
/ _ a : atom _
{return a}
/ _ s: string
{return s}
/ _ q: quote
{return q}
/ _ "(" _ e: expression+ _ ")" _
{return e}
validchar
= [0-9a-zA-Z_?!+=<>@#$%^&*/.-]
string =
_ "\"" s :[^\"\n\r]* "\""
{return s.join(""); }
atom =
chars:validchar+
{return chars.join(""); }
_ =
ws* comment+ ws*
/ ws*
ws =
[ \t\r\n]
comment =
";;" [^\n\r]*
// from js pegjs example
NumericLiteral "number"
= literal:(HexIntegerLiteral / DecimalLiteral) {
return literal;
}
DecimalLiteral
= before:DecimalIntegerLiteral
"."
after:DecimalDigits?
exponent:ExponentPart? {
return parseFloat(before + "." + after + exponent);
}
/ "." after:DecimalDigits exponent:ExponentPart? {
return parseFloat("." + after + exponent);
}
/ before:DecimalIntegerLiteral exponent:ExponentPart? {
return parseFloat(before + exponent);
}
DecimalIntegerLiteral
= "0" / digit:NonZeroDigit digits:DecimalDigits? { return digit + digits; }
DecimalDigits
= digits:DecimalDigit+ { return digits.join(""); }
DecimalDigit
= [0-9]
NonZeroDigit
= [1-9]
ExponentPart
= indicator:ExponentIndicator integer:SignedInteger {
return indicator + integer;
}
ExponentIndicator
= [eE]
SignedInteger
= sign:[-+]? digits:DecimalDigits { return sign + digits; }
HexIntegerLiteral
= "0" [xX] digits:HexDigit+ { return parseInt("0x" + digits.join("")); }
HexDigit
= [0-9a-fA-F]