EBNF

扩展巴科斯-瑙尔范式(EBNF, Extended Backus–Naur Form) 是表达作为描述计算机编程语言形式语言(是用精确的数学或机器可处理的公式定义的语言) 的正规方式的上下文无关文法 的元语法(metalanguage)符号表示法。它是巴科斯范式(BNF) 元语法符号表示法的一种扩展。

简单的理解就是用来描述语言词法和语法规则的语言

ISO/IEC 14977标准

基本形式

LEFT=RIGHT 意思为LEFT可由RIGHT推导而来,LEFT为非终结符,RIGHT可以为非终结符也可以为终结符; 非终结符 简单的理解就是可以继续推导的符号 终结符 不可被推导的符号

符号

符号含义示例
=定义CharA=“a”; 代表CharA由字母a推导而来
,连接符a,b,c 代表abc是挨着的
;结束符CharA=“a”; 代表 CharA这条语句定义结束
|或者digit = “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9”;
[…]可选,出现0次或1次number = ["-"|"+"],digit 可匹配 1 -1 +1 …
{…}重复,出现>=0次number = ["-"|"+"],digit,{digit} 可匹配 1 -1 +1 11 …
(…)分组number = ("-"|"+"),digit 符号必须添加,可匹配 -1 +1 …
“…“或者’…'终结符,单引号主要是一些特殊情况,比如双引号“a"或者’a’ 由单或双引号引起来的部分是终结符,就是代表字母a,不可继续推导
(* … *)注释(*我是注释*) 注释不参与定义
?…?表示其中的内容具有特殊含义,对该含义的定义不在 EBNF 标准之内,有使用者来决定space = ? US-ASCII character 32 ?;
-排除(将右边的内容从左边进行排除)string= allVistableChar - '’ 表示在allVistableChar里排除"字符

示例

只允许赋值的简单编程语言可以用 EBNF

(* a simple program in EBNF − Wikipedia *)
 program = 'PROGRAM' , white space , identifier , white space ,
            'BEGIN' , white space ,
            { assignment , ";" , white space } ,
            'END.' ;
 identifier = alphabetic character , [ { alphabetic character | digit } ] ;
 number = [ "-" ] , digit , [ { digit } ] ;
 string = '"' , { all characters  '"' } , '"' ;
 assignment = identifier , ":=" , ( number | identifier | string ) ;
 alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G"
                      | "H" | "I" | "J" | "K" | "L" | "M" | "N"
                      | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
                      | "V" | "W" | "X" | "Y" | "Z" ;
 digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
 white space = ? white space characters ? ;
 all characters = ? all visible characters ? ;

可匹配的例子

PROGRAM DEMO1 
 BEGIN
   A0:=3;
   B:=45;
   H:=-100023;
   C:=A;
   D123:=B34A;
   BABOON:=GIRAFFE;
   TEXT:="Hello world!";
 END.

W3C标准(更常用的标准)

基本形式

LEFT ::= RIGHT 和ISO标准的基本形式差异在定义符号变成 ::=

符号(有点类似正则表达式)

符号含义示例
#xN单个字符,N为十六进制数#x61 代表unicode的codepoint,也就是0x61字母a
[a-zA-Z],[#xN-#xM]字符区间[a-zA-Z]代表大小写字母
[abc], [#xM#xN#xQ]字符枚举[abc]代表abc任意一个
[^a-z]排除区间[^a-z]排除a-z中的字符
[^abc]枚举排除[^abc]不包含abc
“…”,’…'终结符“string"同ISO
(…)分组同ISO
A?匹配0次或1次,同ISO选择[]‘a’? 标识不出现或者出现1次
A B连接,表示A后面跟着B“a” “b” 字母a后面是字母b
A | B选择,同ISO“A”|“B”
A+表示一个或者多个>0次“A”+
A*表示>=0次“A”*
A{n}表示n次“A”{3}
A{n,}表示n次以上“A”{3,}
A{n,m}表示n-m次“A”{3,5}
/*…*/注释/*这是注释*/
/* a simple program in EBNF  Wikipedia */
program ::= 'PROGRAM' whiteSpace identifier whiteSpace 'BEGIN'  whiteSpace  (assignment  ";")*  'END.'
assignment ::= identifier  ":="  ( number | identifier | string ) 
string ::= '"' [A-Z0-9_]+ '"'
identifier ::= [A-Z] [0-9A-Z]*
whiteSpace ::= [#x20]