Javascript 你能解释什么是必要的吗?这是一个额外的规则

Javascript 你能解释什么是必要的吗?这是一个额外的规则,javascript,peg,Javascript,Peg,我在游戏和阅读中,我发现了一个很好的“解释”如何构建自己的语言,但我坚持这一步 我不懂主要的可以给我解释一下吗 start = comma comma = left: additive "," right:comma { return {tag: ",", left:left, right:right}; } / additive additive = left:multiplicative "+" right:additive

我在游戏和阅读中,我发现了一个很好的“解释”如何构建自己的语言,但我坚持这一步

我不懂
主要的
可以给我解释一下吗

start =
    comma

comma = 
    left: additive "," right:comma 
        { return {tag: ",", left:left, right:right}; }
    / additive

additive =
    left:multiplicative "+" right:additive
        { return {tag: "+", left:left, right:right}; }
  / multiplicative

multiplicative =
    left:primary "*" right:multiplicative
        { return {tag: "*", left:left, right:right}; }
  / primary

primary =
    integer
  / "(" comma:comma  ")" # Can explain me why is necesary "(" and ")"
      { return comma; }

integer =
    digits:[0-9]+
        { return parseInt(digits.join(""), 10); }
测试
我的问题是为什么必须使用
/“(“逗号:逗号”)”
如果条目没有括号,如果删除该行,则最后一次测试失败

对于
主规则
来说,所讨论的行是另一个表达式的第一部分——仅当
整数
不匹配时才进行测试

此备用表达式在
/
之后开始,并包含相应的操作块:
{return comma;}

请注意,“逗号”在这里以两种不同的方式使用——既作为规则名称,也作为标签标识符。见:

标签:表达式

匹配表达式并记住其在给定标签下的匹配结果。标签必须是JavaScript标识符

所以,
integer/“(“逗号:逗号”)”
首先尝试匹配
integer
;如果失败,它将尝试匹配整个第二个表达式

标签可以是任何有效的JavaScript标识符。请考虑下面的片段,它在功能上相当于你的例子:

primary =
    integer
  / "(" result:comma ")"
      { return result; }
如果括号不相关,则可以省略整个第二个表达式,只留下:

primary =
    integer
作为标签的另一个快速示例,这也会起作用(但是多余的):


这可能很明显,但是
不是一个
整数
就是一个
逗号
()
s包围。你到底怀疑什么?如果你去掉“/”(“逗号:逗号”)“`行,样本就不正确;想想
/
后面的两行,比如
函数(逗号){return comma;}
。您只删除了
函数(逗号)
部分,显然留下了后面的相关
{return comma;}
部分?如果删除有问题的行,还必须删除相关操作。。。
primary =
    integer
primary =
    anumber:integer
      { return anumber; }