4.4 表达式及赋值语句的翻译.
赋值语句翻译

赋值语句翻译一. 任务要求在理解翻译原理的基础上.用C 语言写一个实现赋值语句翻译的程序。
1定义赋值语句2分析出翻译中要解决的问题3明确翻译错误的表达以及处理4程序设计以及调试二. 实验目的.加深对语法制导翻译原理的理解,掌握将语法所识别的语法范畴变换为某种中间代码的语义翻译方法三. 赋值语句的定义编译过程的语义分析阶段将要完成两项主要工作.首先分析语言的含义.接着用一种中间代码将这种含义描述出来。
四元式主要由4 部分组成..op,arg1,arg2,result其中op 是运算符.arg1arg2 分别是第一和第二个运算对象.当op 是一目运算时.常常将运算对象定义为arg1。
例如.表达式-C 和赋值语句X=a 的四元式可分别表示为.@C-T=a-X四元式之间的联系是通过临时变量或已定义的变量来实现的.这样易于调整和变动四元式.也为中间代码的优化工作带来很大方便。
例如.下图表示了一个表达式 X = a * b + c / d 的四元式序列。
(1) ( *, a, b, T1 )(2) ( /, c, d, T2 )(3) ( +, T1, T2, T3 )(4) ( =, T3, -, X )图3.1 表达式的四元式序列编译系统中.有时将四元式表示成另一种更直观、更易理解的形式――三地址代码。
三地址代码形式定义为.X a op b其中X a b 可为变量名或临时变量名.a b 还可为常数.op 是运算符.这种表示法与赋值语句的区别是每个语句的右边只能有一个运算符。
图3.1 的四元式序列可以表示成如下三地址代码序列.(1) T1 = a * b(2) T2 = c / d(3) T3 = T1 + T2(4) X = T3三地址代码形式突出表现了每一个四元式中参加运算的对象和结果变量.因此有两个地址为操作对象的地址.第3 个为存放结果的临时变量.或用户自定义变量的地址。
这种表示形式有利于中间代码的优化和目标代码的生成。
编译原理-算术表达式赋值句数组元素的引用布尔表达式

10
一维数组元素的地址计算:
跳过前i-1个单元
addr(A[i]) = a + (i-1)*w
首首首
W首 首 首
二维数组元素的地址计算: addr(A[i1,i2])=a+((i1-1)*d2+(i2-1))*w
跳过前i2-1个单元
跳过前i1-1行
11
n维数组元素的地址计算 addr(A[i1,i2,...,in]) =a+((i1-1)*d2*d3*...*dn+(i2-1)*d3*d4*...*dn+...+ (in-1))*w =a-(d2*d3*...*dn+d3*d4*...*dn+...+dn+1)*w +(i1*d2*d3*...*dn+i2*d3*d4*...*dn+...+in-1*dn+in)*w =a–c*w+v*w 根据假设条件③w=1: addr(A[i1,i2,...,in])=a–c+v 其中: c = d2*d3*d4...*dn+d3*d4*d5...*dn+*d4*d5*d6...*dn...+dn+1 = (d2+1)*d3*...*dn+d4*d5...*dn+...+dn+1 =((d2+1)*d3+1)*d4*d5...*dn+...+dn+1 ...... = (...((d2+1)*d3+1)*d4...+1)*dn+1 同理: v = (...((i1*d2+i2)*d3+i3)*d4...+in-1)*dn+in
2023年大学_EDA技术与VHDL第二版(潘松著)课后习题答案下载

