这里的快速演示:
{
variables = {
PI : Math.PI,
E : Math.E
};
functions = {
squared : function(n) { return n * n; },
incr : function(n) { return n + 1; }
}
}
start
= additive
additive
= left:multiplicative "+" right:additive { return left + right; }
/multiplicative
multiplicative
= left:power "*" right:additive { return left * right; }
/power
// evaluated left to right!
power
= left:primary "^" right:additive { return Math.pow(left, right); }
/primary
primary
= integer
/"(" e:additive ")" { return e; }
/i:id "(" e:additive ")" { return functions[i.join("")](e); }
/i:id { return variables[i.join("")]; }
integer
= digits:[0-9]+ { return parseInt(digits.join(""), 10); }
id
= [a-zA-Z]+
如果你现在测试解析器(在线)与输入:
PI+incr(squared(3))^2
你会看到它被评价为:
103.1415926535898
谢谢!为了增加十进制数,我在[here](http://nathansuniversity.com/turtle1.html)中添加了包含'number'和'number_frac'的shippet,并将它放在'primary'规则的第一优先级中。请参阅我的答案以获取更新的语法。这看起来不错吗? – mikldk 2014-11-06 08:02:34
尽管在我看来,整数规则永远不会被使用。那是对的吗? – mikldk 2014-11-06 08:10:03
@mikldk,为什么不能使用它?如果不这样做,就永远不会有任何正确评估的表达式(其中*有*)。 – 2014-11-06 10:33:04