BOOST::SPIRIT 什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF & Augmented BNF

盖博简
2023-12-01

关于boost.spirit的用法,在这里我先不说,以后有时间我来慢慢的把它用中国话讲解一遍。这个程序的核心实际上是一个EBNF的表达式,也就是如何用EBNF语法来表示四则运算。

BNF and EBNF: What are they and how do they work?

http://www.garshol.priv.no/download/text/bnf.html

扩展巴科斯范式

维基百科,自由的百科全书

跳转到: 导航, 搜索

扩展巴科斯-瑙尔范式(EBNF)是表达作为描述计算机编程语言形式语言的正规方式的上下文无关文法元语法符号表示法。它是基本巴科斯范式(BNF)元语法符号表示法的一种扩展。

它最初由尼古拉斯·沃斯开发,最常用的 EBNF 变体由标准,特别是 ISO-14977 所定义。

目录

[隐藏]

基本

代码,如由终结符即可视字符、数字、标点符号、空白字符等组成的计算机程序源代码

EBNF 定义了把各符号序列分别指派到非终结符产生规则:

digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
digit                = "0" | digit excluding zero ;

这个产生规则定义了在这个指派的左端的非终结符 digit。竖杠表示可供选择,而终结符被引号包围,最后跟着分号作为终止字符。所以 digit 是一个 0 或可以是 123 直到 9 的一个 digit excluding zero

产生规则还可以包括由逗号分隔的一序列终结符或非终结符:

twelve                          = "1" , "2" ;
two hundred one                 = "2" , "0" , "1" ;
three hundred twelve            = "3" , twelve ;
twelve thousand two hundred one = twelve , two hundred one ;

可以省略或重复的表达式可以通过花括号 { ... } 表示:

natural number = digit excluding zero , { digit } ;

在这种情况下,字符串 1, 2, ...,10,...,12345,... 都是正确的表达式。要表示这种情况,于花括号内设立的所有东西可以重复任何次,包括根本不出现。

可选项可以通过方括号 [ ... ] 表示:

integer = "0" | [ "-" ] , natural number ;

所以 integer 是一个零(0)或可能前导可选的负号的一个自然数。

EBNF 还包括描述指定次数的重复,和排除产生式的某部分或向 EBNF 文法插入注释的语法。

[编辑] 依据 ISO 的扩展

依据 ISO 14977 标准,提供了两个设施来扩展 EBNF。其一是在 EBNF 文法部分的特殊序列,它是在问号包围内的任意文本,其解释超出了 EBNF 标准的范围。例如,空格字符可以用如下规则定义:

space = ? US-ASCII character 32 ?;

其二利用圆括号在 EBNF 中不能放置到紧随标识符之后的事实。下列不是有效的 EBNF:

something = foo ( bar );

所以 EBNF 的扩展可以使用这种表示法。例如,在 Lisp 文法中,函数应用可以用如下规则定义:

function application = list( symbol , [ { expression } ] );

[编辑] 扩展 BNF 的动机

BNF 有着可选项和重复不能直接表达的问题。作为替代,它们需要利用中介规则或两选一规则,对于可选项,定义要么是空的要么是可选的产生式的规则,对于重复,递归的定义要么是被重复的产生式要么是自身的规则。同样的构造仍可用在 EBNF 中。

可选项:

signed number = [ sign , ] number ;

可按 BNF-风格定义为:

signed number = sign , number | number ;

signed number = optional sign , number ;
optional sign = ε | sign ; (* 使用 ε 来更清晰的指示空产生式 *)

重复:

number = { digit } ;

可按 BNF-风格定义为:

number = digit | number digit;

[编辑] 其他增加和修改

EBNF 排除了 BNF 的一些缺陷:

  • BNF 为自身使用了符号 (<, >, |, ::=)。当它们出现在要定义的语言中的时候,BNF 不能不加以修改或解释的使用。
  • BNF-语法在一行中只表示一个规则。

EBNF 解决了这些问题:

  • 终结符被严格的包围在引号 ("..." 或 '...') 中。给非终结符的尖括号 ("<...>")可以省略。
  • 通常使用终止字符分号结束一个规则。

