是否有可以使用Wirth语法的解析器生成器?

时间:2011-02-10 21:32:44

标签: parsing programming-languages syntax language-design

ie:http://en.wikipedia.org/wiki/Wirth_syntax_notation

似乎大多数人都使用BNF / EBNF ......

1 个答案:

答案 0 :(得分:5)

维基百科文章所做的区分在我看来就像分裂头发一样。 “BNF / EBNF”长期以来意味着以大致以下形式编写语法规则:

  nonterminal = right_hand_side end_rule_marker

与其他愚蠢的语言差异(C中的“{”,以Pascal开头,endif与fi)一样,你可以通过为end_rule_marker选择不同的呃语法以及你可以说的话来获得截然不同的相同含义对于right_hand_side。

通常人们允许(您选择的)引号,其他非终结名称和EBNF中的文字标记,各种“选择”运算符通常|或/替代方案,*或+代表“重复”,[...]或?可选等等

因为设计语言语法的人正在使用语法,他们似乎每次写下来都会发明自己的语法。 (检查语言标准中的各种语法形式;它们都不相同)。是的,如果有一种标准的方法来写这些东西,我们都会变得更好。但我们不会为C或C ++或C#这样做(甚至微软都不能遵循自己的标准);为什么BNF会有所不同?

因为构建解析器生成器的人通常使用它来解析自己的语法,所以他们可以轻松地为每个解析器生成器定义自己的语法。我从来没有见过一个在维基百科上完全符合“WSN”版本的版本,我怀疑自己是否会在实践中做到这一点。

重要吗?好吧,不。真正重要的是符号后面的解析器生成器的强大功能。你必须弯曲大多数语法以匹配解析器生成器的功能(好,弱);例如,对于LL风格的生成器,你的语法规则不能有左递归(WSN允许根据我的阅读)。构建解析器生成器的人也希望能够方便地表达非解析器问题(例如,“如何构建树节点”),因此它们还为非解析问题添加了额外的表示法。

因此,真正驱动解析器生成器语法的是解析器生成器处理任意语言的弱点,被认为对解析器生成器有价值的额外好处,以及实现它的人的情绪。