一、基本定义
Linux的命令格式其实也是依据BNF范式(巴科斯范式)的,BNF规定的是推导规则的集合,可简单的写为
<符号> ::= <使用符号的表达式> 或
symbol := alternative1 | alternative2 ...
每条规则用::=或:=来声明,左侧的符号必须被右侧的表达式,或表达式的可选项替代。表达式由一个符号序列,或用指示选择的竖杠'|' 分隔的多个符号序列构成。
其中这些符号序列也可以是通过::=相同规则定义的一种可能替代。
从未在左端出现的符号叫做终结符,之所以叫做终结符是因为没有针对他们的书写规范,他们是书写过程的终止(符号通常被叫做非终止符,也有人叫非终端)。
二、BNF规则
BNF巴科斯范式,规则如下
在双引号中的字("word")代表着这些字符本身。
在双引号外的字(有可能有下划线)代表着语法部分。
括号 () 表示分组的意思
尖括号( < > )内包含的为必选项,尖括号括起来的是非终结符
方括号( [ ] )内包含的为可选项。
大括号( { } )内包含的为可重复0至无数次的项。
竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。
::= 是“被定义为”的意思。
例linux下的某些命令的写法:
./rte-app -c COREMASK -n NUM [-b <domain:bus:devid.func>] [--socket-mem=MB,...] [-m MB] [-r NUM] [-v] [--file-prefix] [--proc-type <primary|secondary|auto>]
上面的[ ]中的是可选项目,-b是命令,若带有这个命令,则必须有<domain:bus:devid.func>中的条目
三、扩展
1)C语言的声明语句可以用BNF描述:
<声明语句> ::= <类型><标识符>; | <类型><标识符>[<数字>];
1、这一句中<声明语句>这个非终结符被定义成了两种形式(上面用|隔开的两部分),同时在这里引入了三个终结符: 分号; 左方括号[,右方括号 ]。
2、这一语句的实际含义可以理解为:声明语句定义形式为:类型+标识符,或类型+标识符+数字
下面可以进一步分解该描述中的描述符,如下:
<类型> ::= <简单类型> | <指针类型> | <自定义类型>
<指针类型> ::= <简单类型> * | <自定义类型> *
<简单类型> ::= int|char|double|float|long|short|void
<自定义类型> ::= enum<标识符>|struct<标识符>|union<标识符>|<标识符>
2)Java语言中的For语句的实例:
FOR_STATEMENT ::= "for" "(" ( (variable_declaration ";") | ( expression ";" ) | ";" ) [ expression ] ";" [ expression ] ")" statement