ysyx:BNF表达式
BNF表达式以前没有学过,ysyx的nemu项目里用到了,在这里整理一下学习笔记。
BNF表达式可以简洁地定义一种语言的格式 ,基本格式为:<non-terminal> ::= <replacement> 。non-terminal为”非终止符号“,replacement为代替物,可以用于诠释左边的内容。
举个例子:
<句子> ::= <主语><谓语><宾语><主语> ::= <名词>|<代词><谓语> ::= <动词><宾语> ::= <形容词>|<名词>|<代词><代词> ::= <我><动词> ::= <吃><动词> ::= <喜欢><名词> ::= <车><名词> ::= <肉>
在中文语法里,一个句子一般由“主语”、“谓语”和“宾语”组成,主语可以是名词或者代词,谓语一般是动词,宾语可以使形容词,名词或者代词。
那么“主语”、“谓语”和“宾语”就是非终止符,因为还可以继续由“名词”、“代词”、“动词”、“形容词”等替代。什么时候结束定义呢?
左边的非终止符被右边的替代物诠释,替代物可以还是非终止符,也可以是车、肉这样的终止符,表示到此为止。就这样把句子语法拆解为基本的元素。
所有非终止符都被拆解为终止符的时候,定义就完成了。
基本语法如下:
::= //意思就是:“定义为” <A> //A为必选项 “A” //A是一个术语,不用翻译 'A' //A是一个术语,不用翻译 [A] //A是可选项 {A} //A是重复项,可出现任意次数,包括0次 A* //A是重复项,可出现任意次数,包括0次 A+ //A可出现1次或多次 (A B) //A和B被组合在一起 A|B //A、B是并列选项,只能选一个
举例:
stringliteral ::= [stringprefix](shortstring | longstring)
这句的含义就是一个字符串字面量(stringliteral)的定义。 表示一个字面量可以有前缀,但是有shortstring或longstring其中之一,也只能是之一。
BNF定义还支持递归定义。上面提到的前缀stringprefix可以继续定义,shortstring和longstring也是如此。类似写作文的总--分关系。
参考:https://www.zhihu.com/question/27051306