我正在玩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 ")"
,如果最后一次测试失败则删除该行
答案 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; }