2014-10-09 43 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]+