2023年EDA技术与VHDL第二版(潘松著)课后习题答案下载EDA技术与VHDL第二版(潘松著)课后答案下载第1章 EDA技术概述1.1 EDA技术及其发展1.1.1 EDA技术的发展1.1.2 EDA技术的涵义1.1.3 EDA技术的基本特征1.2 EDA技术的主要内容及主要的EDA厂商1.2.1 EDA技术的主要内容1.2.2 主要EDA厂商概述1.3 EDA技术实现目标1.3.1 超大规模可编程逻辑器件1.3.2 半定制或全定制ASIC1.3.3 混合ASIC1.4 EDA技术应用1.4.1 EDA技术应用形式1.4.2 EDA技术应用场合1.5 EDA技术的发展趋势1.5.1 可编程器件的发展趋势1.5.2 软件开发工具的发展趋势1.5.3 输入方式的发展趋势__小结思考题和习题第2章大规模可编程逻辑器件2.1 可编程逻辑器件概述2.1.1 PLD的'发展进程2.1.2 PLD的种类及分类方法2.2 简单可编程逻辑器件2.2.1 PLD电路的表示方法及有关符号 2.2.2 PROM基本结构2.2.3 PLA基本结构2.2.4 PAL基本结构2.2.5 GAL基本结构2.3 复杂可编程逻辑器件2.3.1 CPLD基本结构2.3.2 Altera公司器件2.4 现场可编程逻辑器件2.4.1 FPGA整体结构2.4.2 Xilinx公司FPGA器件2.5 在系统可编程逻辑器件2.5.1 ispLSl/pLSl的结构2.5.2 Lattice公司ispLSI系列器件 2.6 FPGA和CPLD的开发应用2.6.1 CPLD和FPGA的编程与配置2.6.2 FPGA和CPLD的性能比较2.6.3 FPGA和CPLD的应用选择__小结思考题和习题第3章 EDA设计流程与开发3.1 EDA设计流程3.1.1 设计输入3.1.2 综合3.1.3 适配3.1.4 时序仿真与功能仿真3.1.5 编程下载3.1.6 硬件测试3.2 ASIC及其设计流程3.2.1 ASIC设计方法3.2.2 一般的ASIC设计流程3.3 可编程逻辑器件的开发环境 3.4 硬件描述语言3.5 IP核__小结思考题和习题第4章硬件描述语言VHDL4.1 VHDL概述4.1.1 VHDL的发展历程4.1.2 VHDL的特点4.2 VHDL程序基本结构4.2.1 实体4.2.2 结构体4.2.3 库4.2.4 程序包4.2.5 配置4.3 VHDL基本要素4.3.1 文字规则4.3.2 数据对象4.3.3 数据类型4.3.4 运算操作符4.3.5 VHDL结构体描述方式 4.4 VHDL顺序语句4.4.1 赋值语句4.4.2 IF语句4.4.3 等待和断言语句4.4.4 cASE语句4.4.5 LOOP语句4.4.6 RETIARN语句4.4.7 过程调用语句4.4.8 REPORT语句4.5 VHDL并行语句4.5.1 进程语句4.5.2 块语句4.5.3 并行信号代人语句4.5.4 并行过程调用语句4.5.5 并行断言语句4.5.6 参数传递语句4.5.7 元件例化语句__小结思考题和习题第5章 QuartusⅡ软件及其应用5.1 基本设计流程5.1.1 建立工作库文件夹和编辑设计文件 5.1.2 创建工程5.1.3 编译前设计5.1.4 全程编译5.1.5 时序仿真5.1.6 应用RTL电路图观察器5.2 引脚设置和下载5.2.1 引脚锁定5.2.2 配置文件下载5.2.3 AS模式编程配置器件5.2.4 JTAG间接模式编程配置器件5.2.5 USBBlaster编程配置器件使用方法 __小结思考题和习题第6章 VHDL应用实例6.1 组合逻辑电路设计6.1.1 基本门电路设计6.1.2 译码器设计6.1.3 数据选择器设计6.1.4 三态门设计6.1.5 编码器设计6.1.6 数值比较器设计6.2 时序逻辑电路设计6.2.1 时钟信号和复位信号6.2.2 触发器设计6.2.3 寄存器和移位寄存器设计6.2.4 计数器设计6.2.5 存储器设计6.3 综合实例——数字秒表的设计__小结思考题和习题第7章状态机设计7.1 一般有限状态机7.1.1 数据类型定义语句7.1.2 为什么要使用状态机 7.1.3 一般有限状态机的设计 7.2 Moore型有限状态机设计 7.2.1 多进程有限状态机7.2.2 单进程有限状态机7.3 Mealy型有限状态机7.4 状态编码7.4.1 状态位直接输出型编码 7.4.2 顺序编码7.4.3 一位热码编码7.5 状态机处理__小结思考题和习题第8章 EDlA实验开发系统8.1 GW48型实验开发系统原理与应用8.1.1 系统性能及使用注意事项8.1.2 GW48系统主板结构与使用方法8.2 实验电路结构图8.2.1 实验电路信号资源符号图说明8.2.2 各实验电路结构图特点与适用范围简述8.3 GW48CK/GK/EK/PK2系统信号名与芯片引脚对照表 __小结思考题和习题第9章 EnA技术实验实验一:全加器的设计实验二:4位加减法器的设计实验三:基本D触发器的设计实验四:同步清零计数器的设计实验五:基本移位寄存器的设计串人/串出移位寄存器实验六:同步预置数串行输出移位寄存器的设计实验七:半整数分频器的设计实验八:音乐发生器的设计实验九:交通灯控制器的设计实验十:数字时钟的设计EDA技术与VHDL第二版(潘松著):内容简介《EDA技术与VHDL》主要内容有Altera公司可编程器件及器件的选用、QuartusⅡ开发工具的使用;VHDL硬件描述语言及丰富的数字电路和电子数字系统EDA设计实例。
表达式及赋值语句的翻译ppt课件

