0

例子:

start = name / invocation;

name = [a-zA-Z]+ { return text() };

invocation = a:name "()" { return {type: 'inv', value: a } };

如果输入是abc()我收到错误:

Expected [a-zA-Z] or end of input but "(" found

但是,如果 start 定义如下,则不会出现问题:

start = invocation / name;

对于较早的情况,名称规则不应该不匹配并因此进入调用规则吗?否则如何管理这样的事情?

有关工作示例,请参阅操场

4

1 回答 1

0

这是解析器表达式语法的一个属性。更改选择运算符中的表达式顺序可以更改结果。

来自维基百科

上下文无关文法和解析表达式文法的根本区别在于 PEG 的选择运算符是有序的。如果第一个备选方案成功,则第二个备选方案将被忽略。因此,有序选择不是可交换的,这与上下文无关文法中的无序选择不同。

于 2019-06-11T11:11:17.077 回答