可以解释什么是这个PEG的额外规则的必要条件

时间:2013-11-05 04:21:17

标签: javascript peg

我正在玩PEG.js阅读并在Nathans University我发现了一个很好的“解释”如何建立我自己的语言,但我坚持这一步

我不明白primary可以解释我

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); }

测试

var parse = wrapExceptions(PEG.buildParser(answer).parse);

assert_eq(parse("1+2"),
    {tag:"+", left:1, right:2},
    "parse 1+2");
assert_eq(parse("1+2*3"),
    {tag:"+", left:1, right:{tag:"*", left:2, right:3}},
    "parse 1+2*3");
assert_eq(parse("1,2"),
    {tag:",", left:1, right:2},
    "parse 1,2");
assert_eq(parse("1,2+3"),
    {tag:",", left:1, right:{tag:"+", left:2, right:3}},
    "parse 1,2+3");
assert_eq(parse("1*2,3"),
    {tag:",", left:{tag:"*", left:1, right:2}, right:3},
    "parse 1*2,3");

我的问题是,如果条目没有括号,为什么需要/ "(" comma:comma ")",如果最后一次测试失败则删除该行

1 个答案:

答案 0 :(得分:0)

有问题的行是替换表达式的第一部分,对于primary规则 - 仅在integer不匹配时才会进行测试。

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

请注意,“逗号”在此处以两种不同的方式使用 - 既作为规则名称又作为标签标识符。见PEG.js - Parsing Expression Types

  

标签 表达

     

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

因此,integer / "(" comma:comma ")"首先尝试匹配integer;如果失败则尝试匹配整个第二个表达式。

标签可以是任何有效的JavaScript标识符。请考虑以下代码段,它在功能上与您的示例等效:

primary =
    integer
  / "(" result:comma ")"
      { return result; }

如果括号不相关,那么您可以省略整个第二个表达式,只留下:

primary =
    integer

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

primary =
    anumber:integer
      { return anumber; }