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

 

posted @ 2024-05-13 16:49  namezhyp  阅读(12)  评论(0编辑  收藏  举报