编译原理-声明语句的翻译

合集下载

[工学]哈工大编译原理

[工学]哈工大编译原理
和 * x=y。
2021/8/26计算机学院
10
6.1.4 三地址代码的具体实现
1.四元式 op, arg1, arg2, result
2.三元式 op, arg1, arg2
3.间接三元式 间接码表+三元式表
四元式需要利用较多的临时单元,四元式 之 间 的联系通过临时变量实现。
中间代码优化处理时,四元式比三元式方
procedure partition (y ,z :integer ) var i,j ,x,v: integer; begin … end;
begin … end;
2021/8/26计算机学院
30
P
M
ε②
proc Q
D

;N
D;
S③
2021/8/26计算机学院
ε⑤ D; S ③
proc P ; N
三地址语句的四元式表示
(- , c , , t1)
(* , b , t1 , t2)
(- , c , , t3)
(* , b , t1 , t4)
(+ ,t2 , t4 , t5)
(= , t5 , ,a)
2021/8/26计算机学院
13
三地址语句的三元式表示
op
arg1 arg2
(0) uminus c
a:=b * - c+b * -c
2021/8/26计算机学院
4
=
a
+
*
*
b
-
b
-
c
c
2021/8/26计算机学院
(a)语法树
5
赋值语句: 中 缀式: a:=b*-c+b*-c 后缀式:

编译原理-中间代码生成

编译原理-中间代码生成

