【发布时间】:2016-05-09 13:36:43
【问题描述】:
假设我们有三个元素 a b 和 c。
一个有效的表达式使用这三个元素(和可选的空格)。
- 必须存在这三个元素中的至少一个。
- 所有三个元素都是可选的(只要存在其他两个元素中的至少一个,请参见 1)。
- 这三个元素的提供顺序并不重要。
有没有一种惯用的方式写出满足这三个要求的 PEG 语法?
我在http://pegjs.org/online 使用 peg.js 并解决了 (1) (lookahead) 和 (2),但 (3) 让我无法理解。有什么建议吗?
e = &(a / b / c) (a? b? c?)
a = 'a' _
b = 'b' _
c = 'c' _
_ = [ \t]*
【问题讨论】:
-
生产
&(a / b / c) (a? b? c?)满足第3点,不是吗? -
不,不满足规则 (3):由于 PEG 的贪婪,提供的语法检测到
a b c、a b、a c、b、b c和c但不是c b或c b a等安排。 -
这与贪婪无关。它与
c b不匹配,因为(a? b? c?)要求b位于c之前。无论 PEG 是否贪婪,这都是正确的;也就是说,非 PEG 回溯匹配器也是如此。 -
感谢您直言不讳!
标签: parsing grammar antlr4 peg pegjs