0

我正在玩PEG.js和阅读,在Nathans 大学我找到了一个很好的“解释”如何构建我自己的语言,但我坚持这一步

我不明白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 ")"如果条目没有括号,如果删除该行最后一个测试失败

4

1 回答 1

0

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

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

请注意,这里以两种不同的方式使用“逗号”——既作为规则名称,也作为标签标识符。请参阅PEG.js - 解析表达式类型

标签表达式

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

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

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

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

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

primary =
    integer

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

primary =
    anumber:integer
      { return anumber; }
于 2013-11-05T06:12:01.783 回答