我定义了以下最小的 Peg.js 语法:
start = "A1" / "A123"
您可以在沙盒中尝试。
我本来希望匹配“A1”和“A123”(根据我对回溯如何工作的概念)。但事实并非如此:语法识别“A1”但不识别“A123”。
注意:我不是在寻找相关问题“如何将简单的语法转换为适用于 PEG.js 的东西”中的“颠倒你的术语的顺序”的建议(预期为“a”,但找到了“a”)。相反,我希望了解我所看到的行为,以及为什么 Peg.js 的回溯不适用于这种情况。有关为什么颠倒我的术语顺序没有帮助的解释,请参阅下面更现实的示例。
举一个更现实的例子,考虑单位解析。语法应该识别带有可选前缀的公制单位(如“m”、“mol”),如“mm”、“mmol”,以及非公制单位,如“yr”、“week”或“mo”。
以下 Peg.js 语法无法识别“mol”,因为它在使用“mo”时会出错,并且不会回溯。(更改术语的顺序无济于事;或者更确切地说,会导致“mo”以牺牲“mol”或“mmol”为代价而被识别。)
start = nonmetric / metric / prefix metric
metric = "mol" / "l" / "m" / "g"
nonmetric = "yr" / "mo" / "week" / "day" / "hour"
prefix = "m" / "k" / "c"
我可以在 Antlr 中成功地做类似的事情:
grammar units;
start : nonmetric | metric | prefix metric;
metric : 'mol' | 'l' | 'm' | 'g';
nonmetric : 'yr' | 'mo' | 'week' | 'day' | 'hour';
prefix : 'm' | 'k' | 'c';