进一步还提供了定义重复次数,排除法选择(比如除了引号的所有字符)和注释等的增强机制。

不管所有这些增强,EBNF 在能定义的语言的意义上不比 BNF 更强大。在原理上用 EBNF 定义的任何文法都可以用 BNF 表达。但是经常导致可观的更多规则的表示。

EBNF 已经被ISO用代码 ISO/IEC 14977:1996(E) 标准化了。

在某些场合任何扩展的 BNF 都被称为 EBNF。例如 W3C 使用 one EBNF 来规定 XML

[编辑] 另一个例子

只允许赋值的简单编程语言可以用 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.

这个语言可以轻易的扩展上控制流,算术表达式和输入/输出指令。就可以开发出一个小的、可用的编程语言了。

使用了在标准中提议为正规表示的下列字符:

用途符号表示
定义=
串接,
终止 ;
分隔|
可选[ ... ]
重复{ ... }
分组( ... )
双引号" ... "
单引号' ... '
注释(* ... *)
特殊序列 ? ... ?
除外-

[编辑] 约定

1. 使用了如下约定:

  • 扩展 BNF 每个元标识符都被写为用连字号连接起来的一个或多个字;
  • 结束于“-symbol” 的元标识符是扩展 BNF 的终结符的名字。

2. 表示扩展 BNF 的每个操作符的正常字符和它所蕴涵的优先级(顶部为最高优先级)为:

* repetition-symbol
- except-symbol
, concatenate-symbol
| definition-separator-symbol
= defining-symbol
; terminator-symbol

3. 下列括号对超越正常优先级:

´  first-quote-symbol            first-quote-symbol  ´
"  second-quote-symbol          second-quote-symbol  "
(* start-comment-symbol          end-comment-symbol *)
(  start-group-symbol              end-group-symbol  )
[  start-option-symbol            end-option-symbol  ]
{  start-repeat-symbol            end-repeat-symbol  }
?  special-sequence-symbol   special-sequence-symbol ?

作为例子,下列语法规则展示了表达重复的设施:

aa = "A";
bb = 3 * aa, "B";
cc = 3 * [aa], "C";
dd = {aa}, "D";
ee = aa, {aa}, "E";
ff = 3 * aa, 3 * [aa], "F";
gg = {3 * aa}, "D";

这些规则定义的终结字符串如下:

aa: A
bb: AAAB
cc: C AC AAC AAAC
dd: D AD AAD AAAD AAAAD etc.
ee: AE AAE AAAE AAAAE AAAAAE etc.
ff: AAAF AAAAF AAAAAF AAAAAAF
gg: D AAAD AAAAAAD etc.

[编辑] 有关工作

BNF范式和EBNF范式

关键字: BNF 范式
1、什么是BNF范式,什么又是EBNF范式?(在学习中经常会碰到用BNF范式描述的规则,老是忘记每个符号确切的作用,现在把他们一一罗列如下,亲手记录的东西应该能记住吧。。。-__-|||) 答:巴科斯范式及其扩展(BNF & Augmented BNF) 1)巴科斯范式:巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。 2)巴科斯范式的内容: 在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。 在双引号外的字(有可能有下划线)代表着语法部分。 < > : 内包含的为必选项。 [ ] : 内包含的为可选项。 { } : 内包含的为可重复0至无数次的项。 | : 表示在其左右两边任选一项,相当于"OR"的意思。 ::= : 是“被定义为”的意思 3)扩展的巴科斯范式(Augmented BNF):RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了更多的改进,比如说,在ABNF中,尖括号不再需要。 4)EBNF的基本内容: "..." : 术语符号 [...] : 选项:最多出现一次 {...} : 重复项: 任意次数,包括 0 次 (...) : 分组 | : 并列选项,只能选一个 斜体字: 参数,在其它地方有解释 例子BNF应用较多,以下给出一个简单例子,这是用BNF来定义的Java语言中的For语句的实例: FOR_STATEMENT ::= "for" "(" ( variable_declaration | ( expression ";" ) | ";" ) [ expression ] ";" [ expression ] ";" ")" statement
 类似资料: