维基百科关于PEG解析器的文章定义了以下组合器:
2.Given any existing parsing expressions e, e1, and e2,
a new parsing expression can be constructed using the following operators:
Sequence: e1 e2
Ordered choice: e1 / e2
Zero-or-more: e*
One-or-more: e+
Optional: e?
And-predicate: &e
Not-predicate: !e
所有这些组合器真的有必要吗?在我看来,Optional和One-Or-More可以很容易地实现为
e+ = e* & e
e? = e / ""
我是否正确地说这个,或者是否有一些基本要求这两种形式是独立的原子?我正在构建自己的PEG解析器,跳过这两个解析器(或者用其他组合器来定义它们)会很方便,但我想确保我没有遗漏任何重要的东西。
答案 0 :(得分:1)
你是对的,只是e+
被写成没有&
的序列。
e+ := e e*
答案 1 :(得分:0)
[扩展你和280Z28所说的......]
+
可以根据序列和*
以及可能&
来定义(虽然后一种扩展并不常用):
x+ == x x*
x+ == &x x*
?
可以根据选择来定义:
x? == x / (empty)
&
可以用!
:
&x = !!x