编译原理(龙书)习题(5,6,7,8)章 ppt课件
合集下载
编译原理例题与习题解答PPT课件
27
第27页/共85页
• 例如,假定状态 s 1和s 2经a 弧 分 别 到 达t1和t2,而t1和t 2属于现行 中的两个
不同子集,说明有一个字, t1读出后到达终态,而t2读出后不能到达终 态,或者反之,那么对于字a , s1读出a后到达终态,而s2读出a不能到 达终态,或者反之,所以s1和s2不等价。
{c,d,e} {c,d,f}
{c,d1,f}
1
{c,d}
{c,d,e,g}
{c,d,f}
③.重命名后的状态转换矩阵
I1 {b,c,d}
1 {c,dF,e}
{c,d,e}
0{c,d,e}
{c,d,e,g}
{c,d,e}
S
0
1
A(始态)
Φ
B
B
C
D
C
C
D
D
E
D
E
C
F(终态)
33
F(终态)
第33页/共E85页
40
{10,11}
{12}
第40页/共85页
I1
{1,2,3} {5,9,10,11}
{2,3} {2,3,7,8,13} {5,9,10,11} {5,9,10,11} {2,3,5,9,10,11} {5,9,10,11,13} {2,3,5,9,10,11} {5,9,10,11}
{2,3} {2,3,7,8,13} {2,3,7,8,13}
• 描述工具:正规式和有限自动机理论
ห้องสมุดไป่ตู้
• 语法规则:语法单位的形成规则。
• 语法单位通常包括:表达式、语句、子程序、 过程、函数、程序等;
2
• 描述工具:上下文无关文法
第27页/共85页
• 例如,假定状态 s 1和s 2经a 弧 分 别 到 达t1和t2,而t1和t 2属于现行 中的两个
不同子集,说明有一个字, t1读出后到达终态,而t2读出后不能到达终 态,或者反之,那么对于字a , s1读出a后到达终态,而s2读出a不能到 达终态,或者反之,所以s1和s2不等价。
{c,d,e} {c,d,f}
{c,d1,f}
1
{c,d}
{c,d,e,g}
{c,d,f}
③.重命名后的状态转换矩阵
I1 {b,c,d}
1 {c,dF,e}
{c,d,e}
0{c,d,e}
{c,d,e,g}
{c,d,e}
S
0
1
A(始态)
Φ
B
B
C
D
C
C
D
D
E
D
E
C
F(终态)
33
F(终态)
第33页/共E85页
40
{10,11}
{12}
第40页/共85页
I1
{1,2,3} {5,9,10,11}
{2,3} {2,3,7,8,13} {5,9,10,11} {5,9,10,11} {2,3,5,9,10,11} {5,9,10,11,13} {2,3,5,9,10,11} {5,9,10,11}
{2,3} {2,3,7,8,13} {2,3,7,8,13}
• 描述工具:正规式和有限自动机理论
ห้องสมุดไป่ตู้
• 语法规则:语法单位的形成规则。
• 语法单位通常包括:表达式、语句、子程序、 过程、函数、程序等;
2
• 描述工具:上下文无关文法
《编译原理》课件
代码生成
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类
编译原理(龙书)习题(5,6,7,8)章ppt课件
35
优化后的三地址语句序列: t1 = a + c y = t1 + e t3 = y + b t4 = t3 + d x = t4 + f
优化后的目标代码序列: LD R1 , a LD R2 , c ADD R1 , R1 , R2 LD R2 , e ADD R1 , R1 , R2 ST y , R1 LD R2 , b ADD R1 , R1 , R2 LD R2 , d ADD R1 , R1 , R2 LD R2 , f ADD R1 , R1 , R2 ST x , R1
B.code||label(begin)|| S2.code|| gen('goto' S1.next)|| label(B.true)||S3.code|| gen('goto' begin)
整理版课件
22
6.7.7 使用图6-37中的翻译方案翻译下列表达 式。给出每个子表达式的truelist和falselist。 你可以假设第一条被生成的指令的地址是 100。
整理版课件
29
8.2.4 假设x,y和z存放在内存位置中,为下面的语句序列生成 代码:
if x < y goto L1 z=0 goto L2 L1:z = 1
LD R1 , x LD R2 , y SUB R1 , R1 , R2 BLTZ R1 , L1 LD R3 , 0
ST z , R3
JMP L2
1)一个repeat语句,repeat S while B 2)一个for循环语句,for (S1 ; B ; S2) S3
S-->repeat S1 while B
begin=newlabel() S1.next=newlabel() B.true=begin B.false = S.next S.code=label(begin)||
编译原理 龙书 第二版 第5、6章
elseE.type=float
2)E->T
E.type=T.type
3)T->num
T.type=integer
4)T->num.num
T.type=float
(2)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
Else begin
E.type=float
105: goto–
6)按照产生式B->B1 || M B2进行归约
7)按照产生式B->(B1)进行归约
8)按照产生式B->B1 && M B2进行归约
9)各子表达式的truelist和falselist在上图中已标出
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1
result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
2
+
a
(1)
(4)间接三元式序列
10
(0)
E.type=T.type; E.val=T.val
3)T->num
T.type=integer; T.val=num
2)E->T
E.type=T.type
3)T->num
T.type=integer
4)T->num.num
T.type=float
(2)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
Else begin
E.type=float
105: goto–
6)按照产生式B->B1 || M B2进行归约
7)按照产生式B->(B1)进行归约
8)按照产生式B->B1 && M B2进行归约
9)各子表达式的truelist和falselist在上图中已标出
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1
result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
2
+
a
(1)
(4)间接三元式序列
10
(0)
E.type=T.type; E.val=T.val
3)T->num
T.type=integer; T.val=num
编译原理精选版演示课件.ppt
预测分析表
3
表驱动的预测分析程序模型
khk
4
实现步骤:
(1) 判断文法是否为LL(1)文法。 如果文法中含有左递归,必须先消除 左递归
(2)构造预测分析表 : Select(A ) (3)列出预测分析过程
khk
5
第6章:自底向上分析方法
自底向上分析方法,也称移进归约分析法
实现思想(是推导的逆过程):
对输入符号串自左向右进行扫描,并将输入符逐个 移入一个后进先出栈中,边移入边分析,一旦栈顶 符号串形成某个句型的可归约串时,就用该产生式 的左部非终结符代替相应右部的文法符号串,称为 归约。重复这一过程,直到归约到栈中只剩下文法 的开始符号时,则分析成功。
关键问题
khk
6
移进—规约分析(Shift-reduce parsing)
+
A a
可得 b <. a
由A→( B 且B+ ( B… 可得 (<. (
+
B aa…
可得 (<. a
+
B Aa )
可得 (<. A
khk
18
A(B(Aa) …)
(3) 求> .关系:
A(B…B
+
Aa
由S→bAb,且A…) 可得 ) > . b
A+…B 可得 B > . b
khk
88
例1:文法
SaAcBe A b A Ab B d
输入串abbcde#分析
khk
9
归约分析过程(移进归约):
步骤 1 2 3 4 5 6 7 8 9 10 1kh1k
符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
编译原理课件(龙书为教材)
temp2=b+temp1
a=temp2
2014-9-4计算机学院
辛明影
13
代码生成阶段
生成可重定位的机器代码或汇编代码 Movf R2,c
Mult R2,d
Movf R1,b
Addf R2,R1
Movf a,R2
2014-9-4计算机学院
辛明影
14
1.3符号表管理 int a,b;
float e,f
语法分析
在词法分析的基础上,根据语言的语法规则, 把单词符号串组成各类语法单位. 具体的说,语法分析是在单词流的基础上建立 一个层次结构-----建立语法树
标识符 a
赋值语句 =
表达式 标识符 b
表达式 + 表达式 表达式 * 表达式
标识符 c
辛明影
标识符
d
10
2014-9-4计算机学院
语义分析阶段
2014-9-4计算机学院
辛明影
27
上述的定义是用文字来描述的,当设 计编译程序时,就要把它用形式的方式描 述出来,就要用到形式语言。 在现今多数程序设计语言中,单词符 号一般包括: 标识符、 基本字、 各类型的常数、 算符和界符等 正规式和有穷自动机是描述词法结 构和进行词法分析的有效工具
2014-9-4计算机学院
符号表是一个数据结构。 每个标识符在符号表中都有 一条记录 例:int a,b; 名字 a 记号 id1(25) 类型 int 种属 …… 简变 addr 0
b
id2(25)
int
辛明影
简变
4
16
2014-9-4计算机学院
符号表的接口: 符号表的作用就是存放字符串或词素 当一个字符串或词素被保存时,与之相对 应的记号也被保存
编译原理 龙书 第二版 第5、6章
L.syn=L’.syn
4)L’->BL1’
L1’.m=L’.m*L’.m;L1’.side=L’.side
L1’.inh=L’.inh*L’.side+B*L1’.m
L’.syn=L1’.syn
5)L’->ε
L’.syn=L’.inh
6)B->0
B.val=0
7)B->1
B.val=1
练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。
E-〉E+T|T T-〉num.num|num
1)给出一个SDD来确定每个项T和表达式E的类型
2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数
答:
(1)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
2)四元式序列
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1
Arg2
result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
4)L’->BL1’
L1’.m=L’.m*L’.m;L1’.side=L’.side
L1’.inh=L’.inh*L’.side+B*L1’.m
L’.syn=L1’.syn
5)L’->ε
L’.syn=L’.inh
6)B->0
B.val=0
7)B->1
B.val=1
练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。
E-〉E+T|T T-〉num.num|num
1)给出一个SDD来确定每个项T和表达式E的类型
2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数
答:
(1)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
2)四元式序列
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1
Arg2
result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
最新编译原理(课后习题答案ppt课件
(a) 请指出此文法的终结符号, 非终结符号和开始符号. 终结符号: or, and, not, (, ), true, false 非终结符号: bexpr, bterm, bfactor 开始符号: bexpr
10
(b) 试对于句子 not ( true or false) 构造一棵分析树.
bexpr bterm bfactor not bfactor
a S b S
(d) 此文法产生的语言是什么?
由相同个数的a和b组成的字符串.
9
1.3 考虑文法 bexpr bexpr or bterm | bterm bterm bterm and bfactor | bfactor bfactor not bfactor | ( bfactor ) | true | false
(a) 0 ( 0 | 1)* 0 由0和1组成且以0开始和结束的符号串全体.
(b) ( ( | 0 ) 1* ) * 由0和1组成的符号串全体.
(c) ( 0 | 1 )* 0 ( 0 | 1) ( 0 | 1) 由0和1组成且以000,001,010或011结束的符号串全体. 长度大于等于3且倒数第3个字符为0的01符号串全体.
16
3.4 对于下列语言分别写出它们的正规表达式:
(a) 英文字母组成的所有符号串, 要求符号串中顺序包含 五个元音字母. 令letter={非元音的英文字母} letter* (a|A) letter* (e|E) letter* (i|I) letter* (o|O) letter* (u|U) letter*
18
(e) 带有偶数个0和奇数个1的由0和1组成的符号串全体. E为带有偶数个0和1的由0和1组成的符号串全体. 即 ( 00 | 11)* ( ( 01 | 10 ) ( 00 | 11)* ( 01 | 10 ) ( 00 | 11)* )* E1E|E0E1E0E
10
(b) 试对于句子 not ( true or false) 构造一棵分析树.
bexpr bterm bfactor not bfactor
a S b S
(d) 此文法产生的语言是什么?
由相同个数的a和b组成的字符串.
9
1.3 考虑文法 bexpr bexpr or bterm | bterm bterm bterm and bfactor | bfactor bfactor not bfactor | ( bfactor ) | true | false
(a) 0 ( 0 | 1)* 0 由0和1组成且以0开始和结束的符号串全体.
(b) ( ( | 0 ) 1* ) * 由0和1组成的符号串全体.
(c) ( 0 | 1 )* 0 ( 0 | 1) ( 0 | 1) 由0和1组成且以000,001,010或011结束的符号串全体. 长度大于等于3且倒数第3个字符为0的01符号串全体.
16
3.4 对于下列语言分别写出它们的正规表达式:
(a) 英文字母组成的所有符号串, 要求符号串中顺序包含 五个元音字母. 令letter={非元音的英文字母} letter* (a|A) letter* (e|E) letter* (i|I) letter* (o|O) letter* (u|U) letter*
18
(e) 带有偶数个0和奇数个1的由0和1组成的符号串全体. E为带有偶数个0和1的由0和1组成的符号串全体. 即 ( 00 | 11)* ( ( 01 | 10 ) ( 00 | 11)* ( 01 | 10 ) ( 00 | 11)* )* E1E|E0E1E0E
《编译原理课件》PPT课件
它是源程序的一种内部表示形式。 设计中间代码的原则:一是容易生成,二是
容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
编译原理课件
一个声明起作用的程序部分称为该声明的作用域。
int a; Function f(int b) { int c; … } } void main() { a = 0; c = 0; f(3); 错误,超出了c 的作用域 正确,在a的 作用域内
6.1 局部存储分配策略
6.1.2 名字的作用域和绑定 名字的作用域
代 码 静态数据 堆
p的活动记录 main的活动记录
栈
6.1 局部存储分配策略
6.1.3 活动记录 一般的活动记录的布局 返 回 值 实在参数 控 制 链 访 问 链 机器状态 局部数据 临时数据
本过程返回给调用过程的值
调用过程传递给本过程的参数 指向调用过程的指针 用于引用存于其他活动记录的非局部数据 用于保存本过程调用前的机器状态 本过程内部定义的局部变量 临时变量,中间结果
衬垫空白区
c1c2
0 12 4
i
8
f 16
6.1 局部存储分配策略
6.1.5 程序块
语法如{声明 语句} 本身含有局部变量声明的语句,可以嵌 套 最接近的嵌套作用域规则
程序块B’中声明的作用域包括B 如果名字x没有在B中声明,那么B中x的出现 是在外围程序块B’的x声明的作用域中,且满 足
B’有x的声明 B’比其他任何包含x声明的程序块更接近被嵌套 的B { …int a; {….int b; B B1 a = 3; } B2 } {….int a }
6.2 全局存储分配策略
运行栈:把控制栈中的信息拓广到包括过程活 动所需的所有局部信息(即活动记录) s a : array r i: integer s
r
6.2 全局存储分配策略
运行栈:把控制栈中的信息拓广到包括过程活 动所需的所有局部信息(即活动记录) s a : array q (2, 3) k: integer s
int a; Function f(int b) { int c; … } } void main() { a = 0; c = 0; f(3); 错误,超出了c 的作用域 正确,在a的 作用域内
6.1 局部存储分配策略
6.1.2 名字的作用域和绑定 名字的作用域
代 码 静态数据 堆
p的活动记录 main的活动记录
栈
6.1 局部存储分配策略
6.1.3 活动记录 一般的活动记录的布局 返 回 值 实在参数 控 制 链 访 问 链 机器状态 局部数据 临时数据
本过程返回给调用过程的值
调用过程传递给本过程的参数 指向调用过程的指针 用于引用存于其他活动记录的非局部数据 用于保存本过程调用前的机器状态 本过程内部定义的局部变量 临时变量,中间结果
衬垫空白区
c1c2
0 12 4
i
8
f 16
6.1 局部存储分配策略
6.1.5 程序块
语法如{声明 语句} 本身含有局部变量声明的语句,可以嵌 套 最接近的嵌套作用域规则
程序块B’中声明的作用域包括B 如果名字x没有在B中声明,那么B中x的出现 是在外围程序块B’的x声明的作用域中,且满 足
B’有x的声明 B’比其他任何包含x声明的程序块更接近被嵌套 的B { …int a; {….int b; B B1 a = 3; } B2 } {….int a }
6.2 全局存储分配策略
运行栈:把控制栈中的信息拓广到包括过程活 动所需的所有局部信息(即活动记录) s a : array r i: integer s
r
6.2 全局存储分配策略
运行栈:把控制栈中的信息拓广到包括过程活 动所需的所有局部信息(即活动记录) s a : array q (2, 3) k: integer s
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
| 1D1 {D.val 1 2D1.b D1.val; D.b D1.b 1}
| {D.val 0;
D.b 0}
ppt课件
13
第6章 中间代码生成
6.1.1 为下面的表达式构造DAG ((x+y)-((x+y)*(x-y)))+((x+y)*(x-y))
ppt课件
14
6.2.1 将算术表达式 a+-(b+c) 翻译成
5.2.4 这个文法生成了含“小数点”的二进制:
S L.L | L L LB | B B 0|1
设计一个L属性的SDD来计算S.val,即输入串的十进制数值。 比如,串101.11应该被翻译为十进制数5.635。提示:使 用一个继承属性L.side来指明一个二进制位在小数点的哪 一边。
2
ppt课件
改写这个SDT,使得基础文法不再是左递归的,但仍然可 以计算出整个输入串的相同的B.val的值。
12
ppt课件
非终结符D的综合属性b表示二进制数的位数, val表
示对应的十进制数的数值。消除左递归后如下:
B 1D {B.val 1 2D.b D.val}
D 0D1 {D.val D1.val; D.b D1.b 1}
S1.code|| label(S1.next)|| B.code
ppt课件
21
S-->for ( S1; B; S2 ) S3
S1.next=newlabel() B.true=newlabel() begin=newlabel() B.fale=S.next S2.next =S1.next S3.next=begin S.code=S1.code||label(S1.next)||
为了求小数部分的值,引入L的综合属性b记录2的 L
的位数次幂值(2 length of L)
S L1.L2 S.val = L1.val +L2.val / L2.b; S L S.val = L.val; L L1 B L.val = L1.val *2 + B.val;
L.b = L1.b*2; L B L.val = B.val; L.b = 2; B 0 B.val = 0; B 1 B.val = 1;
18
ppt课件
6.4.2 使用图6-20中的增量式翻译方案重复练习6.4.1
在增量方式中,gen不仅要构造出一个新的三地址指令,还
要将它添加到至今为止已生成pp的t课件指令序列之后。
19
6.4.3 使用使用图6-22所示的翻译方案来翻译下 列赋值语句:
2) x = a[i][j] + b[i][j] 假设w1为数组a的第一维的宽度,w2为数组b
ppt课件
3
5.3.1 下面是涉及运算符+和整数或浮点运算分量的表达式的 文法。区分浮点数的方法是看它有无小数点。
E ET |T T num.num | num
1)给出一个SDD来确定每个项T和表达式E的类型。 2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀
表达式。使用一个单目运算符intToFloat把一个整数转换为 相等的浮点数。
1)一个repeat语句,repeat S while B 2)一个for循环语句,for (S1 ; B ; S2) S3
S-->repeat S1 while B
begin=newlabel() S1.next=newlabel() B.true=begin B.false = S.next S.code=label(begin)||
1)抽象语法树 2)四元式序列 3)三元式序列 4)间接三元式序列
ppt课件
15
1)抽象语法树:
ppt课件
16
2)四元式序列:
3)三元式序列:
4)间接三元式序列:
ppt课件
17
6.4.1 向图6-19的翻译方案中加入对应于下列产生式的规则: 1) E E1 * E2 2) E E1(单目加)
B.code||label(begin)|| S2.code|| gen('goto' S1.next)|| label(B.true)||S3.code|| gen('goto' begin)
第5章 语法制导的翻译
5.2.3 假设我们有一个产生式 A 。BAC,DB,C,D这四个非终 结符号都有两个属性:s是一个综合属性,而i是一个继承属 性。对于下面的每组规则,指出(i)这些规则是否满足S属性 定义的要求。(ii)这些规则是否满足L属性定义的要求。(iii) 是否存在和这些规则一致的求值过程?
exp 为原表达式的字符串,s 为求导后的字符串。 || 为串联接符。
ppt课件
9
ppt课件
10
ppt课件
11
5.4.3 下面的SDT计算了一个由0和1组成的串的值。它把输入 的符号串当作按照正二进制数来解释。
B B10{B.val 2 B1.val} | B11{B.val 2 B1.val 1} | 1{B.val 1}
的第
一维的宽度,整数的宽度为w。
t1 = i * w1; t6 = j * w;
t2 = j * w;
t7 = t5 + t6;
t3 = t1 + t2; t8 = b[t7];
t4 = a[t3];
t9 = t4 + ppt课件 t8;
20
6.6.1 在图6-30的语法制导定义中添加处理下列 控制流构造的规则:
ቤተ መጻሕፍቲ ባይዱ
4
ppt课件
ppt课件
5
(2)设code 为综合属性,代表各非终结符 的代码属性
type为综合属性,代表各非终结符的类型属 性
inttoreal把整型值转换为相等的实型值 vtochar将数值转换为字符串
ppt课件
6
ppt课件
7
ppt课件
8
5.3.3 给出一个SDD对x*(3*x+x*x)这样的表达式求 微分。表达式中涉及运算符+和*,变量x和常 量。假设不进行任何简化,也就是说,比如 3*x将被翻译为3*1+0*x。
1)A.s = B.i + C.s 不满足S属性定义,满足L属性定义 2)A.s = B.i + C.s 和 D.i = A.i + B.s 不满足S属性定义,满足L属性定义 3)A.s = B.s + D.s 满足S属性定义,满足L属性定义 4)A.s=D.i,B.i=A.s+C.s,C.i=B.s和D.i=B.i+C.i 不 1 满足S属性定ppt课义件 ,不满足L属性定义
| {D.val 0;
D.b 0}
ppt课件
13
第6章 中间代码生成
6.1.1 为下面的表达式构造DAG ((x+y)-((x+y)*(x-y)))+((x+y)*(x-y))
ppt课件
14
6.2.1 将算术表达式 a+-(b+c) 翻译成
5.2.4 这个文法生成了含“小数点”的二进制:
S L.L | L L LB | B B 0|1
设计一个L属性的SDD来计算S.val,即输入串的十进制数值。 比如,串101.11应该被翻译为十进制数5.635。提示:使 用一个继承属性L.side来指明一个二进制位在小数点的哪 一边。
2
ppt课件
改写这个SDT,使得基础文法不再是左递归的,但仍然可 以计算出整个输入串的相同的B.val的值。
12
ppt课件
非终结符D的综合属性b表示二进制数的位数, val表
示对应的十进制数的数值。消除左递归后如下:
B 1D {B.val 1 2D.b D.val}
D 0D1 {D.val D1.val; D.b D1.b 1}
S1.code|| label(S1.next)|| B.code
ppt课件
21
S-->for ( S1; B; S2 ) S3
S1.next=newlabel() B.true=newlabel() begin=newlabel() B.fale=S.next S2.next =S1.next S3.next=begin S.code=S1.code||label(S1.next)||
为了求小数部分的值,引入L的综合属性b记录2的 L
的位数次幂值(2 length of L)
S L1.L2 S.val = L1.val +L2.val / L2.b; S L S.val = L.val; L L1 B L.val = L1.val *2 + B.val;
L.b = L1.b*2; L B L.val = B.val; L.b = 2; B 0 B.val = 0; B 1 B.val = 1;
18
ppt课件
6.4.2 使用图6-20中的增量式翻译方案重复练习6.4.1
在增量方式中,gen不仅要构造出一个新的三地址指令,还
要将它添加到至今为止已生成pp的t课件指令序列之后。
19
6.4.3 使用使用图6-22所示的翻译方案来翻译下 列赋值语句:
2) x = a[i][j] + b[i][j] 假设w1为数组a的第一维的宽度,w2为数组b
ppt课件
3
5.3.1 下面是涉及运算符+和整数或浮点运算分量的表达式的 文法。区分浮点数的方法是看它有无小数点。
E ET |T T num.num | num
1)给出一个SDD来确定每个项T和表达式E的类型。 2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀
表达式。使用一个单目运算符intToFloat把一个整数转换为 相等的浮点数。
1)一个repeat语句,repeat S while B 2)一个for循环语句,for (S1 ; B ; S2) S3
S-->repeat S1 while B
begin=newlabel() S1.next=newlabel() B.true=begin B.false = S.next S.code=label(begin)||
1)抽象语法树 2)四元式序列 3)三元式序列 4)间接三元式序列
ppt课件
15
1)抽象语法树:
ppt课件
16
2)四元式序列:
3)三元式序列:
4)间接三元式序列:
ppt课件
17
6.4.1 向图6-19的翻译方案中加入对应于下列产生式的规则: 1) E E1 * E2 2) E E1(单目加)
B.code||label(begin)|| S2.code|| gen('goto' S1.next)|| label(B.true)||S3.code|| gen('goto' begin)
第5章 语法制导的翻译
5.2.3 假设我们有一个产生式 A 。BAC,DB,C,D这四个非终 结符号都有两个属性:s是一个综合属性,而i是一个继承属 性。对于下面的每组规则,指出(i)这些规则是否满足S属性 定义的要求。(ii)这些规则是否满足L属性定义的要求。(iii) 是否存在和这些规则一致的求值过程?
exp 为原表达式的字符串,s 为求导后的字符串。 || 为串联接符。
ppt课件
9
ppt课件
10
ppt课件
11
5.4.3 下面的SDT计算了一个由0和1组成的串的值。它把输入 的符号串当作按照正二进制数来解释。
B B10{B.val 2 B1.val} | B11{B.val 2 B1.val 1} | 1{B.val 1}
的第
一维的宽度,整数的宽度为w。
t1 = i * w1; t6 = j * w;
t2 = j * w;
t7 = t5 + t6;
t3 = t1 + t2; t8 = b[t7];
t4 = a[t3];
t9 = t4 + ppt课件 t8;
20
6.6.1 在图6-30的语法制导定义中添加处理下列 控制流构造的规则:
ቤተ መጻሕፍቲ ባይዱ
4
ppt课件
ppt课件
5
(2)设code 为综合属性,代表各非终结符 的代码属性
type为综合属性,代表各非终结符的类型属 性
inttoreal把整型值转换为相等的实型值 vtochar将数值转换为字符串
ppt课件
6
ppt课件
7
ppt课件
8
5.3.3 给出一个SDD对x*(3*x+x*x)这样的表达式求 微分。表达式中涉及运算符+和*,变量x和常 量。假设不进行任何简化,也就是说,比如 3*x将被翻译为3*1+0*x。
1)A.s = B.i + C.s 不满足S属性定义,满足L属性定义 2)A.s = B.i + C.s 和 D.i = A.i + B.s 不满足S属性定义,满足L属性定义 3)A.s = B.s + D.s 满足S属性定义,满足L属性定义 4)A.s=D.i,B.i=A.s+C.s,C.i=B.s和D.i=B.i+C.i 不 1 满足S属性定ppt课义件 ,不满足L属性定义