use*_*904 1 syntax parsing programming-languages language-design
即:http://en.wikipedia.org/wiki/Wirth_syntax_notation
似乎大多数人使用BNF/EBNF ......
维基百科文章所做的区分在我看来就像分裂头发一样."BNF/EBNF"长期以来意味着以大致以下形式编写语法规则:
nonterminal = right_hand_side end_rule_marker
Run Code Online (Sandbox Code Playgroud)
与其他愚蠢的langauge差异("{",在C,开始帕斯卡尔,ENDIF与网络连接),您可以通过选择不同的,呃,语法end_rule_marker和你不许说了什么right_hand_side得到非常不同的期待,但相同的含义.
通常,人们允许(您选择的)引号,其他非终结名称和EBNF中的文字标记,各种"选择"运算符通常| 或/替代方案,*或+代表"重复",[...]或?可选等
因为设计语言语法的人正在使用语法,他们似乎每次写下来都会发明自己的语法.(检查语言标准中的各种语法形式;它们都不相同).是的,如果有一种标准的方法来写这些东西,我们都会变得更好.但我们不会为C或C++或C#这样做(甚至微软都不能遵循自己的标准); 为什么BNF会有所不同?
因为构建解析器生成器的人通常使用它来解析自己的语法,所以他们可以轻松地为每个解析器生成器定义自己的语法.我从来没有见过一个在维基百科上做过"WSN"版本的版本,而且我怀疑自己是否会在实践中做到这一点.
这有多重要吗?好吧,不.真正重要的是符号后面的解析器生成器的强大功能.你必须弯曲大多数语法以匹配解析器生成器的功能(好,弱); 例如,对于LL风格的生成器,你的语法规则不能有左递归(WSN允许根据我的阅读).人们构建解析器生成也希望以方便来表达非解析器问题(如,"如何建立树节点")等也增加额外的符号来表示非解析问题.
那么真正驱动解析器生成器语法的是解析器生成器处理任意语言的弱点,被认为对解析器生成器有价值的额外好处,以及实现它的人的情绪.