编译原理(二)

文法与语言

文法: 描述语言的语法结构的形式规则
例如:He gave me a book
在这里插入图片描述

几个基本概念

字母表: 一个有穷字符集,记为Σ
字母表中每个元素称为字符
Σ中的字符所构成的任何一个有穷序列称为字符串
不包含任何字符的序列称为空字符串,记为ε
Σ*表示Σ上的所有字的全体,包含空字ε
例如:设Z={a,b},则
Σ*={ε,a,b,aa,ab,ba,bb,aaa……}

如果字符串x中有m个字符,则称其长度为m,表示为|x|=m
例如:|ε|=0

Σ* 的子集U和V的连接(积)定义为
UV={ αβ| α∈U & β∈V }
示例:设

U={a,aa}
V={b,bb}
UV={ab,abb,aab,aabb}
(注意:UV与VU不同)

V自身的n次积记为

Vn=V V…V(n个V)

V自身的0次积记为

V0={ε}

V* 是V的闭包:

V*=V°∪V1∪V2∪V3∪……

V+ 是V的正规闭包:

V+ =V V*(与 V*的区别就是没有V0 即没有ε )

上下文无关文法

上下文无关文法G是一个四元组
G=(VT, VN,S,P),其中
VT :终结符(Terminal)集合(非空)不可再分解和定义
VN:非终结符(Nonterminal)集合(非空) ,且VT∩ VN=Φ,可再分解和定义
(注意:非终结符可以由终结符和非终结符构成)
S :文法的开始符号, S∈VN,(他是特殊的非终结符,它代表所定义的语言最感兴趣的语法单位如:句子,程序。)
P:产生式集合(有限) ,每个产生式形式为
P->α,P∈VN,α∈ (VT∪VN)*
开始符S至少必须在某个产生式的左部出现一次,否则没有意义。

例,定义只含+ , *的算术表达式的文法
G=< {i,+,*,(,)},{E},E,P>,其中P由下列产生是组成:
E→i;E→E+E;E→E*E;E→(E)
或者表示为E->i | E+E | E*E | (E)

表示一个文法时,通常只给出符号和产生式
约定终结符用小写字母表示,非终结符用大写字母表示。例如上例:
G(E):E->i | E+E | E*E | (E)
推导
定义文法是为了描述语言,我们可以根据上下文无关文法推导出语言
如:G(E):E->i | E+E | E*E | (E),推导出(i+i)

E=>(E)=>(E+E)=>(i+E)=>(i+i)
最左推导:任何一-步a =>β都是对a中的最左非终结符进行替换
E=>(E)=>(E+E)=>(E+i)=>(i+i)
最右推导:任何一步a => β都是对a中的最右非终结符进行替换
(E+E)可先推导左边,也可先推导右边,所以一个串到另一个串的推导不唯一

在这里插入图片描述
句型,句子和语言的定义
上下文无关文法每一步推导的结果就是句型,如:(E),(E+E)
只含终结符的句型就是句子如:(i+i)
文法G所产生的句子的全体就是语言,记为L(G)
在这里插入图片描述
文法推导语言例子:
在这里插入图片描述
语言推文法:
在这里插入图片描述
在这里插入图片描述

语法树

要点:

  • 在树中间父子结点可以同名
  • 语法树并不反映结点产生的先后次序,只反映语法符号的定义或者说是构成关系
    在这里插入图片描述

二义性

文法二义性: 如果一个文法存在某一个句子对应两棵不同的语法树则说这个文法是二义性。
在这里插入图片描述
语言二义性: 一个语言是二义的是指你根本找不到一个能产生该语言的无二义文法
对于语言L,可能存在G和G’ ,使得L(G)=L(G’ )=L, 有可能其中一个文法为二义的,另一个为无二义的,则这是无二义的语言。

文法的类型

在这里插入图片描述
上下文无关文法是2型的。0,1,2,3型紧紧只是P的不同。
在这里插入图片描述
在这里插入图片描述
最后程序设计语言只能由0型文法产生。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读