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

Parsing 是否有可以使用Wirth语法的解析器生成器?,parsing,programming-languages,syntax,language-design,Parsing,Programming Languages,Syntax,Language Design,即: 似乎大多数人都使用BNF/EBNF…维基百科文章所做的区分在我看来就像是在吹毛求疵。“BNF/EBNF”长期以来一直意味着以大致如下的形式编写语法规则: nonterminal = right_hand_side end_rule_marker 和其他愚蠢的语言差异一样(“{”在C中,以Pascal开头,endif vs.fi),你可以通过选择不同的,呃,结尾规则标记的语法,以及你可以在右手边说的话,得到非常不同但相同的意思 通常,人们允许在引号、其他非终结名中使用文字标记,对于EB

即:


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

维基百科文章所做的区分在我看来就像是在吹毛求疵。“BNF/EBNF”长期以来一直意味着以大致如下的形式编写语法规则:

  nonterminal = right_hand_side end_rule_marker
和其他愚蠢的语言差异一样(“{”在C中,以Pascal开头,endif vs.fi),你可以通过选择不同的,呃,结尾规则标记的语法,以及你可以在右手边说的话,得到非常不同但相同的意思

通常,人们允许在引号、其他非终结名中使用文字标记,对于EBNF,各种“选择”运算符通常为|或/表示替代项,*或+表示“重复”,[…]或?表示可选项等

因为设计语言语法的人在玩语法,他们每次写下自己都会发明自己。(检查语言标准中的各种语法形式;没有一个是相同的)。是的,如果有一个标准的方法来写这些东西,我们都会更好。但是我们不为C或C++或C语言做这件事。(即使是微软也无法遵循自己的标准);为什么BNF应该有所不同

因为构建解析器生成器的人通常使用它来解析自己的语法,所以他们可以并且很容易地为每个解析器生成器定义自己的语法。我从未在Wikipedia上看到过一个能够精确实现“WSN”版本的解析器生成器,我怀疑我在实践中是否会这样做

这很重要吗?嗯,不。真正重要的是语法分析器生成器在符号后面的能力。你必须改变大多数语法以匹配语法分析器生成器的能力(嗯,弱点);例如,对于LL样式生成器,你的语法规则不能离开递归(根据我的阅读,WSN允许这样做).构建解析器生成器的人还希望能够方便地表达非解析器问题(例如,“如何构建树节点”),因此他们还为非解析问题添加了额外的符号


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

在我看来,维基百科文章所作的区分就像是在吹毛求疵。“BNF/EBNF”长期以来,这意味着要大致按照以下形式编写语法规则:

  nonterminal = right_hand_side end_rule_marker
和其他愚蠢的语言差异一样(“{”在C中,以Pascal开头,endif vs.fi),你可以通过选择不同的,呃,结尾规则标记的语法,以及你可以在右手边说的话,得到非常不同但相同的意思

通常,人们允许在引号、其他非终结名中使用文字标记,对于EBNF,各种“选择”运算符通常为|或/表示替代项,*或+表示“重复”,[…]或?表示可选项等

因为设计语言语法的人在玩语法,他们每次写下自己都会发明自己。(检查语言标准中的各种语法形式;没有一个是相同的)。是的,如果有一个标准的方法来写这些东西,我们都会更好。但是我们不为C或C++或C语言做这件事。(即使是微软也无法遵循自己的标准);为什么BNF应该有所不同

因为构建解析器生成器的人通常使用它来解析自己的语法,所以他们可以并且很容易地为每个解析器生成器定义自己的语法。我从未在Wikipedia上看到过一个能够精确实现“WSN”版本的解析器生成器,我怀疑我在实践中是否会这样做

这很重要吗?嗯,不。真正重要的是语法分析器生成器在符号后面的能力。你必须改变大多数语法以匹配语法分析器生成器的能力(嗯,弱点);例如,对于LL样式生成器,你的语法规则不能离开递归(根据我的阅读,WSN允许这样做).构建解析器生成器的人还希望能够方便地表达非解析器问题(例如,“如何构建树节点”),因此他们还为非解析问题添加了额外的符号

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