根据我的经验,形式语法通常以类似于以下的形式表示以逗号分隔的列表:
foo_list -> foo ("," foo)*
有什么替代方法可以避免提及foo
两次?虽然这个人为的例子可能看起来很无辜,但我遇到了非平凡的表达而不是foo
. 例如:
foo_list -> ( ( bar | baz | cat ) ) ( "," ( bar | baz | cat ) )*
根据我的经验,形式语法通常以类似于以下的形式表示以逗号分隔的列表:
foo_list -> foo ("," foo)*
有什么替代方法可以避免提及foo
两次?虽然这个人为的例子可能看起来很无辜,但我遇到了非平凡的表达而不是foo
. 例如:
foo_list -> ( ( bar | baz | cat ) ) ( "," ( bar | baz | cat ) )*
我记得我曾经使用过的(专有)解析器生成器,它将这个产品写成
foo_list ::= <* bar | baz | cat ; "," *>
是的,完全一样。上面的实际元字符是有争议的,但我认为一般方法是可以接受的。
在编写另一个解析器生成器时,我曾考虑过类似的东西,但为了保持模型的简单而放弃了它。
语法图当然可以很好地表示它,而不会出现不必要的重复:
在我的实验中,这种语法显示出一些潜力:
foo_list -> ( bar | baz | cat ) ("," ...)*
...
标记引用前面的表达式(在本例中为)( bar | baz | cat )
。
这不是一个完美的解决方案,但我把它放在那里供讨论。