带有预定义函数和变量的PEG.js扩展

PEG.js extension with predefined functions and variables

本文关键字:PEG js 扩展 变量 预定义 函数      更新时间:2023-09-26

我已经了解了用于JavaScript的PEG.js语法分析器生成器。它看起来很漂亮!

我在指定语法方面没有太多经验。我正在寻找帮助,将示例语法扩展到1位,以允许

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

你能帮我在哪里找到帮助吗?

下面是快速演示:

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