用于表示逗号分隔列表的语法表达式

时间:2011-02-16 14:40:53

标签: parsing grammar context-free-grammar

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

foo_list -> foo ("," foo)*

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

当编写另一个解析器生成器时,我考虑了一段时间的相似之处,但放弃它以支持保持模型简单。

当然,语法图可以很好地代表它而不会产生不必要的重复:

foo_list

答案 1 :(得分:0)

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

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

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

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