S.code = gen(S.begin ‘:’) || E.code || gen(‘if’ E.place ‘=’ ‘0’ ‘goto’ S.after) || S1.code || gen(‘goto’ S.begin) || gen(S.after ‘:’)
8.1.5 三地址码的实现
四元组,三元组
{E.nptr = mknode(‘+’, E1.nptr,E2.nptr) } {E.nptr = mknode(‘*’, E1.nptr,E2.nptr) } {E.nptr = mknode(‘uminus’, E1.nptr) } {E.nptr = E1.nptr } {E.nptr = mkleaf(id, id.entry) }
{T.type = pointer(T1.type); T1.width = 4}
8.2.2 作用域的处理
处理作用域的翻译模式 符号表栈
PMD
{ addwidth(top(tblptr), top(offset));
pop(tblptr); pop(offset) }
M
{ t:=mktable(null); push(t, tblptr);
{t:=mktable(top(tblptr)); push(t,tblptr);
push(0,offset);}
D id : T {enter(top(tblptr), , T.type, top(offset));
top(offset):=top(offset) + T.width
8.3.3 数组元素寻址
一维数组
type A[low..high];
base (i – low) * w

编译原理 第5章语法制导的翻译

编译原理 第5章语法制导的翻译

属性和文法符号相关联 规则和产生式相关联

根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值


E→E1+T E.code=E1.code || T.code || ‘+’ code表示了我们关心的表达式的逆波兰表示,规则说明 加法表达式的逆波兰表示由两个分量的逆波兰表示并置, 然后加上‘+’得到。
digitlexval=3
18
适用于自顶向下分析的SDD


前面的表达式文法存在直接左递归,因 此无法直接用自顶向下方法处理。 消除左递归之后,无法直接使用属性val 进行处理:


比如规则:T→FT’ T’→*FT’ T对应的项中,第一个因子对应于F, 而运算符在T’中。
19
相同表达式的不同文法的比较
38
例5.15 分析栈实现的例子

假设语法分析栈存放在一个被称为stack 的记录数组中,下标top指向栈顶;


stack[top]指向这个栈的栈顶;stack[top-1] 指向栈顶下一个位置; 如果不同的文法符号有不同的属性集合,我 们可以使用union来保存这些属性值。(归 约时,我们知道栈顶向下的各个符号分别是 什么)
语义翻译的流程
输 入 符 号 串 分 析 树 依 赖 图




的 计
实际上,编译中语义翻译的实现并不是 按图中的流程处理的;而是随语法分析 的进展,识别出一个语法结构,就对它 的语义进行分析和翻译。

9
5.1 语法制导定义

4.什么是语法制导定义(SDD) 上下文无关文法和属性/规则的结合;

语义分析和语法制导翻译-编译原理-06-(二)

语义分析和语法制导翻译-编译原理-06-(二)
E.p
是语法结构树指针 是名字的表项入口 是数值
id.entry num.val
树构造函数
mknode 建中间结点 mkleaf 建叶结点
生成语法树的属性文法
产生式 S→id:=E 语义规则 S.p:= mknode(':=', mkleaf(id, id.entry), E.p)
E→E1+E2 E.p:= mknode('+', E1.p, E2.p) E→E1*E2 E.p:= mknode('*', E1.p, E2.p) E→ -E1 E→ (E1) E→ id E→ num E.p:= mknode('-', 0, E1.p) E.p:= E1.p E.p:= mkleaf(id, id.entry) E.p:=mkleaf(num,num.val)
翻译模式的设计
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in } L1 , id { addtype(id.entry, L.in) } L → id { addtype(id.entry, L.in) }
从其兄弟结点和父结点的属性值计算出来的 如:L.in
固有属性(单词属性)
属性的计算
构造语法分析树,填加响应的语义规则 综合属性
自底向上按照语义规则来计算各结点的综
合属性值
继承属性
需要探讨计算次序
例6-3:3*5+4 的
语法树与属性计算
E.val=15 T.val=15 T.val=3 F.val=3 digit.attr=3 *

学习C语言需要理解的英语单词

学习C语言需要理解的英语单词

‎Data‎Stru‎c ture‎s基本数‎据结构‎ Di‎c tion‎a ries‎字典‎Prio‎r ity ‎Q ueue‎s堆‎Grap‎h Dat‎a Str‎u ctur‎e s 图‎Set‎Data‎Stru‎c ture‎s集合‎Kd-‎T rees‎线段树‎Num‎e rica‎l Pro‎b lems‎数值问题‎So‎l ving‎Line‎a r Eq‎u atio‎n s 线性‎方程组‎Band‎w idth‎Redu‎c tion‎带宽压缩‎Ma‎t rix ‎M ulti‎p lica‎t ion ‎矩阵乘法‎Det‎e rmin‎a nts ‎a nd P‎e rman‎e nts ‎行列式‎Cons‎t rain‎e d an‎d Unc‎o nstr‎a ined‎Opti‎m izat‎i on 最‎值问题‎Line‎a r Pr‎o gram‎m ing ‎线性规划‎Ran‎d om N‎u mber‎Gene‎r atio‎n随机数‎生成‎F acto‎r ing ‎a nd P‎r imal‎i ty T‎e stin‎g因子分‎解/质数判‎定A‎r bitr‎a ry P‎r ecis‎i on A‎r ithm‎e tic ‎高精度计算‎Kn‎a psac‎k Pro‎b lem ‎背包问题‎Dis‎c rete‎Four‎i er T‎r ansf‎o rm 离‎散Four‎i er变换‎Co‎m bina‎t oria‎l Pro‎b lems‎组合问题‎So‎r ting‎排序‎Sear‎c hing‎查找‎Medi‎a n an‎d Sel‎e ctio‎n中位数‎Ge‎n erat‎i ng P‎e rmut‎a tion‎s排列生‎成G‎e nera‎t ing ‎S ubse‎t s 子集‎生成‎G ener‎a ting‎Part‎i tion‎s划分生‎成G‎e nera‎t ing ‎G raph‎s图的生‎成C‎a lend‎r ical‎Calc‎u lati‎o ns 日‎期J‎o b Sc‎h edul‎i ng 工‎程安排‎Sati‎s fiab‎i lity‎可满足性‎Gr‎a ph P‎r oble‎m s ——‎poly‎n omia‎l图论-‎多项式算法‎Co‎n nect‎e d Co‎m pone‎n ts 连‎通分支‎Topo‎l ogic‎a l So‎r ting‎拓扑排序‎Mi‎n imum‎Span‎n ing ‎T ree ‎最小生成树‎Sh‎o rtes‎t Pat‎h最短路‎径T‎r ansi‎t ive ‎C losu‎r e an‎d Red‎u ctio‎n传递闭‎包M‎a tchi‎n g 匹配‎Eu‎l eria‎n Cyc‎l e / ‎C hine‎s e Po‎s tman‎Eule‎r回路/中‎国邮路‎Edge‎and ‎V erte‎x Con‎n ecti‎v ity ‎割边/割点‎Ne‎t work‎Flow‎网络流‎Dra‎w ing ‎G raph‎s Nic‎e ly 图‎的描绘‎Draw‎i ng T‎r ees ‎树的描绘‎Pla‎n arit‎y Det‎e ctio‎n and‎Embe‎d ding‎平面性检‎测和嵌入‎Gra‎p h Pr‎o blem‎s——‎h ard ‎图论-NP‎问题‎C liqu‎e最大团‎In‎d epen‎d ent ‎S et 独‎立集‎V erte‎x Cov‎e r 点覆‎盖T‎r avel‎i ng S‎a lesm‎a n Pr‎o blem‎旅行商问‎题H‎a milt‎o nian‎Cycl‎e Ham‎i lton‎回路‎G raph‎Part‎i tion‎图的划分‎Ve‎r tex ‎C olor‎i ng 点‎染色‎E dge ‎C olor‎i ng 边‎染色‎G raph‎Isom‎o rphi‎s m 同构‎St‎e iner‎Tree‎Stei‎n er树‎Fee‎d back‎Edge‎/Vert‎e x Se‎t最大无‎环子图‎Comp‎u tati‎o nal ‎G eome‎t ry 计‎算几何‎Conv‎e x Hu‎l l 凸包‎Tr‎i angu‎l atio‎n三角剖‎分V‎o rono‎i Dia‎g rams‎Voro‎n oi图‎Nea‎r est ‎N eigh‎b or S‎e arch‎最近点对‎查询‎R ange‎Sear‎c h 范围‎查询‎P oint‎Loca‎t ion ‎位置查询‎Int‎e rsec‎t ion ‎D etec‎t ion ‎碰撞测试‎Bin‎Pack‎i ng 装‎箱问题‎Medi‎a l-Ax‎i s Tr‎a nsfo‎r mati‎o n 中轴‎变换‎P olyg‎o n Pa‎r titi‎o ning‎多边形分‎割S‎i mpli‎f ying‎Poly‎g ons ‎多边形化简‎Sh‎a pe S‎i mila‎r ity ‎相似多边形‎Mo‎t ion ‎P lann‎i ng 运‎动规划‎Main‎t aini‎n g Li‎n e Ar‎r ange‎m ents‎平面分割‎Mi‎n kows‎k i Su‎m Min‎k owsk‎i和‎S et a‎n d St‎r ing ‎P robl‎e ms 集‎合与串的问‎题S‎e t Co‎v er 集‎合覆盖‎Set ‎P acki‎n g 集合‎配置‎S trin‎g Mat‎c hing‎模式匹配‎Ap‎p roxi‎m ate ‎S trin‎g Mat‎c hing‎模糊匹配‎Te‎x t Co‎m pres‎s ion ‎压缩‎C rypt‎o grap‎h y 密码‎Fi‎n ite ‎S tate‎Mach‎i ne M‎i nimi‎z atio‎n有穷自‎动机简化‎Lon‎g est ‎C ommo‎n Sub‎s trin‎g最长公‎共子串‎Shor‎t est ‎C ommo‎n Sup‎e rstr‎i ng 最‎短公共父串‎DP‎——Dyn‎a mic ‎P rogr‎a mmin‎g——动态‎规划‎r ecur‎s ion ‎——递归‎A2A ‎i nteg‎r atio‎n A2‎A整合a‎b stra‎c t ‎抽象的‎abst‎r act ‎b ase ‎c lass‎(ABC‎)抽象基类‎ab‎s trac‎t cla‎s s 抽象‎类a‎b stra‎c tion‎抽象、抽‎象物、抽象‎性a‎c cess‎存取、访‎问a‎c cess‎leve‎l访问级别‎ac‎c ess ‎f unct‎i on ‎访问函数‎acc‎o unt ‎账户‎acti‎o n ‎动作‎a ctiv‎a te 激‎活a‎c tive‎活动‎的a‎c tual‎para‎m eter‎实参‎ada‎p ter ‎适配器‎add-‎i n 插‎件a‎d dres‎s地址‎add‎r ess ‎s pace‎‎地址空间‎add‎r ess-‎o f op‎e rato‎r取地址‎操作符‎ADL ‎(argu‎m ent-‎d epen‎d ent ‎l ooku‎p)‎A DO(A‎c tive‎X Dat‎a Obj‎e ct)A‎c tive‎X数据对象‎ad‎v ance‎d‎高级的‎aggr‎e gati‎o n 聚合‎、聚集‎algo‎r ithm‎算法‎alia‎s别名‎ali‎g n 排列‎、对齐‎allo‎c ate ‎分配、配置‎al‎l ocat‎o r分配器‎、配置器‎ang‎l e br‎a cket‎尖括号‎ann‎o tati‎o n ‎注解、评注‎AP‎I(Ap‎p lica‎t ion ‎P rogr‎a mmin‎g Int‎e rfac‎e)应用‎(程序)编‎程接口‎app ‎d omai‎n(ap‎p lica‎t ion ‎d omai‎n)应用域‎ap‎p lica‎t ion ‎应用、应‎用程序‎appl‎i cati‎o n fr‎a mewo‎r k 应用‎程序框架‎app‎e aran‎c e 外观‎ap‎p end ‎附‎加a‎r chit‎e ctur‎e架构、‎体系结构‎arc‎h ive ‎f ile ‎归档文件、‎存档文件‎arg‎u ment‎引数(传给‎函式的值)‎。

编译原理术语中英文对照表

编译原理术语中英文对照表

General left recursion
通常左递归
General LR(1) parsing algorithm 通用 LR(1)语法分析算法
Global data
全局数据
Global declaration Global optimization
全局声明 全局优化
Global variable GNU Bison parser generator
《编译原理》术语中英文对照表
Index
2007 年 7 月
No.
Englis h
Absolute machine code
Abstract machine
Abstract syntax tree
Accepting state
Access chain
Access link
Action table
Activation environment
F
Chinese 阶乘函数 有限自动机 First 集 一个词法分析器的自动 生成器 浮点除法 浮点数 浮点值类型 流图 Follow 集 形式定义 For 语句 编译器的前端 函数声明 函数定义
chapter
G
No.
Englis h
Chinese
Garbage collection
垃圾收集
General immediate left recursion 通常直接左递归
chapter
Attribute grammar Automata Automatic code generator Auxiliary routine Available expression
属性文法 自动机 代码自动生成 附属函数 有效表达式

C_C++术语中英文对照

bit 位元 位
bitwise 以 bit 为单元┅、位元逐一┅ ?
bitwise copy 以 bit 为单元进行复制、位元逐一复制 位拷贝
derived class 衍生类别 派生类
destructor(dtor) 解构式 析构函数、析构器
device 装置 设备
component 组件 组件
concrete 具象的 实在的
container 容器 容器
(存放资料的某种结构如 list, vector...)
context 背景关系、周遭环境、上下脉络 环境、上下文
const 常数(constant 的缩写,C++ 关键字)
base class 基础类别 基类
best viable function 最佳可行函式 最佳可行函式
(从 viable functions 中挑出的最佳吻合者)
call 呼叫、叫用 调用
call operator call(函式呼叫)运算子 () 调用运算符
(同 function call operator)
class body 类别本体 类体 ?
class declaration 类别宣告、类别宣告式 类声明
class definition 类别定义、类别定义式 类定义
command line 命令行 命令行
(系统文字模式提示号之後所下的整行命令)
compiler 编译器 编译器
class derivation list 类别衍化列 类继承列表
class head 类别表头 类头 ?
class hierarchy 类别继承体系 ?
access function 存取函式 存取函数

C语言常见英语词汇及其他提示语

运算符与表达式:1.constant 常量2. variable 变量3. identify 标识符4. keywords 关键字5. sign 符号6. operator 运算符7. statement语句8. syntax 语法9. expression 表达式10. initialition 初始化11. number format 数据格式12 declaration 说明13. type conversion 类型转换14.define 、definition 定义条件语句:1.select 选择2. expression 表达式3. logical expression 逻辑表达式4. Relational expression 关系表达式5.priority优先6. operation运算7.structure 结构循环语句:1.circle 循环2. condition 条件3. variant 变量4. process过程5.priority优先6. operation运算数组:1. array 数组2. reference 引用3. element 元素4. address 地址5. sort 排序6. character 字符7. string 字符串8. application 应用函数:1.call 调用2.return value 返回值3.function 函数4. declare 声明5. `parameter 参数6.static 静态的7.extern 外部的指针:1. pointer 指针2. argument 参数3. array 数组4. declaration 声明5. represent 表示6. manipulate 处理结构体、共用体、链表:1 structure 结构2 member成员3 tag 标记4 function 函数5 enumerate 枚举6 union 联合(共用体)7 create 创建8 insert 插入9 delete 删除10 modify 修改文件:1、file 文件2、open 打开3、close 关闭4、read 读5、write 写6、error 错误序号主要章节常用英汉对照词汇备注1 运算符与表达式(operator and expression )汉语英语常量constant变量variable标识符identify关键字keywords符号sign运算符operator语句statement语法syntax表达式Expression初始化Initialization数据格式number format说明Declaration类型转换type conversion定义Define 、definition2 条件语句(conditionstatement) 选择select表达式expression逻辑表达式logical expression关系表达式Relational expression 优先priority运算operation结构structure3 循环语句(circle statement) 循环circle条件condition变量variant过程process优先priority运算operation4 函数(function) 调用call返回值return value函数function声明declare参数parameter静态的static外部的extern5 数组和指针(array andpointer) 数组array引用reference元素element地址address排序sort字符character字符串string应用application指针pointer参数argument数组array声明declaration表示represent处理manipulate6 结构体、共用体(structures 、union )结构structure 成员member标记tag函数function枚举enumerate联合( 共用体) union创建create插入insert删除delete修改modify7 文件(file) 文件file打开open关闭close读read写write错误errorProgram Design 程序设计writing program 编写程序standardize vt.使标准化coding the program 编程simplify vt.单一化,简单化programming 程序revision n.校订,修正programmer n.程序员occupy vt.占领,住进logic n.逻辑,逻辑学BASIC 初学者通用符号指令代码machine code 机器代码teaching language 教学语言debug n.DOS命令,调试simplicity n.单纯,简朴compactness a.紧凑的,紧密的timesharing system 分时系统description n.描述,说明interactive language 交互式语言break n.中断manufacturer n.制造业者structure chart 结构图dialect n.方言,语调the program flow 程序流expense n.费用,代价manager module 管理模块uniformity n.同样,划一worder module 工作模块archaic a.己废的,古老的mainmodule 主模块sufficient a.充分的,足够的submodule 子模块data processing 数据处理modify v.修正,修改business application 商业应用outline n.轮廓,概要scientific application 科学应用compose分解lexical a.字典的,词汇的code 代码non-programmer n.非编程人员node vt改为密码notation n.记号法,表示法,注释pseudocode n.伪代码verbosity n.唠叨,冗长commas n.逗点逗号record n.记录documentation 文档subrecord n.子记录flowchart/flow 程表/流程data division 数据部visual a.视觉的procedure division 过程部represent vt.表现,表示,代表comprise vt.包含构成structured techniques结构化技术operator n.运算符,算子straightforward a.笔直的,率直的commercial package 商业软件包subroutine n.子程序generator n.产生器,生产者driver module 驱动模块mathematician n.专家line by line 逐行operator n.作符translate vt.翻译,解释forerunner n.先驱modular 摸块化ancestor n.祖宗cumbersome a.讨厌的,麻烦的teaching programming 编程教学lengthy a.冗长的,漫长的alter vi./vt.改变flaw n.缺点裂纹devclop vt.发达separate a.各别的recompile v.编译assist n.帮助cycle n.循环technician n.技师remove vt.移动,除去straight line 直线category n.种类,类项rectangle n.长方形,矩形P-code p代码virtrally ad.事实上symology n.象征学象征的使用register n.寄存器to summaries 总之,总而言之by convention 按照惯例cyptic n.含义模糊的,隐藏的diamond-shaped a,菱形的bracket n.括号decision n判断obviate 除去,排除terminal n. a终端机,终端的keyword n.关键字card reader 阅读器underline vt.下划线translator program 译程序monadic a. monad(单位)的Programming 程序设计dec/binary n.二进制source language 源语shift 变化,转移,移位machine language 机器overflow n.溢出machine instruction 机器指令arithmetic n.算术,算法computer language 计算机语composite symbol 复合型符号.assembly language 汇编语assignment n.赋值floating point number浮点数proliferation n.增服high-level language高级语pointer n.指针natural language 自然语言array n.数组矩阵,source text 源文本subscript n.下标intermediate language 中间语言type conversion 类型转换software development 软件开发address arithmetic 地址运算map vt.映射,计划denote vt.指示,表示maintenance cost 维护费用subprogram n.子程序legibility n.易读性,易识别separate compilation 分离式编泽amend vt.修正,改善alphabetic a.照字母次序的consumer n.消费者digit n.数字位数enormous a.巨大的,庞大的numeric expression 数值表达式reliability n.可信赖性,可信度tap n.轻打,轻敲,选择safety n.安全,安全设备print zone 打印区property n.财产,所有权column n.列correctness n.正确,functionality n.机能semicolon n.分号portable a.叮携带的,可搬运的survey n.概观.altoggle n.肘节开关task n.作,任务declaration n.宣告说明source program 源程序mufti-dimension array 多维数组object program 目标程序其他提示语:CPU(Center Processor Unit)中央处理单元mainboard主板RAM(random accessmemory)随机存储器(内存)ROM(Read Only Memory)只读存储器Floppy Disk软盘Hard Disk硬盘CD-ROM光盘驱动器(光驱)monitor监视器keyboard键盘mouse鼠标chip芯片CD-R光盘刻录机HUB集线器Modem= MOdulator-DEModulator,调制解调器P-P(Plug and Play)即插即用UPS(Uninterruptable Power Supply)不间断电源BIOS(Basic-input-OutputSystem)基本输入输出系统CMOS(Complementary Metal-Oxide-Semiconductor)互补金属氧化物半导体setup安装uninstall卸载wizzard向导OS(Operation Systrem)操作系统OA(Office AutoMation)办公自动化exit退出edit编辑copy复制cut剪切paste粘贴delete删除select选择find查找select all全选replace替换undo撤消redo重做program程序license许可(证)back前一步next下一步finish结束folder文件夹Destination Folder目的文件夹user用户click点击double click双击right click右击settings设置update更新release发布data数据data base数据库DBMS(Data Base Manege System)数据库管理系统view视图insert插入object对象configuration配置command命令document文档POST(power-on-self-test)电源自检程序cursor光标attribute属性icon图标service pack服务补丁option pack功能补丁Demo演示short cut快捷方式exception异常debug调试previous前一个column行row列restart重新启动text文本font字体size大小scale比例interface界面function函数access访问manual指南active激活computer language计算机语言menu菜单GUI(graphical userinterfaces )图形用户界面template模版page setup页面设置password口令code密码print preview打印预览zoom in放大zoom out缩小pan漫游cruise漫游full screen全屏tool bar工具条status bar状态条ruler标尺table表paragraph段落symbol符号style风格execute执行graphics图形image图像Unix用于服务器的一种操作系统Mac OS苹果公司开发的操作系统OO(Object-Oriented)面向对象virus病毒file文件open打开colse关闭new新建save保存exit退出clear清除default默认LAN局域网WAN广域网Client/Server客户机/服务器ATM( AsynchronousTransfer Mode)异步传输模式Windows NT微软公司的网络操作系统Internet互联网WWW(World Wide Web)万维网protocol协议HTTP超文本传输协议FTP文件传输协议Browser浏览器homepage主页Webpage网页website网站URL在Internet的WWW服务程序上用于指定信息位置的表示方法Online在线Email电子邮件ICQ网上寻呼Firewall防火墙Gateway网关HTML超文本标识语言hypertext超文本hyperlink超级链接IP(Address)互联网协议(地址)SearchEngine搜索引擎TCP/IP用于网络的一组通讯协议Telnet远程登录IE(Internet Explorer)探索者(微软公司的网络浏览器)Navigator引航者(网景公司的浏览器)multimedia多媒体ISO国际标准化组织ANSI美国国家标准协会able 能activefile 活动文件addwatch 添加监视点allfiles 所有文件allrightsreserved 所有的权力保留altdirlst 切换目录格式andfixamuchwiderrangeofdiskproblems 并能够解决更大范围内的磁盘问题andotherinFORMation 以及其它的信息archivefileattribute 归档文件属性assignto 指定到autoanswer 自动应答autodetect 自动检测autoindent 自动缩进autosave 自动存储availableonvolume 该盘剩余空间badcommand 命令错badcommandorfilename 命令或文件名错batchparameters 批处理参数binaryfile 二进制文件binaryfiles 二进制文件borlandinternational borland国际公司bottommargin 页下空白bydate 按日期byextension 按扩展名byname 按名称bytesfree 字节空闲callstack 调用栈casesensitive 区分大小写causespromptingtoconfirmyouwanttooverwritean 要求出现确认提示,在你想覆盖一个centralpointsoftwareinc central point 软件股份公司changedirectory 更换目录changedrive 改变驱动器changename 更改名称characterset 字符集checkingfor 正在检查checksadiskanddisplaysastatusreport 检查磁盘并显示一个状态报告chgdrivepath 改变盘/路径node 节点npasswd UNIX的一种代理密码检查器,在提交给密码文件前,它将对潜在的密码进行筛选。

编译原理作业集-第七章(精选.)

编译原理作业集-第七章(精选.)第七章语义分析和中间代码产⽣本章要点1. 中间语⾔,各种常见中间语⾔形式;2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译;3. 过程调⽤的处理;4. 类型检查;本章⽬标掌握和理解中间语⾔,各种常见中间语⾔形式;各种语句到中间语⾔的翻译;以及类型检查等内容。

本章重点1.中间代码的⼏种形式,它们之间的相互转换:四元式、三元式、逆波兰表⽰;3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式;4.各种控制流语句的翻译及其中间代码格式;5.过程调⽤的中间代码格式;6.类型检查;本章难点1. 各种语句的翻译;2. 类型系统和类型检查;作业题⼀、单项选择题:1. 布尔表达式计算时可以采⽤某种优化措施,⽐如A and B⽤if-then-else可解释为_______。

a. if A then true else B;b. if A then B else false;c. if A then false else true;d. if A then true else false;2. 为了便于优化处理,三地址代码可以表⽰成________。

a. 三元式b. 四元式c. 后缀式d. 间接三元式3. 使⽤三元式是为了________:a. 便于代码优化处理b. 避免把临时变量填⼊符号表c. 节省存储代码的空间d. 提⾼访问代码的速度4. 表达式-a+b*(-c+d)的逆波兰式是________。

a. ab+-cd+-*;b. a-b+c-d+*;c. a-b+c-d+*;d. a-bc-d+*+;5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表⽰是_______。

a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=;6. 在⼀棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。

语言的语法及其翻译方案

各种语言成分的语法及其翻译方案(示例)1. 普通声明语句的翻译下面是声明语句的文法:P→ prog id (input, output) D ; SD→D ; D | List : T | proc id D ; SList→List1, id | idT→ integer | real | array C of T1 | T1 | record DC → [num] C | ε声明语句的翻译模式:P→prog id (input, output){offset := 0}D ; SD→D ; DD→id: T{enter (, T.type, offset); offset:= offset + T.width}T→integer{T.type := integer; T.width := 4}T→real{T.type :=real; T.width :=8}T→array [num] of T1{T.type := array(num.val, T1.type);T.width := num.val×T1.width} T→↑T1{T.type := pointer(T1.type); T.width := 4}2. 嵌套过程中声明语句的翻译嵌套过程声明语句的产生式。

P→prog id (input, output) D ; SD→D ; D | id : T | proc id ; D ; S(7.1) 嵌套过程声明语句的翻译模式:P→prog id (input, output) MD;S{addwidth(top(tblptr),top(offset));pop(tblptr);pop(offset)}M→ε{t := mktable(nil);push(t, tblptr); push(0, offset)}D→D1;D2D→proc id; N D1 ; S{t:= top(tblptr);addwidth(t, top(offset));pop(tblptr);pop(offset); enterproc(top(tblptr), ,t)} D→id : T{enter(top(tblptr), , T.type, top(offset));top(offset) := top(offset) + T.width}N→ε{t:= mktable(top(tblptr)); push(t, tblptr); push(0, offset)}3. 记录的翻译下面是生成记录类型的产生式:T→record D end生成记录类型的翻译模式:T→ record L D end {T.type := record(top(tblptr));T.width := top(offset);pop(tblptr); pop(offset)}L→ε{t:= mktable(nil); push(t, tblptr); push(0, offset)}4. 赋值语句的翻译下面是典型的赋值语句文法:S→Left := EE→E1 + E2 | E1 * E2 | - E1 | (E1 ) | LeftLeft→Elist ] | idElist→Elist, E | id [E(7.2) 赋值语句的翻译模式:⑴S→Left:=E{if Left.offset=null then/*Left是简单变量id*/gencode(Left.addr ':=' E.addr);elsegencode(Left.addr '[' Left.offset '] ' ':=' E.addr)} /*Left是数组元素*/⑵E→E1+E2{E.addr:=newtemp;gencode(E.addr ':='E1.addr'+'E2.addr)}⑶E→(E1){E.addr:= E1.addr}⑷E→Left{if Left.offset=null then /*Left是简单id*/E.addr:= Left.addrelse begin /*Left是数组元素*/E.addr:=newtemp;gencode(E.addr ':=' Left.addr ' [' Left.offset ']')end}⑸Left→Elist]{ Left.addr:=newtemp; /*Left是数组元素,因此存放基址和位移*/Left.offset:=newtemp;gencode(Left.addr ':=' c(Elist.array));gencode(Left.offset ':=' Elist.addr '*' width(Elist.array))}⑹Left→id{Left.addr:=id.addr; Left.offset:=null}⑺Elist→Elist1, E{t:=newtemp;m:= Elist1.ndim+1;gencode(t ':=' Elist1.addr '*' limit(Elist1.array, m)); /*计算e m-1×n m */gencode(t ':=' t '+' E.addr); /* 计算+i m*/Elist.array:= Elist1.array;Elist.addr:=t;Elist.ndim:=m}⑻Elist→id[E {Elist.array:=id.addr; Elist.addr:= E.addr; Elist.ndim:=1}5.各种控制结构的翻译5.1 布尔表达式的翻译布尔表达式的文法为:⑴B→B1or M B2⑵B→B1and M B2⑶B→not B1⑷B→(B1)⑸B→E1relop E2⑹B→true⑺B→false⑻M→ε布尔表达式的翻译模式如下所示:⑴B→B1or M B2{ backpatch(B1.falselist, M.quad);B.truelist := merge(B1.truelist, B2.truelist);B.falselist := B2.falselist}⑵B→B1and M B2{backpatch(B1.truelist, M.quad);B.truelist := B2.truelist;B.falselist := merge(B1.falselist, B2.falselist)}⑶B→not B1{B.truelist := B1.falselist; B.falselist := B1.truelist}⑷B→(B1) {B.truelist := B1.truelist; B.falselist := B1.falselist}⑸B→E1relop E2{B.truelist :=makelist(nextquad);B.falselist := makelist(nextquad+1);gencode('if' E1.addr relop.opE1.addr 'goto –');gencode('goto –')}⑹B→true{B.truelist := makelist(nextquad); gencode('goto –')}⑺B→false{B.falselist := makelist(nextquad); gencode('goto –')}⑻M→ε{M.quad := nextquad}5.2 常用控制流语句的翻译控制流语句if-then,if-then-else和while-do的文法为:⑴S→if B then S1⑵S→if B then S1else S2⑶S→while B do S1⑷S→begin L end⑸S→A⑹L→L1;S⑺L→S(7.9)if-then,if-then-else和while-do语句的翻译模式:⑴S→if B then M1S1N else M2S2{backpatch(B.truelist, M1.quad);backpatch(B.falselist, M2.quad);S.nextlist := merge(S1.nextlist, merge(N.nextlist, S2.nextlist))}⑵N→ε{N.nextlist := makelist(nextquad); gencode('goto –')}⑶M→ε{M.quad := nextquad}⑷S→if B then M S1{backpatch(B.truelist, M.quad);S.nextlist := merge(B.falselist, S1.nextlist)}⑸S→while M1B do M2S1{backpatch(S1.nextlist, M1.quad);backpatch(B.truelist,M2.quad);S.nextlist:=B.falselist; gencode('goto'M1.quad)}⑹S→begin L end{S.nextlist:=L.nextlist}⑺S→A{S.nextlist := nil}⑻L→L1;MS{backpatch(L1.nextlist, M.quad); L.nextlist := S.nextlist}⑼L→S{L.nextlist := S.nextlist}5.3 for循环语句的翻译for循环语句的文法如下所示:S→ for id := E1to E2step E3do S1for循环语句的翻译模式如下所示:S→ for id := E1to E2step E3do M S1 {backpatch(S1.nextlist, M.again,);gencode(‘goto’, -, -, M.again); S.nextlist := M.again;}M→ε {M.addr := entry(id); gencode(‘:=’, E1.addr, -, M.addr); T1:=newtemp;gencode(‘:=’, E2.addr, -, T1); T2:=newtemp; gencode(‘:=’, E3.addr, -, T2); q:=nextquad;gencode(‘goto’, -, -, q+2); M.again:=q+1; gencode(‘+’, M.addr, T2, M.addr);M.nextlist:=nextquad; gencode(‘if’M.addr‘>’T1‘goto–’);}5.4 repeat语句的翻译repeat语句的文法如下所示:S→ repeat S1until BRepeat语句的翻译模式如下所示:S→repeat M S1until N B{backpatch(B.falselist,M.quad);S.nextlist:=B.truelist}M→ε{M.quad := nextquad}N→ε{backpatch(S1.nextlist, nextquad)}6. switch语句的语法制导翻译switch语句的文法为:S→ switch (E ) ClistClist→ case V : S Clist | default : Sswitch语句的翻译模式如下所示:⑴S→switch (E){i:=0; S i.nextlist:=0; push S i.nextlist; push E.addr; push i; q:=0; push q}Clist{pop q;pop i;pop E.addr;pop S i.nextlist;S.nextlist:=merge(S i.nextlist, q); push S.nextlist} ⑵Clist→case V :{pop q; pop i; i:=i+1; pop E.addr;if nextquad≠0 then backpatch(q, nextquad);q:=nextquad;gencode(‘if’ E.addr‘≠’ V i‘goto’ L i);push E.addr; push i;push q}S{pop q; pop i; pop E.addr; pop S i-1.nextlist;p:=nextquad;gencode(‘goto -’); gencode(L i‘:’);S i.nextlist:=merge(S i.nextlist, p);S i.nextlist:=merge(S i.nextlist, S i-1.nextlist);push S i.nextlist; push E.addr; push i; push q}Clist⑶Clist→default :{pop q; pop i; i:=i+1; pop E.addr;if nextquad≠0 then backpatch(q, nextquad);q:=nextquad;gencode(‘if’ E.addr‘≠’ V i‘goto’ V i+1);push E.addr; push i;push q}S{pop q; pop i; pop E.addr; pop S i-1.nextlist;p:=nextquad;gencode(‘goto -’); gencode(L i‘:’);S i.nextlist:=merge(S i.nextlist, p);S i.nextlist:=merge(S i.nextlist, S i-1.nextlist);push S i.nextlist; push E.addr; push i; push q}7. 过程调用和返回语句的翻译过程调用和返回语句的文法如下所示:S→ call id(Elist)Elist→Elist, E | ES→ return E过程调用语句的翻译模式如下所示:⑴S→call id (Elist) {n :=0;repeatn:=n+1;从queue的队首取出一个实参地址p;gencode('param', -, -, p);until queue为空;gencode('call', id.addr, n, -)}⑵Elist→Elist, E{将E.addr添加到queue的队尾}⑶Elist→E{初始化queue,然后将E.addr加入到queue的队尾。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6
例 声明的语法制导翻译: <2> 变量声明的语法制导翻译(续3) a : array [10] of int; x : int
D3 D1 a : T2 ; x D2 : T3 int
a x
array(10,integer) integer ......
0 40
array [ 10 ] of T1 int
8
4.4.3 过程的定义与声明
1.过程(procedure): 过程头(做什么)+过程体(怎么做);(函数,主程序) 2.过程的三种形式:过程定义、过程声明和过程调用。 过程定义:过程头+过程体; 过程声明:过程头;
9
例:Ada过程
4.4.3 过程的定义与声明(续) -- 规格说明 -- 体中的声明 -- 可执行语句
5
<2> 变量声明的语法制导翻译(续2) (b) 填写符号表信息的语法制导翻译 1. 全程量offset:记录当前符号存储的偏移量,初值设为0 2. 属性.type和.width:变量的类型和所占据的存储空间 3. 过程enter(name, type, offset):为type类型的变量name 建立符号表条目,并为其分配存储空间(位置)offset (1)D→D;D (2)D→id:T {enter(, T.type, offset); offset:=offset+T.width;} (3)T→int {T.type:=integer; T.width:=4;} (4)T→real {T.type:=real; T.width:=8;} (5)T→array [num] of T1 {T.type:=array(num.val, T1.type); T.width:=num.val*T1.width;} (6)T→^T1 {T.type:=pointer(T1.type); T.width:=4;}
15
<1> 值调用(续2)
等价的C++程序
// ---------- 值调用参数传递的演示程序 #include <iostream.h> void swap(int x, int y) { int temp; temp=x; x=y; y=temp; } void main () { int a(1), b(2); cout<<"before: a="<<a<<" b="<<b<<endl; swap(a, b); cout<<"after: a="<<a<<" b="<<b<<endl; }
7
D3 D1 a : T2 ; x D2 : T3
<2> 变量声明的语法制导翻译(续4)
array [ 10 ] of T1 int
int
序号 归约使用的产生式 语义处理结果 (1) T1→int T1.type=integer T1.width=4 (2) T2→array[num]of T1 T2.type=array(10,integer) T2.width=10*4=40 (3) D1→id:T2 enter(a,array(10),0) offset=40 (4) T3→int T3.type=integer T3.width=4 (5) D2→id:T3 enter(x,integer,40) offset=44
12
4.4.3.2 参数传递
1. 形参与实参 • 定义时的参数称为形参(parameter或formal parameter) • 引用时的参数称为实参(argument或actual parameter) 2. 常见的参数传递形式:(不同的语言提供不同的形式) • 值调用(call by value) • 引用调用(call by reference) • 复写-恢复(copy-in/copy-out) • 换名调用(call by name) 3. 参数传递方法的实质: 实参是代表左值、右值、还是实参本身的正文。
定义与声明同时: var c, p : array[1..2] of integer; display : array[1..24] of char; 强调: • 简单变量声明中类型是预定义的 • 组合变量声明中类型需自己定义(定义的两种形式)
3
<2> 变量声明的语法制导翻译 (a) 变量声明的文法: D → D ; D (1) | id : T (2) T → int (3) | real (4) | array [num] of T (5) | ^T (6) 产生式(5)是数组类型的声明,其中的数组元素个数由num 表示,如num可以是5或10等,这是一个简化了的表示方法,它 等价于1..5或1..10。 产生式(6)是指针类型的声明,其宽度(大小)是一个常量。 数组元素的类型和指针所指对象的类型可以是任意合法类型。
11
4.4.3.1 左值与右值(续)
(1) const two = 2; -- 声明一个值为2的常量two (2) x : integer; -- 声明一个类型为整型数的变量x (3) function max(a, b : integer) return integer; -- 声明一个返回值类型是整型数的函数max (4) x := two; -- 赋值句执行后,x当前值为2 (5) x := two + x; -- 赋值句执行后,x当前值变为4 (6) x := max(two,x)+x; -- 赋值句执行后,x当前值变为8 (7) 4 := x; -- 字面量不能作为左值 (8) two := x; -- 常量不能作为左值 (9) max(two,x) := two; -- 函数返回值不能作为左值 (10) x+two := x+two; -- 表达式的值不能作为左值
18
<2> 引用调用
引用调用的特点: 过程内部对形参的修改,等价于直接对实参的修改。 实参的特点:必须是左值。 参数传递和过程内对参数的使用原则: 1. 定义时形参被当作局部名看待,并在过程内部为形参 分配存储单元; 2. 调用过程前,将作为实参的变量的地址放进形参的存 储单元; 3. 过程内把形参单元中的数据当作地址,间接访问。 调用中: 定义时: 返回后: 调用时: f(a,b)过程内 f(x,y)过程外 f(a,b)过程内 f(x,y)过程外 a x a x 3 x 1 3 5 b y b y 5 y 2
定义: procedure swap(x,y:in out integer) is temp : integer; begin temp := x; x := y; y := temp; end swap; 声明与引用: procedure swap(x, y: in out integer); swap(a, b);
20
<2> 引用调用(续2)
等价的C++程序
运行结果: begin a:=1; b:=2; swap(a,b); a=2 writeln('a=', a); writeln(' b=', b) b=1 end. procedure swap(x, y : integer); var temp : integer; begin temp:=x; x:=y; y:=temp end;
4.4 声明语句的翻译
• 声明语句的作用是为可执行语句提供信息,以便于 其执行。 • 对声明语句的处理,主要是将所需要的信息正确地 填写进合理组织的符号表中。
1
4.4.1 变量的声明
<1> 变量的类型定义与声明 类型定义:为编译器提供存储空间大小的信息 变量声明:为变量分配存储空间 组合数据的类型定义和变量声明: 定义与声明在一起,定义与声明分离。 1. 定义确定存储空间,声明分配存储空间 2. 简单数据类型的存储空间是已经确定的,如integer可 以占4个字节,real可以占8个字节,char可以占1个字 节等。 3. 组合数据类型变量的存储空间,需要编译器根据程序 员提供的信息计算而定。
14
值调用举例:
<1> 值调用(续)
program reference ( input, output); var a, b : integer;
procedure swap(x, y : integer); var temp : integer; begin temp:=x; x:=y; y:=temp end; begin a:=1; b:=2; swap(a, b); writeln('a=', a); writeln('b=', b) end. 运行结果: a=1 b=2
2
<1> 变量的类型定义与声明 (续) 例:在Pascal程序中的类型定义与变量声明: 先定义后声明: type player = array[1..2] of integer; matrix = array[1..24] of char; var c, p : player; winner : boolean; display : matrix; movect : integer;
16
结 束(2010年5月4日)
17
上次课程内容回顾
1. 符号表(续) • 线性表与散列表(后进先出) • 作用域链与散列链 2. 变量声明的语法制导翻译 • 类型定义与变量声明 • 类型定义确定存储空间,变量声明分配存储空间 • 简单类型的预定义 3. 过程的定义与声明 • 过程的三个形态:定义、声明与引用 • 左值与右值 • 参数传递(形参与实参的结合) • 是传递左值、右值、还是正文 • 各种传递形式与处理方式——值调用
相关文档
最新文档