【发布时间】:2014-09-06 13:11:04
【问题描述】:
我已经定义了以下最小的 Peg.js 语法:
start = "A1" / "A123"
你可以试试in the sandbox。
我本来希望匹配“A1”和“A123”(根据我对回溯如何工作的概念)。但事实并非如此:语法识别“A1”但不识别“A123”。
注意:我不是在寻找相关问题How to transform a simple grammar into something which works in PEG.js (expected "a" but "a" found) 中的“颠倒您的术语顺序”的建议。相反,我希望了解我所看到的行为,以及为什么 Peg.js 的回溯不适用于这种情况。有关为什么颠倒我的术语顺序没有帮助的解释,请参阅下面更现实的示例。
举一个更现实的例子,考虑单位解析。语法应该识别带有可选前缀的公制单位(如“m”、“mol”),如“mm”、“mmol”,以及非公制单位,如“yr”、“week”或“mo”。
以下 Peg.js 语法无法识别“mol”,因为它在使用“mo”时会出错,并且不会回溯。 (更改术语的顺序无济于事;或者更确切地说,会导致以牺牲“mol”或“mmol”为代价来识别“mo”。)
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';
【问题讨论】:
-
感谢您在尝试学习来自 Antlr 的 Peg.js 时为这个问题提供了很好的示例。它真的帮助我理解了我的语法到底出了什么问题。