4

根据我的经验,形式语法通常以类似于以下的形式表示以逗号分隔的列表:

foo_list -> foo ("," foo)*

有什么替代方法可以避免提及foo两次?虽然这个人为的例子可能看起来很无辜,但我遇到了非平凡的表达而不是foo. 例如:

foo_list -> ( ( bar | baz | cat ) ) ( "," ( bar | baz | cat ) )*
4

2 回答 2

1

我记得我曾经使用过的(专有)解析器生成器,它将这个产品写成

foo_list ::= <* bar | baz | cat ; "," *>

是的,完全一样。上面的实际元字符是有争议的,但我认为一般方法是可以接受的。

在编写另一个解析器生成器时,我曾考虑过类似的东西,但为了保持模型的简单而放弃了它。

语法图当然可以很好地表示它,而不会出现不必要的重复:

foo_list

于 2011-02-16T19:42:15.003 回答
0

在我的实验中,这种语法显示出一些潜力:

foo_list -> ( bar | baz | cat ) ("," ...)*

...标记引用前面的表达式(在本例中为)( bar | baz | cat )

这不是一个完美的解决方案,但我把它放在那里供讨论。

于 2011-02-16T15:13:06.857 回答