-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtaco.pegjs
75 lines (62 loc) · 1.51 KB
/
taco.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
Assign = _ lhs:Access _ "=" _ rhs:Expr _ {
var ret = lhs;
for (var t in rhs) {
ret[t] = (ret.hasOwnProperty(t) && ret[t] !== rhs[t]) ? -1 : rhs[t];
}
return lhs;
}
Expr = head:Term tail:(_ ("+" / "-") _ Term)* {
var ret = head;
for (var i = 0; i < tail.length; ++i) {
var tensors = tail[i][3];
for (var t in tensors) {
ret[t] = (ret.hasOwnProperty(t) && ret[t] !== tensors[t]) ? -1 : tensors[t];
}
}
return ret;
}
Term = head:Factor tail:(_ ("*" / "/") _ Factor)* {
var ret = head;
for (var i = 0; i < tail.length; ++i) {
var tensors = tail[i][3];
for (var t in tensors) {
ret[t] = (ret.hasOwnProperty(t) && ret[t] !== tensors[t]) ? -1 : tensors[t];
}
}
return ret;
}
Factor = tensors:(ParenFactor / NegFactor / Access / Literal) {
return tensors;
}
ParenFactor = "(" _ tensors:Expr _ ")" {
return tensors;
}
NegFactor = "-" _ tensors:Factor {
return tensors;
}
Access = tensor:Var _ order:(UnderscoreVar / UnderscoreVarList / ParenVarList / _) {
var ret = {};
ret[tensor] = order;
return ret;
}
UnderscoreVar = "_" _ Var {
return 1;
}
UnderscoreVarList = "_" _ "{" _ order:VarList _ "}" {
return order;
}
ParenVarList = "(" _ order:VarList _ ")" {
return order;
}
VarList = head:Var tail:(_ "," _ Var)* {
return 1 + tail.length;
}
Var = [a-z]i [a-z/0-9]i* {
return text();
}
Literal = [0-9]+ ("." [0-9]*)? {
return {};
}
_ = [ \t\n\r]* {
return 0;
}