這裏的快速演示:
{
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