28 lines
785 B
JavaScript
28 lines
785 B
JavaScript
const Expression = rule(
|
|
[{head: Term}, {tail: star([_, slash("+", "-"), _, Term])}],
|
|
({head, tail}) => {
|
|
return tail.reduce(function(result, element) {
|
|
if (element[1] === "+") { return result + element[3]; }
|
|
if (element[1] === "-") { return result - element[3]; }
|
|
}, head);
|
|
}
|
|
);
|
|
|
|
const Term = rule(
|
|
[{head: Factor}, {tail: star([_, slash("*", "/"), _, Factor])}],
|
|
({head, tail}) => {
|
|
return tail.reduce(function(result, element) {
|
|
if (element[1] === "*") { return result * element[3]; }
|
|
if (element[1] === "/") { return result / element[3]; }
|
|
}, head);
|
|
}
|
|
);
|
|
|
|
const Factor = slash(
|
|
rule(["(", _, {expr: Expression}, _, ")"], ({expr}) => expr),
|
|
Integer
|
|
);
|
|
|
|
const Integer = rule([_, /[0-9]+/], () => { return parseInt(text(), 10); });
|
|
|
|
const _ = /[ \t\n\r]*/; |