Sheva is a Parser combinator library in JS.
npm install sheva
- Calculator
var parser = require("sheva")();
(function(){
var And = parser.And.bind(parser)
var Or = parser.Or.bind(parser)
var MoreThan = parser.MoreThan.bind(parser)
var Optional = parser.Optional.bind(parser)
var Is = parser.Is.bind(parser)
var Digit = parser.Digit.bind(parser)
var $ = parser.$.bind(parser)
parser.token({
"LB" : Is("("),
"RB" : Is(")"),
"PLUS" : Is("+"),
"MINUS" : Is("-"),
"MUL" : Is("*"),
"DIV" : Is("/"),
"NUM" : (function () {
var digits = MoreThan(0, Digit)
var sign = Or(Is("-"), Is("+"))
var dot = Is(".")
return And(Optional(sign), digits, Optional(And(dot, digits)))
})()
})
parser.grammar({
"Expr" : And($("Term"), Optional(MoreThan(0, $("MoreExpr")))),
"MoreExpr" : And($("TermOp"), $("Term")),
"Term" : And($("Factor"), Optional(MoreThan(0, $("MoreTerm")))),
"MoreTerm" : And($("FactorOp"), $("Factor")),
"TermOp" : Or(Is("PLUS"), Is("MINUS")),
"Factor" : Or($("P-Expr"), Is("NUM")),
"P-Expr" : And(Is("LB"), $("Expr"), Is("RB")),
"FactorOp" : Or(Is("MUL"), Is("DIV"))
})
parser.action({
"NUM" : function (n) { n.extra = parseFloat(n.value) },
"Factor" : function (n) { n.extra = n.children[0].extra },
"MoreTerm" : function (n) { n.extra = n.children[1].extra },
"MoreExpr" : function (n) { n.extra = n.children[1].extra },
"P-Expr" : function (n) { n.extra = n.children[1].extra },
"Term" : function (n) {
n.extra = n.children[0].extra
var child = n.children[1]
for (var i = 0; child && i < child.children.length; i+=2) {
var FactorOp = child.children[i]
var Factor = child.children[i+1]
switch (FactorOp.value) {
case "*": n.extra *= Factor.extra;break;
case "/": n.extra /= Factor.extra;break;
}
}
},
"Expr" : function (n) {
n.extra = n.children[0].extra
var child = n.children[1]
for (var i = 0; child && i < child.children.length; i+=2) {
var TermOp = child.children[i]
var Term = child.children[i+1]
switch (TermOp.value) {
case "+": n.extra += Term.extra;break;
case "-": n.extra -= Term.extra;break;
}
}
},
})
console.log(parser.parse("Expr", "(1+2)*(3+4+5)"))
})()
miaoever
MIT