2014-10-09 47 views
4

我看了一下用于JavaScript的PEG.js解析器生成器。它看起来相当不错!具有预定义函数和变量的PEG.js扩展

我对指定语法没有太多经验。我正在寻找帮助,在1扩展示例语法有点允许

  1. 十进制数
  2. 操作^
  3. 预定义的功能(不是函数声明,只调用一些功能,我事先说明) ,其中参数本身是一阶表达式,例如f(g(2 + 4)+ 3)
  4. 变量AZ(不是声明,只是用法定义 - 这些意味着指向一个也包含程序的输入框,字母A到Z就足够了)

你能帮我找到帮助吗?

回答

4

这里的快速演示:

{ 
    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 
+0

谢谢!为了增加十进制数,我在[here](http://nathansuniversity.com/turtle1.html)中添加了包含'number'和'number_frac'的shippet,并将它放在'primary'规则的第一优先级中。请参阅我的答案以获取更新的语法。这看起来不错吗? – mikldk 2014-11-06 08:02:34

+0

尽管在我看来,整数规则永远不会被使用。那是对的吗? – mikldk 2014-11-06 08:10:03

+0

@mikldk,为什么不能使用它?如果不这样做,就永远不会有任何正确评估的表达式(其中*有*)。 – 2014-11-06 10:33:04

-1
{ 
    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:power { return left * right; } 
/power 

// evaluated left to right! 
power 
= left:primary "^" right:primary { return Math.pow(left, right); } 
/primary 

primary 
= number 
/integer 
/"(" e:additive ")"  { return e; } 
/i:id "(" e:additive ")" { return functions[i.join("")](e); } 
/i:id     { return variables[i.join("")]; } 

number_frac 
    = "." chars:[0-9]* { return "." + chars.join(''); } 

number 
    = chars:[0-9]+ frac:number_frac? { return parseFloat(chars.join('') + frac); } 

integer 
    = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 

id 
= [a-zA-Z]+