扩展 Backus–Naur 范式
扩展巴科斯–诺尔范式 | |
---|---|
术语名称 | 扩展巴科斯–诺尔范式 |
英语名称 | extended Backus–Naur form |
别名 | EBNF, 扩展巴克斯–瑙尔范式, 扩展BNF, extended BNF |
扩展巴科斯–诺尔范式(extended Backus–Naur form)或扩展 BNF ,缩写为 EBNF ,指为上下文无关文法设计的形式元语言语法 BNF 的扩展。 EBNF 简化了一些常用语法的表示。
由于 EBNF ,去除了繁杂的尖括号并补充了一些常用表示,比起 BNF 更加好读。 因此 EBNF 在教学和语法说明中广泛存在,使用场合往往是向人类说明而非严格定义,因此形式不完全固定且往往混入更多方便的符号,导致其存在着很多非正式的变体。 这些过多的细微变体导致了一定混乱,且最后也没有出现成功统一的标准。
一个比较常见的变体是 ISO/IEC 14977 ,本文也以此为准。
形式语言定义
定义形式语言的字母表和规则如下:
字母表
BNF 的字母表是以下集合的并集:
- 文法符号(终结符和非终结符的统称)集合
- 终结符的集合 [math]\displaystyle{ V_N }[/math] ,其中任意元素都是字面量。字面量形式上使用双引号包围,如
"abc"
等;特别地,允许出现空串""
,当需要双引号字符时可以使用单引号包围以免产生混淆'"'
; - 非终结符的集合 [math]\displaystyle{ V_T }[/math] 。非终结符是正常的短语,可以包含空格,如
digit
或digit excluding zero
;
- 终结符的集合 [math]\displaystyle{ V_N }[/math] ,其中任意元素都是字面量。字面量形式上使用双引号包围,如
- 辅助符号的集合,包括:
- 推导符号
=
; - 连接符号
,
; - 规则结束分隔符
;
; - 选择符号
|
; - 可选符号
[
和]
,或(/
和/)
; - 重复符号
{
和}
,或(:
和:)
; - 分组符号
(
和)
; - 注释
(*
和*)
- 特殊序列
?
; - 排除
-
。
- 推导符号
规则
BNF 定义
<syntax> ::= <rule> | <rule> <syntax>
<rule> ::= <whitespace> <rule-name> <whitespace> "=" <whitespace> <rhs> <line-end>
<opt-whitespace> ::= <whitespace> <opt-whitespace> | ""
<line-end> ::= ";" | "."
<rhs> ::= <alternation>
<alternation> ::= <alternation> | <alternation> <opt-whitespace> "|" <opt-whitespace> <concatenation>
<concatenation> ::= <concatenation> | <concatenation> <opt-whitespace> "," <opt-whitespace> <factor>
<factor> ::= <term> | <term> <opt-whitespace> "-" <opt-whitespace> <term>
<term> ::= <literal> | <special> | <rule-name> | "(" <opt-whitespace> <rhs> <opt-whitespace> ")" | "[" <opt-whitespace> <rhs> <opt-whitespace> "]" | "{" <opt-whitespace> <rhs> <opt-whitespace> "}"
<literal> ::= '"' <text1> '"' | "'" <text2> "'"
<text1> ::= "" | <character1> <text1>
<text2> ::= "" | <character2> <text2>
<special> ::= "?" <opt-whitespace> <special-text> <opt-whitespace> "?"
<special-text> ::= <character> <special-text>
<character> ::= <letter> | <digit> | <symbol>
<letter> ::= "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" | "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"
<symbol> ::= "|" | " " | "!" | "#" | "$" | "%" | "&" | "(" | ")" | "*" | "+" | "," | "-" | "." | "/" | ":" | ";" | ">" | "=" | "<" | "?" | "@" | "[" | "\" | "]" | "^" | "_" | "`" | "{" | "}" | "~"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\b"
<character1> ::= <character> | "'"
<character2> ::= <character> | '"'
<rule-name> ::= <letter> | <rule-name> <rule-char>
<rule-char> ::= <letter> | <digit> | "_"
常见变体
很多变体中使用后缀 ?,*,+
来指定重复次数。
有些变体不允许符号存在空格,而用空格代替逗号表示连接运算。