解析器由于评估前一个规则而出错,因此无法匹配后续规则

时间:2019-06-10 11:44:32

标签: javascript peg pegjs

示例:

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 = invocation / name;

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

有关工作示例,请参见playground

1 个答案:

答案 0 :(得分:0)

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

来自wikipedia

  

上下文无关文法与解析之间的根本区别   表达式语法是PEG的选择运算符是有序的。如果   第一个选择成功,第二个选择被忽略。   因此,有序选择不是可交换的,这与无序选择不同   上下文无关的语法。