返填。
.
13
例如,假定E的四元式需要回填“真”出口的有p、 q、r这三个四元式,则它们可链接成如图4–6所示 的一条真值链(记作tc)。
(p) (x, x, x,0) …
(q) (x , x, x,p) …
(r) (x, x, x,q)
0是链尾标志 地址(r)是E.tc的链首
.
14
为了处理E.tc和E.fc这两项语义值,我们 需要引入如下的语义变量和函数:
(7) EB→E(1)∨ {Backpatch(E(1).fc,nxq);
EB.tc = E(1).tc; }
(8) E→EBE(2) {E.fc = E(2).fc;
E.tc = merge(EB.tc,E(2).tc);}
注意: EA 、EB是与E不同的非终结符, E(1) 、E(2)是与E相同的非终结符。
算术表达式:
– 算术运算符: +、-、*、/、^等 – 运算对象:操作数 – 算术运算符的运算顺序一般为^、 *、/、 +、-,
且满足左结合,其运算优先级高于布尔运算符, 且高于任何关系运算符。
.
9
为简单起见,我们遵循以上运算约定讨论下 述文法G[E]生成的布尔表达式:
G[E]:E→E∧E∣E∨E∣┐E∣(E)∣i∣i rop i
对于每个非终结符E,我们需要为它赋予两个语义
值E.tc和E.fc,以分别记录E所对应的四元式需要
回填“真”、“假”出口的四元式地址所构成的
链。这是因为在翻译过程中,常常会出现若干转
移四元式转向同一个目标但目标位置又未确定的
情况,此时可用“拉链”的方法将这些四元式链
接起来,待获得转移目标的四元式地址时再进行
53 赋值语句的翻译

• 注释: || 表示代码序列的连接 注释:
例 5-7:
S
翻译 a:= -c+b*34
id
:= E1
E + E 21 id E2 * E 22 num
-
E 11 id
a:= -c+b*34的中间代码
• • • • t2:=0 - c t3:=b*34 t1:=t2+t3 a:=t1
c+b*34的中间代码的生成过程 a:= -c+b*34的中间代码的生成过程
实现赋值语句的翻译
基本子程序
–产生一条中间代码 gen(code) 产生一条中间代码 –产生新的临时变量 newtemp 产生新的临时变量
属性设置
–中间代码序列 code 中间代码序列 –存储位置 place 存储位置
赋值语句的四元式翻译
S → id := E S.code := E.code || gen( id.place':='E.place ) E → E1 + E2 E.place := newtemp; E.code := E1.code || E2.code || gen(E.place':='E1.place'+'E2.place) E → E1 * E2 E.place := newtemp; E.code := E1.code || E2.code || gen(E.place':='E1.place'*'E2.place)
S.next
循环语句的属性文法
S → while C do S1 C.false := S.next; S.begin := S1.next := newlabel; C.true := S1.begin := newlabel; S.code := gen( S.begin':' ) || C.code || gen( C.true':' ) || S1.code || gen( 'goto'S.begin ) 语义过程 –新标号的产生 newlabel 新标号的产生
语义分析和语法制导翻译-编译原理-06-(二)

E.place:= E1.place; E.code:= E1.code
E.place:= id.place; E.code:= ' ' E.place:= num.val;E.code:= ' '
注释: || 表示代码序列的连接
T.type := „real‟ L1.in := L.in addtype( id.entry, L.in )
L → id
entry addtype
addtype( id.entry, L.in ) 单词 id 的属性(符号表入口)
在符号表中为变量填加类型信息
属性文法的作用
抽象描述语义处理的要求
习题
1. 下列文法是一个二进制数的文法。试根据 该文法,编写一个语法制导定义,描述由 S 生成的二进制数的数值计算。 S -> L . L L -> L B | B B -> 0 | 1 2. 参照下列表达式文法编写语法制导定义, 描述表达式的类型计算。要求在不同精度的 数的计算中,结果取精度高的类型。 E -> E + T | T T -> n.n | n
分析树和属性计算
S-属性定义:
仅包括综合属性
对于所有A
→ X1 X2 …Xn, 的属性
A的属性计算仅用X1…Xn
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左
至右计算
对于所有 Xi
A→X1 X2 … Xn
属性计算仅使用A X1 X2 … Xi-1 的属性
第17讲 赋值语句的翻译

