-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.pegjs
57 lines (43 loc) · 1.21 KB
/
parser.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
{
var scope = {};
}
start
= additive
additive
= left:geometric ws "+" ws right:additive { return ['+', left, right]; }
/ geometric
geometric "Geometric product"
= left:outer ws "*" ws right:geometric { return ['*', left, right]; }
/ outer
outer "Outer product"
= left:scalar ws "^" ws right:outer { return ['^', left, right]; }
/ scalar
scalar
= left:lcontract ws "%" ws right:scalar { return ['%', left, right]; }
/ lcontract
lcontract "Left contraction"
= left:rcontract ws "<<" ws right:lcontract { return ['<<', left, right]; }
/ rcontract
rcontract "Right contraction"
= left:meet ws ">>" ws right:rcontract { return ['>>', left, right]; }
/ meet
meet
= left:join ws "&" ws right:meet { return ['&', left, right]; }
/ join
join
= left:primary ws "|" ws right:join { return ['|', left, right]; }
/ primary
primary
= integer
/ ref
/ "(" additive:additive ")" { return additive; }
ref "Reference"
= id:(refstart refchar*) { return ['ref', Array.prototype.concat.apply([], id).join('')]; }
refstart
= letter:[a-z]i { return letter; }
refchar
= char:[a-z0-9_]i { return char; }
integer "integer"
= digits:[0-9]+ { return parseInt(digits.join(''), 10); }
ws "Whitespace"
= [\t ]*