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