编译原理 第三章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个程序设计语言是一个记号系统,
其完整定义应包括语法和语义两个方 面。 语法是指一组规则,用它可以形成和 和产生一个合法的程序,只定义什么 样的符号系列是合法的,与符号含义 无关。 语义:类型匹配,变量作用域等
– 静态语义:一系列限定规则,确定哪些 合乎语法的程序是合适的 – 动态语义:程序要做什么
四类文法之间的逐级“包含”关系:
0型文法 1型文法
2型文法
3型文法
四类文法所描述的语言分别称为: 0型语言,也称递归可枚举语言; 1型语言,也称上下文有关语言;
2型语言,也称上下文无关语言;
3型语言,也称正规语言(或称为正规集)
3.5
上下文无关文法及其语法树
上下文无关文法有足够的能力描述现
今程序设计语言的语法结构,我们关心上
例如,上述文法还可以写成:
G:S→0S1
S→01 或写成: G[S]:S→0S1 S→01
定义3.2 推导的定义 如α→β是文法G=(VN,VT,P,S)的 规则(即 α→β∈P ), γ 和 δ 是 V* 中的 任意符号,若有符号串v,w满足: v=γαδ,w=γβδ 则说 v(应用规则α→β)直接产生w, 或说,w是v的直接推导, 或说,w直接归约到v, 记作v=>w
<主语>::=<代词> | <名词> <代词>::=我|你|他 <名词>::=王明|大学生|工人|英语
<谓语>::=<动词><直接宾语>
<动词>::=是|学习 <直接宾语>::=<代词>|<名词>
3.2
符号和符号串
语言由句子构成,句子由符号序列组成。 (如 Pascal 、 C 语言是由一切程序组成的集 合,程序由符号序列组成) 为给出语言的形式定义,先讨论符号和 符号串的概念。
E→E*E
E→(E)|i 对于句型i*i+i
E E i * E i E + E E + E i
E
i
E * E
i i
句型i*i+i 对应了两棵不同的语法树。
如果一个文法存在某个句子,它对应两棵 不同的语法树,则说这个文法是二义的 注意:文法的二义性和语言的二义性是 两个不同的概念。不存在一个算法,能 在有限步骤内,确切判定任何一个文法 是否为二义的。
1、字母表:元素的非空有穷集合,把字母 表中的元素称为符号,因此字母表也称为 符号集。不同的语言有不同的字母表。
2、符号串:由字母表中的符号组成的任何 有穷序列。如字母表∑={0,1},则00、11 是其上的符号串。 在符号串中,符号的顺序是很重要的 (01 不同于 10) ,可以使用字母表示符号串 , 如 x = STR。
第 3章
3.1 3.2 3.3 3.4 3.5 3.6 3.7
文法和语言
文法的直观概念 符号和符号串 文法和语言的形式定义 文法的类型 上下文无关文法及其语法树 句型的分析 有关文法实用中的一些说明
第3章 文法和语言
教学要求 1.掌握:文法与语言的定义,及句型、 句子、短语、直接短语、句柄、推 导、归约、语法树、二义性等概念。 2 . 理解:文法的形式定义, chomsky 文法分类,自上而下与自下而上的 分析方法 3.了解:上下文无关文法中的规则
3.4
文法的类型
乔姆斯基( Chomsky )按产生式的类型把 文法分为四种类型: 0 型文法(无限制文法,短语文法),其产 生式形式为α→β,α至少含有一个非终结 符,其余不加任何限制。
例如,G:C→AaB
aA→a
B→b|Bb
为0型文法
1型文法(上下文有关文法)
其 产 生 式 形 式 为 α→β , 且 满 足 |α|≤|β|,仅仅S→ε除外。 例如G: C→aAB aA→aBa B→b|Bb
否则 x∈∑* ,
对于所有的∑,有ε∈∑*
3.3
文法和语言的形式定义
规则,也称重写规则、产生式或生成
式,是形如α→β或α::=β的(α,β)
有序对,其中α是某字母表V的正闭包V+中
的一个符号,β是 V* 中的一个符号。α称
为规则的左部,β称为规则的右部
定义3.1 文法定义
文法G定义为四元组(VN,VT,P,S) 其中VN :非终结符号集 VT : 终结符号集 VN∩VT =Φ,令V= VN∪VT,V称为文法G的字 母表或字汇表。 P :产生式集
3型文法(正规文法)
其产生式形式为A→a,A→aB, 其中a∈VT , A,B∈VN,
例如 G:A→aB
B→b|bB
是3型文法
L(G)={abn |n≥1}
四类文法的定义是逐渐增加限制的:
0型文法 1型文法 2型文法 3型文法
所以判断一个文法的类型,应按
3型、2型、1型、0型的顺序来判断。
阐明语法的一个工具是文法。目前
广泛使用上下文无关文法作为程序设计
语言语法的描述工具。 本章将介绍文法和语言的概念,重
点讨论上下文无关文法及其句型分析中
的有关问题。
3.1
文法的直观概念
对于含有无穷句子的语言来讲,无法列 出其全部句子,但可以给出一些规则,用这 些规则来说明(定义)句子的组成结构。这 些规则称为文法。 可以用规则去推导或产生句子,对EBNF 表示来讲,推导就是用::=右端部分代替左端 部分,使用的符号是=〉。 文法不仅可以严格地定义句子的结构, 也是描述无穷语言的工具。
下文无关文法形成的语言的句子的分析和
分析方法的研究。今后,对“文法”一词
若无特别说明,均指上下文无关文法。
35
语法树(推导树)
描述上下文无关文法的句型推导的直观方法。 给定文法G=( VN,VT,P,S),对于G
的任何句型都能构造与之关联的语法树,
这棵树满足下列4个条件:
1 .每个结点上都有一个标记,此标记 是V的一个符号;
3.6
句型的分析:
句型的分析
就是判别一个符号串是否为某文法的句型
进一步说,当给定一个符号串时,按照 某文法的规则为该符号串构造语法树,以此 识别出它是该文法的句型。当符号串全部由 终结符号组成,就是识别它是否为该文法的 句子。
对程序设计语言来说,程序是定义 程序设计语言的文法的句子。在语言的 编译实现中,把完成句型分析的程序称 为分析程序或识别程序,分析算法又称 识别算法。
分析算法总是从左到右识别符号串,先 识别最左符号,然后识别右边的符号, 这种分析算法分为两类:
自上而下的:从文法开始符出发,反复用 各种产生式匹配输入符号串;从根(开始 符)向下建语法树; 自下而上的:从输入符号串开始,逐步归 约到文法的开始符;从叶子(符号串)向 上建语法树;
*
即文法描述的语言是该文法所有句子的集合。 例如:G[S]:S→0S1 S→ 01 L(G)= { 0n1n | n≥1 }
定义3.7 若L(G1)=L(G2), 则称文法 G1 和 G2 是等价的。 例如: G[S]: S→0S1 S→01 和 G[A]: A→0R A→01 R→A1 等价 因为L(G)={ 0n1n | n≥1 }
符号串中符号的个数称为长度,如 x=0011 , ∣x∣=4 不包含任何符号的符号串为空串,用ε表 示,且∣ε∣=0
下面介绍有关符号串的一些运算 1) 符号串的连接:设 x 和 y 是符号串 , 它们 的连接 xy 是把 y 的符号写在 x 的符号之后 , 如 x=ST,y=abc,则它们的连接xy=STabc, 特别地,εx=xε=x; 2) 符号串的方幂:设x是符号串,把x自身连 接n次得到的符号串称为x的方幂。 x0=ε,x1=x,x2=xx,…,xn=xxn-1=xn-1x (n>0)
+ * +
定义3.5
设G[S]是一文法,如果符号串x是从开识
符号推导出来的,即有S =〉x,则称x是
文法G[S]的句型。若x仅由终结符号组成,
* 即S =〉x ,x∈VT *,则称x为G[S]的句子。
*
例如:G[S]:S→0S1
S→ 01
S、0S1、01都是G的句型,其中01是句子。
定义3.6 文法G所产生的语言定义为集合 { x | S=〉x,S为开始符,x∈VT * }, 可用L(G)表示该集合。
例如
G[S]: S→0S1 S→01 直接推导S=>0S1,
v = S ,w = 0S1 这里γ=ε,δ=ε
使用的规则是S→0S1,
v = 0S1,w = 0011,直接推导0S1=>0011, 使用的规则是S→01, 这里γ=0,δ=1
定义3.3
如果存在直接推导的序列:
v = w0=> w1=> w2=> …=> wn = w(n>0) 则称v推导出(产生)w(推导长度为n), 或称w归约到v, 记作v=> w 定义3.4 若有v=> w,或v = w,则记作v => w
=〉aabAa=〉aabbaa;
如果在推导过程中的任何一步都是对
句型中的最左(右)非终结符进行替换,
则称这种推导为最左(右)推导。在形式
语言中,最右推导被称为规范推导,由规
范推导所得的句型称为规范句型。
一棵语法树表示了一个句型的各种推 导过程,但一个句型不一定只对应唯一的 语法树。
如G:E→E+E
例如 ∑={0,1},则 ∑*={ε,0,1,00,01,10,11,…},
∑* =∑0∪∑1∪∑2…∪∑n∪…, ∑*称为集合∑的闭包,
而 ∑+ =∑1∪∑2∪∑3…∪∑n∪…,
∑+称为∑的正闭包, 显然有 ∑* = ∑0∪∑+ ∑+ = ∑∑* =∑*∑
若x是∑* 中的元素,
则表示为x∈∑* ,
2.根的标记是S;
3 .若一结点 n 至少有一个它自己除外的子孙, 并且有标记 A,则 A∈VN ;(即:若一个 结点A有孩子结点,则A是非终结符)
4.如果结点n的直接子孙,从左到右的次序 是结点n1,n2…..nk,其标记为A1,A2….Ak, 那么 A→A1A2….Ak一定是P中的一个产生 式。
见书中例子(P32-33)
<句子> ::= <主语>
<谓语>
<主语> ::= <代词> | <名词>
<代词> ::= 我|你|他
<名词> ::= 王明|大学生|工人|英语
<谓语> ::= <动词><直接宾语>
<动词> ::= 是|学习 <直接宾语> ::= <代词>|<名词>
ห้องสมุดไป่ตู้
这些规则是判别句子结构合法与否的 依据,如 “我是大学生”符合上述规则,
为1型文法
2型文法(上下文无关文法) 其 产 生 式 形 式 为 A→β , A∈VN , β∈V * ,当以 β替换 A 时,与 A的上 下文环境无关。大部分程序设计语言 近似于2型文法。 例如G[I]: I→IL | ID | L L→a|b|c|…|z D→0|1|2|3|…|9
为2型文法(定义标识符的文法)
而 “我大学生是”不符合上述规则。 这
些规则只是句子结构的描述,称之为文法。 一旦有了一组规则后,可以用它们去
推导或产生句子。
<句子>::=<主语>
<谓语>
例如:
<句子>=〉<主语><谓语>
=〉<代词><谓语> =〉我 <谓语> =〉我<动词><直接宾语> =〉我是<直接宾语> =〉我是<名词> =〉我是大学生
S :开始符号,且S∈VN ,S至少要在一条规 则的左部出现。
例: G=(VN,VT,P,S) 其中 VN={S}, VT ={0,1}, P={S→0S1,S→01} S是开始符号
一般地,文法 G 的四元组不用显示地 给出,而只将产生式写出。约定:第一条 产生式的左部是开始符号,用尖括号括起 来的(或大写字母)是非终结符号,不用 尖括号括起来(或小写字母)是终结符号。 还有一种习惯写法,即 G[S] ,其中 S 是开 始符号。
例:G[S]:S→aAS|a A→SbA|SS|ba
句型aabbaa的语法树
S
a
S a
A b b A a
S
a
语法树表示了在推导过程中用到了哪个产 生式和用在哪个非终结符上,它并没有表 明使用产生式的顺序。
推导过程1 S=〉aAS=〉aAa=〉aSbAa =〉aSbbaa=〉aabbaa;(规范推导) 推导过程2 S=〉aAS=〉aSbAS=〉aabAS =〉aabbaS=〉aabbaa; 推导过程3 S=〉aAS=〉aSbAS=〉aSbAa
3) 符号串集合:若集合A中的一切元素都是 某字母表上的符号串,则称 A 为该字母表上 的符号串集合。 符号串集合A和B 的乘积:
AB={xy|x∈A,y∈B}
例如A={a,b},B={0,1},
则AB={a0,a1,b0,b1}
特别地,{ε}A=A{ε}=A
设∑为字母表,用∑*表示∑上的所有有穷长 的串的集合。