编译原理第二章PPT

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

有时可以基于优先级和结合性来构建无二义的 文法
四则运算存在两个优先级,所以可引入两个非终结 符expr和term来对应不同的运算层次 四则运算均为左结合,故规则中更为抽象的非终结 符应位于左边
expr expr + term | expr - term | term term term * factor | term / factor | factor
二义性
对于一个文法,若有多棵分析树生成同一 个终结符号串,则此文法具有二义性。
一个具有二义性的文法
string
string string 9 string string 2 string 9
+
string 5
string 5
string
+ string
2
string string + string | string – string | 0 | 1 | …| 9
factor digit | (expr)
digit 0 | 1 | 2 |…| 9
证明以下文法二义。
S aSbS | bSaS | ε
证:对于串abab存在两棵不同的分析树:
S a S ε b ε S ε a S ε S b S
b S a S
a
S b
ε
S
ε
故本文法二义
最左推导与最右推导
2
Байду номын сангаас
-
综合例
考虑以下文法:S SS+ | SS* | a
1)试说明如何使用该文法生成串aa+a* S SS* SS+S* aS+S* aa+S* aa+a* 2)试为这个串构造一棵语法分析树 3)该文法生成的语言是什么?
后缀表达式
S S S a *
S a
S a
+
aa+a*的分析树
3、P2 练习1.1.1和练习1.1.2
}
简化的中间代码 1: i=i+1 2: t1=a[i] 3: if t1<v goto 1 4: j=j-1 5: t2=a[j]; 6: if t2>v goto 4 7: ifFalse i>=j goto 9 8: goto 14 9: x=a[i] 10: t3=a[j] 11: a[i]=t3 12: a[j]=x 13: goto 1 14:
list list - digit list digit digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
前三条规则可以简写成什么? 最后一条规则相当于多少条规则?
推导
从开始符出发,不断将某个非终结符替换为 该非终结符的某个产生式的右部。 推导的符号: 语言:从开始符出发,利用推导能得到的所 有终结符号串的集合。
SaSbSabSaSbSabaSbSababSabab
SaSbSabSabaSbSababSabab 故本文法二义

符号的有穷序列
串的表示:
a2表示aa a2b2表示aabb 闭包:a*表示{ε,a,aa,aaa,aaaa,….}
正闭包:a+表示{a,aa,aaa,aaaa,…}
T T*F | F T F*T | F T T+F | F F id F id F id
作业1
2、指出下列错误可在编译的哪个阶段被发现 (1)关键字拼写错误 (2)缺少运算对象 (3)实参与形参的类型不一致 (4)所引用的变量没有定义 (5)数组下标越界 (6)本应为常数,但却在数中出现了非数字字符
综合(1)(2)可知,对于任意的n>0,n步推导所得 的句子为0n1n,本文法对应的语言为{0m1m|m>0}。
作业1
1、先分别用以下文法推导出id+id+id*id,并画出 推导过程对应的分析树;最后比较三个文法生成 的语言有什么不同。
文法1:E E+T | T 文法2:E T+E | T 文法3:E E*T | T
设A={a,b,c},则A*表示 {ε,a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,…}
语言
推导长度:执行一步推导的次数
一步推导
+ 大于等于1步的推导 * 大于等于0步的推导
对于上下文无关语言G[S]:
* ,则为文法G的句型 如果S + 如果S W (WT*), 则W为文法G的句子。
编译器前端的模型
源 词法分 程 析器 序 记号 语法分 析器 语法树 中间代码 中间 生成器 代码
符号表
产生式
也称重写规则或规则。 通常写作: U ::= u 或 U u
其中: U是一个符号,称为左部或头 u是有穷符号串,称为右部或体
例: <sentence> <subject> <verb> <sentence> <subject> <verb> <complement>
文法: S → AB A → aaA A→ ε B→ b
S A a a A ε 不同的推导过 程对应一棵相 同的分析树! B b
要求推导出: aab
最左推导:
S ⇒ AB ⇒ aaAB ⇒ aaB ⇒ aab 最右推导: S ⇒ AB ⇒ Ab ⇒ aaAb ⇒ aab
证明以下文法二义: (第二种证法) S aSbS | bSaS | ε 证:对于串abab存在两个不同的最左推导:
语法分析树
以图形方式展现推导过程 给定一个上下文无关文法,该文法的一棵语 法分析树是具有以下性质的树:
根节点是开始符
叶节点是终结符( token) 或 ε 内部节点(非叶结点)是非终结符 如果应用了规则A x1x2…xn, 则A是内部结点; x1 , x2 , … , xn是子结点
一个文法的句子集合称为语言。
文法S 0S1 | 01生成什么语言?给出证明。
本文法对应的语言为{0m1m|m>0}。
证:对推导长度n进行归纳证明。 当n=1时,S可以推导出的句子为01,即0111。
设n不大于k时,得到的串为0n1n。则当n=k+1时,第 一步进行的推导应该是S0S1。而对于句型0S1中的 S进行k步推导,会得到句子为0k1k,故k+1步推导 得到的句子为0k+11k+1。
最左推导(Leftmost derivation) : 总是首先替 换最左边的非终结符 最右推导(rightmost derivation) : 总是首先替 换最右边的非终结符 最左(右)推导与分析树一一对应
可以通过说明对于某个串存在两个不同的最左推 导来证明文法二义 可以通过说明对于某个串存在两个不同的最右推 导来证明文法二义
一个简单的 语法制导翻译器
待编译的代码
{
int i , j ; float a[100], v, x; while ( true ) { do{ i = i + 1 ; }while ( a[i] < v ); do{ j = j - 1 ; }while ( a[j] > v ); if ( i >= j ) break; x=a[i]; a[i]=a[j]; a[j] = x; }
上下文无关文法生成的语言称为上下文无关语言
推导(例)
list list + digit list - digit + digit
digit - digit + digit 9 - digit + digit 9 - 5 + digit 9 - 5 + 2
list list + digit list list - digit list digit digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
使用分析树来描述推导过程
list list + digit list - digit + digit
digit - digit + digit
9 - digit + digit 9 - 5 + digit 9-5+2
list
list list
digit
9
+ digit
5
digit
上下文无关文法
是一个四元组,包括:
终结符集
文法所定义的语言的基本符号的集合 仅出现在产生式右部(体)
非终结符集
在某个产生式的左部出现过的文法符号
产生式集 开始符
两种说明方式:
• 明确指出 • 第1条产生式规则左部的文法符号
上下文无关文法(例)
list list + digit
相关文档
最新文档