-
Notifications
You must be signed in to change notification settings - Fork 21
/
jssm-dot.peg
79 lines (61 loc) · 1.47 KB
/
jssm-dot.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
Expression
= Whitespace e:ExpList Whitespace { return e; }
ForwardArrow "forward arrow"
= "->"
TwoWayArrow "two way arrow"
= "<->"
Arrow
= ForwardArrow / TwoWayArrow
String "string"
= QuoteMark chars:Char* QuoteMark { return chars.join(""); }
HexDigit
= [0-9a-fA-F]
Char
= Unescaped
/ Escape Sequence:(
'"'
/ "\\"
/ "/"
/ "b" { return "\b"; }
/ "f" { return "\f"; }
/ "n" { return "\n"; }
/ "r" { return "\r"; }
/ "t" { return "\t"; }
/ "v" { return "\v"; }
/ "u" digits:$(HexDigit HexDigit HexDigit HexDigit) {
return String.fromCharCode(parseInt(digits, 16));
}
)
{ return Sequence; }
Escape = "\\"
QuoteMark = '"'
Unescaped = [\x20-\x21\x23-\x5B\x5D-\u10FFFF]
Label "label"
= text:[0-9a-zA-Z\.\+\-\_\&\(\)\%\$\#\@\!\?\<\>\,\:\;\']+ { return text.join(''); }
\ text:String { return text.join(''); }
DescValue
= string:String
DescItem
= text:Label ":" value:DescValue ";"
DescItems
= DescItem+
ArrowDesc
= "{" DescItems? "}"
Subexp
= Whitespace ldesc:ArrowDesc?
Whitespace arrow:Arrow
Whitespace rdesc:ArrowDesc?
Whitespace label:Label
Whitespace tail:Subexp? {
return {kind: arrow, to: label, se:(tail === [])? undefined: tail};
}
SubexpItem
= Subexp
Exp
= label:Label se:Subexp Whitespace ';' Whitespace {
return {from: label, se:(se === [])? undefined: se};
}
ExpList
= exp:Exp*
Whitespace "whitespace"
= [ \t\n\r\v]*