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]