1 引言
文法用来描述语言的语法规则,所以不仅可以用在编程语言上,也可用在汉语、英语上。
2 精读
我们将一块语法规则称为 产生式,使用 “Left → Right” 表示任意产生式,用 “Left => Right” 表示产生式的推导过程,比如对于产生式:
E → i
E → E + E
我们进行推导时,可以这样表示:E => E + E => i + E => i + i + E => i + i + i
也有使用 Left : Right 表示产生式的例子,比如 ANTLR。BNF 范式通过 Left ::= Right 表示产生式。
举个例子,比如 SELECT * FROM table 可以被表达为:
S → SELECT * FROM table
当然这是最固定的语法,真实场景中,* 可能被替换为其他单词,而 table 不但可能有其他名字,还可能是个子表达式。
一般用大写的 S 表示文法的开头,称为开始符号。
终结符与非终结符
下面为了方便书写,使用 BNF 范式表示文法。
终结符就是语句的终结,读到它表示产生式分析结束,相反,非终结符就是一个新产生式的开始,比如:
::= SELECT FROM
::= [ , ]
::= [ , ]
所有 ::= 号左边的都是非终结符,所以