(5) L→Elist ] { L.place:=newtemp; emit(L.place ‘:=’ Elist.array ‘-’ C); L.offset:=newtemp; emit(L.offset ‘:=’ w ‘*’ Elist.place) }
视频区域
(6) L→id { L.place:=id.place; L.offset:=null }
||
gen(E.place
‘:=’
E1.plac视e 频‘+区’ E域2.place)
E.code:=E1.code || E2.code || gen(E.place ‘:=’ E1.place ‘*’ E2.place)
E.place:=newtemp;
E.code:=E1.code || gen(E.place ‘:=’ ‘uminus’ E1.place)
L.offset
若L为简单变量,null 若L为下标变量,指存放可变部分的临时变量的名字
((…i1 n2+i2)n3+i3)…)nk+ik)×w + base-((…((low1 n2+low2)n3+low3)…)nk+lowk)×w
带数组元素引用的赋值语句
(1) S→L:=E (2) E→E+E (3) E→(E) (4) E→L (5) L→Elist ] (6) L→id (7) Elist→ Elist, E (8) Elist→id [ E
A[i1,i2,…,ik] ((…i1 n2+i2)n3+i3)…)nk+ik) ×w + base-((…((low1 n2+low2)n3+low3)…)nk+lowk)×w
语法制导翻译和中间代码生成

