现在的位置: 首页 > 综合 > 正文

BNF(巴科斯-瑙尔范式)和EBNF(扩展巴科斯-瑙尔范式)

2016年08月24日 ⁄ 综合 ⁄ 共 1087字 ⁄ 字号 评论关闭

新的一年到来了,首先祝愿大家也祝自己都能在新的一年里身体健康,离自己的理想越来越近。

有个哥们去了外滩玩儿,现在还联系不上,希望他一切OK,benison for him。

因为科目二考试和最近平台不太稳定,原计划在2014年解析完的lcc源代码要拖到2015了。

好在终于有三天完整的假期(貌似今年唯一的完整假期)可以用来集中解析整个编译器中的最难的语法解析部分了。

在进行语法分析之前,需要普及一些语言部分的基础知识,如BNF&EBNF。

关于BNF,维基解释是一种用于表示上下文无关文法的语言。

那什么是上下文无关(context free)文法呢?《编译原理(龙书)》上解释如下:

由终结符号,非终结符号,一个开始符号和一组产生式组成,有以下性质。

1,终结符号是组成串的基本符号,

2,非终结符号是表示串的集合的语法变量,非终结符号表示的串集合用于定义由文法生成的语言。

3,在一个文法中,某个非终结符号被指定为开始符号,

4,一个文法的产生式描述了将终结符号和非终结符号组成串的方法,产生式结构:一个产生式头(又称左部),一个箭头-->(或::=),一个由0个或多个终结符号和非终结符号组成的产生式体(右部),右部的成分描述了产生式头上的非终结符号所对应的某种构造方法。

如:exp -> exp + exp,即为一个产生式。

BNF格式如下:

<符号> ::= <使用符号的表达式>,跟上面描述的产生式类似。

这里的 <符号> 是非终结符,而表达式由一个符号序列,或用指示选择的竖杠 '|' 分隔的多个符号序列构成,每个符号序列整体都是左端的符号的一种可能的替代。从未在左端出现的符号叫做终结符。

关于终结符号和非终结符号的解释请参考《编译原理(龙书)》。

那什么是EBNF呢,维基解释是作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法(metalanguage)符号表示法。它是BNF元语法符号表示法的一种扩展。

为什么要扩展BNF呢?

BNF 有着可选项和重复不能直接表达的问题。

作为替代,它们需要利用中介规则或两选一规则,对于可选项,定义要么是空的要么是可选的产生式的规则,对于重复,递归的定义要么是被重复的产生式要么是自身的规则。

EBNF解决了这些问题。

同时:

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

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

抱歉!评论已关闭.