目录
编译原理——文法
一、什么是上下文无关文法?
1、什么是上下文?
一个字或词所在的句子,它前面的字或词就是上文,后面的就是下文。
2、什么是上下文无关?
只讨论这个字或词的性质,不考虑它与其之前或之后的字词有什么联系。
3、什么是文法?
文法是描述语言的语法结构的形式规则(即语法规则)。
二、上下文无关文法简单描述。
假设有下列语法规则:
<句子> -> <主语> + <谓语> + <宾语>
<主语> -> <代词> | <名词>
<谓语> -> <动词>
<宾语> -> <代词> | <名词>
<代词> -> <他> | <她> | <它>
<动词> -> <吃> | <打> | <修>
<名词> -> <电脑> | <饭> | <游戏>
这个文法可以生成很多句子,举例几个{它吃饭,他打游戏,她吃游戏.......}
可以看到有一些搭配在语义上是不恰当的,如:她吃游戏。
上下文无关文法不关注语义是否正确,只关注语法是否符合规则。
三、上下文无关文法组成部分
1、终结符号
终结符号是组成语言的不可再分的基本符号。
可以理解为初始量。
在上例中,<他> | <她> | <它> | <吃> | <打> | <修> | <电脑> | <饭> | <游戏> 都是终结符号。
2、非终结符号
非终结符号又称语法变量,是由许多终结符号或非终结符号组成的集合。
可以理解为中间量。
在上例中,<代词> | <名词> | <动词> | <句子> 都是非终结符号。
3、开始符号
开始符号是一个特殊的非终结符号,我们最终感兴趣的部分(目的)。
可以理解为最终的输出。
在上例中,<句子> 是开始符号。我们最终需要的就是一个完整的句子。
4、产生式
定义语法时的一种书写规则,遵从该规则得到非终结符号与开始符号。
可以理解为产生规则。
在上例中
<名词> -> <电脑> | <饭> | <游戏>
<主语> -> <代词> | <名词>
<句子> -> <主语> + <谓语> + <宾语>
都是产生式
5、上下文无关文法定义
形式上说,一个上下文无关文法G是一个四元式(tr,Vn,S,P),其中
Vt是一个非空有限集,它的每个元素称为终结符号;
Vn是一个非空有限集,它的每个元素称为非终结符号,Vr∩Vn=∅;
S是一个非终结符号,称为开始符号;
P是一个产生式集合(有限),每个产生式的形式是P→a,其中,P∈Vn,a∈(Vr∪Vv)*。开始符号S至少必须在某个产生式的左部出现一次。
四、上下文无关文法推导过程举例
推导:
定义一个上下文无关文法:
E -> i | EAE
A -> + | *
其中,E,A是非终结符,E是开始符号,而i,+和*是终结符
推导中心思想:从文法的开始符号出发,反复连续使用产生式,对非终结符进行替换和展开。
例如: E -> E+E | E*E | (E) | i
可得: E => (E) => (E+E) => (i+E) => (i+i)
如果a1=>a2=>...=>an,则我们称这个序列是从a1至an的一个推导。若存在一个从a1至an的推导,则称a1可推导出an.
+ *
我们用a1=>an表示:从a1出发,经一步或若干步,可推导出an。而用a1=>an表示:从a1出发,经0步或若干步, 可推导出an。
* +
换言之,a=>β意味着,或者a=>β,或者a=>β。
*
假定G是一个文法,S是它的开始符号。如果S=>a,则称a是一个句型。仅含终结符号的句型是一个句子。 文法G所产生的句子的全体是一个语言,将它记为L(G)。
+
L(G)={a|S=>a&a∈Vt*}
举例:
定义文法G:
S -> bA
A -> aA | a
推导过程:
S => bA =>ba
S => baA => baa
...
S => bA => baA => ... =>ba...a
归纳可得
L(G)={b*a^n|n>=1}
最左推导:
每一步推导都是最左非终结符进行替换
如:E + E => e + E => e + e
最右推导:
每一步推导都是最右非终结符进行替换
如:E + E => E + e => e + e
五、语法分析树与文法二义性
1、语法分析树
2、文法二义性
一个文法中存在某个句子(上面有定义),其最左(最右)推导是两个不同的式子,则称其为二义文法。
定义文法G:
E -> i | EAE
A -> + | *
可以有以下推导(最左):
E -> (E) -> (E*E) -> (i*E) -> (i*E+E) -> (i*i+E) -> (i*i+i)
也可以有推导(最右):
E -> (E) -> (E*E) -> (E*i) -> (E+E*i) -> (E+i*i) -> (i+i*i)
六、四种文法类型
概念:空字,闭包,自动机(以后会写一个关于语法描述的文章)。
1、0型文法(短语文法)及举例
设G=(Vn, Vt,P,S),如果它的每个产生式α->β是这样一种结构:α∈(Vn∪Vt)* (*表示闭包,表示用集合中的任意一个元素组合形成的串),且至少含有一个非终结符,而β∈(Vn∪Vt)*,则G是一个0型文法。
0型文法也称为短语文法,Chomsky证明了,0型文法的能力相当于图灵机(Turing),或者说,任何0型文法语言都是递归可枚举的,反之,递归可枚举集必定是一个0型文法。0型文法是这几类文法中,限制最少的一个。
Vn = {A,B},Vt = {a,b}。Ab -> ba, A -> aBa,Aa -> b,B -> A是0型文法,但ab->A不是0型文法,因为ab不含非终结符。
本文详细介绍了上下文无关文法的概念、组成部分、推导过程,包括最左和最右推导,以及四种文法类型的区别,如0型文法、1型文法、2型文法(上下文无关)和3型文法。还涉及语法分析树和文法二义性的概念,并通过实例解析加深理解。

被折叠的 条评论
为什么被折叠?