例如:
产生式 语义子程序 (0)S` E {PRINT E•VAL} (1)E E (1)+E(2) {E•VAL= E (1) •VAL +E(2) •VAL } (2)E E (1)*E(2) {E•VAL= E (1) •VAL *E(2) •VAL } (3)E (E (1)) {E•VAL= E (1) •VAL } (4)E i {E•VAL= LEXVAL } 注:LEXVAL指的是词法分析送来的机内二进制整数
3、后缀表示式(逆波兰表达式) Operand1 Operand2 Operator 4、树形表示法
注:常用中间代码表示法是四元式。
赋值语句的翻译
仅含简单变量的表达式的赋值语句的翻译 1、赋值语句的文法 A i=E E E+E|E*E|-E|(E)|i 2、需要的语义过程 NEWTEMP函数:每次调用送回一个代表新临时 变量的序号,可认为是送回T1 、 T2这样的一些 临时变量 ENTRY(i)函数:用于查变量i的符号表入口地址
2、实例:对布尔式X+Y>Z∨A∧(┐B∨C)进行翻译: 解:语法制导得翻译是在语法分析的过程中进行的,若利
用G(B)文法的LR分析表对上句进行LR分析,在其过程中 进行语义分析;则得到的四元式序列是:
(+,X,Y,T1) ;E+E进行归约,识别了算术运算 (>, T1,Z, T2) ; E >E进行归约,识别了关系运算 (┐,B,_, T3) ; ┐E归约 (∨, T3,C, T4) ; E∨E进行归约 (∧,A, T4,T5) ; E∧E进行归约 (∨, T2, T5, T6) ; E∨E进行归约
四、常见的中间代码形式 1、四元式形式: (Operator,Operand1,Operand2,Result) 注: 1) Operand1,Operand2,Result 可能是用户自定 义的变量,也可能是编译时引进的变量。 这里 Operator是双目运算符,若只有一个运算量,则 是单目运算符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2018/12/15 4
语义子程序所涉及的语义变量、语义过程及函数说明:
(1) 语义变量E.place:即用E.place表示存放E值的变 量名在符号表中的入口地址或临时变量名的整数码。 (2) 语义函数newtemp( ):即每次调用newtemp( )时 都将回送一个代表新临时变量的整数码;临时变量名 按产生的顺序可设为T1、T2、……。 (3) 语义过程 emit(op,arg1,arg2,result) : emit 的功 能是产生一个四元式并填入四元式表中。
编 译 原 理 Principle of Compiling
郭 一 晶
厦门大学嘉庚学院 2008 年 9 月
2018/12/15 1
4.4 表达式及赋值语句的翻译
4.4.1 简单算术表达式和赋值语句的翻译 4.4.2 布尔表达式的翻译
2018/12/15
2
4.4.1 简单算术表达式和赋值语句的翻译
2018/12/15 6
(5) E→(E(1)) { E.place= E(1) .place ; } (6) E→i { p=lookup(); if (p!=NULL) E.place = p; /*另一种表示为E.place= entry(i)*/ else error( );}
T E(1) ∨ E(2) F F (a) T
“真”出口 “假”出口
T E(1) F
T
∧ E(2)
F (b)
“真”出口 “假”出口
2018/12/15
12
在自下而上的分析过程中,一个布尔式的真假出 口往往不能在产生四元式的同时就填上,我们只 好把这种未完成的四元式的地址 (编号)作为E的语 义值暂存起来,待到整个表达式的四元式产生完 毕之后,再来填写这个未填入的转移目标。
2018/12/15 11
如何确定一个表达式的真假出口呢? 考虑表达式E(1)∨E(2),若E(1)为真,则立即知道E也 为真,因此,E(1)的真出口也就是整个E的真出口; 若E(1)为假,则E(2)必须被计值,此时E(2)的第一个四 元式就是E(1)的假出口。当然,E(2)的真假出口也就 是整个E的真假出口。类似的考虑适用于对E(1)∧E(2) 的翻译。
简单变量:指普通变量和常数,但不含数 组元素及结构引用等复合型数据结构;
简单算术表达式:一种仅含简单变量的算 术表达式。 简单算术表达式的计值顺序与四元式出现 的顺序相同,因此容易将其翻译成四元式 形式,这些翻译方法稍加修改也可用于产 生三元式或间接三元式。
3
2018/12/15
考虑以下文法G[A]: A→i=E E→E+E∣E*E∣−E∣(E)∣i 在此,非终结符A代表“赋值语句”。 文法 G[A] 虽然是一个二义文法,但通过 确定运算符的结合性及规定运算符的优 先级就可避免二义性的发生。 为了实现由表达式到四元式的翻译,需 要给文法加上语义子程序,以便在进行 归约的同时执行对应的语义子程序。
(4) 语义函数lookup():其功能是审查 是否出现在符号表中,是则返回在符号表的入 口指针,否则返回NULL。
2018/12/15 5
文法G[A]中的每一个产生式的语义子程序: (1) A→i=E {p = lookup(); if(p==NULL) error( ); else emit(=, E.place, _, P); } (2) E→E(1)+E(2) {E.place=newtemp( ); emit(+, E(1) .place, E(2).place, E.place);} (3) E→E(1)*E(2) {E.place=newtemp( ); emit(*, E(1) .place, E(2).place, E.place);} (4) E→−E(1) {E.place=newtemp( ); emit(uminus, E(1).place, _, E.place);}
P101 例4.1试分析赋值语句X= −B*(C+D) 的语法制导翻译过程。
2018/12/15
7
4.4.2 布尔表达式的翻译
程序设计语言中的布尔表达式有两个作用, 一是计算逻辑值,更多的情况是二,用作改 变控制语句中的条件表达式,如在if-then, if-then-else或while-do语句中。 表达式:由运算符与运算对象组成。 布尔表达式:
– 布尔运算符: ┐、∧、∨,或为not、and和or (注:
C语言中为!、&& 和 ||)。 – 运算对象:布尔变量、常量或关系表达式。 – 布尔运算符的运算顺序一般为┐、∧、∨,且∧ 和∨服从左结合,布尔算符的运算优先级低于任 何关系运算符。
2018/12/15 8
关系表达式: – 关系运算符: <、<=、==、!=、>=、>等 – 运算对象:算术表达式 – 关系运算符的优先级相同但不得结合,其运算 优先级高于布尔运算符,低于任何算术运算符。 算术表达式: – 算术运算符: +、-、*、/、^等 – 运算对象:操作数 – 算术运算符的运算顺序一般为^、 *、/、 +、-, 且满足左结合,其运算优先级高于布尔运算符, 且高于任何关系运算符。
2018/12/15 9
为简单起见,我们遵循以上运算约定讨论下 述文法G[E]生成的布尔表达式: G[E]:E→E∧E∣E∨E∣┐E∣(E)∣i∣i rop i
注意: rop 代=、>=、>等。
2018/12/15
10
计算布尔表达式通常有两种方法: 1. 仿照计算算术表达式的文法,按布尔表 达式的运算顺序一步步地计算出真假值, 如1 ∨ (┐0∧0) ∨0。 2. 根据布尔运算的特点实施某种优化,省 略不影响运算结果的运算。例如,在计算 A∨B时,若计算出的A值为1,则B值就 无需再计算了;同样,在计算A∧B时若 发现A值为0,则B值也无需计算,A∧B 的值一定为0。 注 意:假定函数过程的工作不出现P102 的副作用情况。