BNF范式
最近在学习关于词法/语法分析的知识,看到yacc采用BNF范式定义语法规则,此前没有接触过BNF,发现其实以前看过的许多文档中的协议与语法定义都是采用了BNF或扩充巴科斯范式(ABNF)和扩展巴克斯范式(EBNF)。之前在分析微软的SQL Server数据库的TDS协议文档时,还用了好久去总结符号标识的意义,现在看来是自己孤陋寡闻连大名鼎鼎的BNF都不懂。(一看就知道编译原理就没好好学)
几个简单概念
形式文法
一个形式文法G是下述元素构成的一个四元组(N, Σ, P, S):
“非终结符号”集合N。
“终结符号”集合Σ,Σ与N无交。
“产生式规则” P,
“起始符号”S,S属于N。
通俗地理解,就是一个文法的解释,需要一个产生的规则,里边允许递推扩展文法,但是总需要一个终结符来结束这句话,不会无限的递推下去。而开始的标志则可以来源于非终结符号。
上下文无关文法
BNF是一种用于描述上下文无关语法的规范,那么什么是上下文无关文法呢?概念定义就不再叙述,意会地理解,即把上下文去掉,无视语境,这个词如何解释是不变的。
BNF的应用
我们的自然语言通常来说都是需要语境的,就无法用BNF这样的上下文无关文法来定义。但是程序语言都是上下文无关的,都可以以BNF的形式定义出来。不过现在多数是以EBNF扩展巴克斯范式来定义的。
BNF语法
1 | BNF范式的产生规则 |
EBNF语法
用途 | 符号表示 |
---|---|
定义 | = |
串接 | , |
终止 | ; |
分隔 | | |
可选 | [ … ] |
重复 | {…} |
分组 | ( … ) |
单引号 | ‘ … ‘ |
双引号 | “ … “ |
注释 | (* … *) |
特殊序列 | ? … ? |
除外 | - |