Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PEGjs:请求定义算术函数的帮助/指南_Javascript_Context Free Grammar_Pegjs - Fatal编程技术网

Javascript PEGjs:请求定义算术函数的帮助/指南

Javascript PEGjs:请求定义算术函数的帮助/指南,javascript,context-free-grammar,pegjs,Javascript,Context Free Grammar,Pegjs,我正在学习PEGjs语法,我请求以下方面的帮助或指导: 我的函数有,PRODUCT()、SUM()、DIVIDE() PRODUCT可以使用number/PRODUCT()/SUM()/DIVIDE()作为参数(除逗号分隔外的任何数字) 同样的方法,总和可以接受任何数量的参数,这些参数用逗号分隔 Ex: SUM(4, 5, 10, DIVIDE(SUM(2, 5, 6), 3)) “除法”将采用两个参数(2个必须)、数字或其他函数 Ex: DIVIDE(3, PRODUCT(3, 4, SUM

我正在学习PEGjs语法,我请求以下方面的帮助或指导:

我的函数有,
PRODUCT()、SUM()、DIVIDE()

PRODUCT可以使用number
/PRODUCT()/SUM()/DIVIDE(
)作为参数(除逗号分隔外的任何数字)

同样的方法,总和可以接受任何数量的参数,这些参数用逗号分隔

Ex: SUM(4, 5, 10, DIVIDE(SUM(2, 5, 6), 3))
“除法”将采用两个参数(2个必须)、数字或其他函数

Ex: DIVIDE(3, PRODUCT(3, 4, SUM(2, 3)))
有人能帮助或指导我如何取得成功吗

我到目前为止的规则

start = sum
  /multiply

multiply = "PRODUCT("a:digit "," __ b:digit ")" {return a * b}

sum = "SUM("a:digit "," b:digit ")"  {return a + b}

digit = [0-9]

__ = WhiteSpace*

WhiteSpace "whitespace"
  = [ \t\r\n]
上述规则仅支持两个数字的乘积/和。我怎样才能实现上述目标

提前谢谢
Manjunath Reddy

这是一个很好的开始,但您需要弄清楚如何解析参数列表并进行更多的递归

我发现最好的学习方法是通过例子()

请尝试以下步骤:

示例:

PRODUCT(2, 5, SUM(5, 6, 7), DIVIDE(5, 2), PRODUCT(4, 6, 20, 12))
2592000
SUM(4, 5, 10, DIVIDE(SUM(2, 5, 6), 3))
23.333333333333332
DIVIDE(3, PRODUCT(3, 4, SUM(2, 3)))
0.05

通常,如果您想要解析一个无界列表,例如

1, 2, 3, 4
您可以按如下方式创建递归规则:

args = head:Integer rest:(_ "," _ r:args{ return r; })? {
    return rest != null ? [head].concat(rest) : [head];
}

Integer = [0-9]+ { return parseInt(text(), 10); }

_ = [ \t\n\r]*

非常感谢你的帮助。
1, 2, 3, 4
args = head:Integer rest:(_ "," _ r:args{ return r; })? {
    return rest != null ? [head].concat(rest) : [head];
}

Integer = [0-9]+ { return parseInt(text(), 10); }

_ = [ \t\n\r]*