8 语义分析、中间代码与符号表

合集下载

(完整版)编译原理名词解释

(完整版)编译原理名词解释

(完整版)编译原理名词解释1.源语⾔:书写源程序所使⽤的语⾔2.源程序:⽤程序设计语⾔书写的程序3.⽬标语⾔:计算机的机器指令。

⽬标语⾔可以是机器语⾔,也可以是汇编语⾔,或者是其他中间语⾔,但最终结果必是机器语⾔。

4.⽬标程序:由机器指令构成的程序。

⽬标程序是经过翻译程序加⼯后⽤⽬标语⾔表⽰的程序。

5.翻译程序:能够把某⼀种语⾔程序(源程序)改造成另⼀种语⾔程序(⽬标程序)将源程序译成逻辑上等价的⽬标程序的程序。

翻译程序有两种⼯作⽅式:编译和解释。

6.编译程序:也称翻译程序7.解释程序:有些翻译程序在翻译过程中并不产⽣完整的⽬标程序,⽽是翻译⼀句,解释执⾏⼀句,这样的称为解释程序。

8.汇编程序:由汇编语⾔写成的程序9.词法分析:执⾏词法分析的程序成为词法分析器,词法分析依据的是语⾔构词规则。

词法分析器从⽂件读⼊源程序,由字符拼接单词。

每当识别出⼀个单词,词法分析器就输出这个单词的内部码。

10.语法分析:执⾏语法分析的程序叫做语法分析器。

语法分析的任务就是根据语⾔的规则,将词法分析器所提供的单词种别分成各类语法范畴。

11.中间代码⽣成:中间代码产⽣有时称为语义分析,执⾏中间代码产⽣的程序称为中间代码⽣成器。

他的任务时按照语法分析器所识别出的语法范畴产⽣相应的中间代码,并建⽴符号表、常数表,等各种表格。

12.⽬标代码⽣成:执⾏⽬标代码⽣成的程序称为⽬标代码⽣成器。

他的任务是根据中间代码和表格信息,确定各类数据在内存中的位置,选择合适的指令代码,将中间代码翻译成汇编语⾔或机器指令,这部分⼯作与计算机硬件有关。

13.符号表:⽤于记录源程序中出现的标识符,⼀个标识符往往具有⼀系列的语义值,她包括标识符的名称、种属、类型、值存放的地址等等。

14.常数表:⽤于记录在源程序中出现的常数。

15.编译程序前端:是由词法分析器、语法分析器和中间代码产⽣器组成的。

她的特点是依赖于被编译的源程序,输出结果⽤中间代码描述,和⽬标机器⽆关。

编译原理陈意云版答案

编译原理陈意云版答案

编译原理陈意云版答案一. 引言编译原理是计算机科学中的一门重要课程,它研究的是将高级语言源代码转换为机器能够理解和执行的目标代码的方法和技术。

编译原理的学习对于理解计算机系统的运行原理和提高程序开发效率具有重要意义。

本文将以陈意云版的答案作为参考,向大家介绍编译原理的相关知识。

二. 词法分析词法分析是编译的第一个阶段,它将源代码分解成一个个单词(Token)。

在陈意云版中,常用的词法分析方法有正则表达式和有限自动机。

正则表达式可以方便地描述语言的词法规则,而有限自动机可以用于实现对输入的扫描和匹配。

词法分析器还可以将未识别的字符输入报告为错误。

三. 语法分析语法分析是编译的第二个阶段,它将词法分析器产生的Token序列转化为语法树。

在陈意云版中,常用的语法分析方法是上下文无关文法和递归下降分析。

上下文无关文法用于描述语言的语法规则,而递归下降分析是一种自顶向下的语法分析方法。

语法分析器还可以检查语法错误,并生成错误报告。

四. 语义分析语义分析是编译的第三个阶段,它对语法树进行语义检查和语义处理。

在陈意云版中,常用的语义分析方法有类型检查和符号表管理。

类型检查用于检查表达式和语句中的类型错误,而符号表管理用于管理变量和函数的定义和引用。

语义分析器还可以生成中间代码。

五. 中间代码生成中间代码生成是编译的第四个阶段,它将源代码转化为一种中间形式的代码。

在陈意云版中,常用的中间代码形式有三地址码和虚拟机代码。

中间代码是一种介于源代码和目标代码之间的形式,它可以方便地进行优化和生成目标代码。

六. 代码优化代码优化是编译的第五个阶段,它对中间代码进行优化,以提高程序的执行效率和减少代码的大小。

在陈意云版中,常用的代码优化技术有常量传播、公共子表达式消除和循环优化等。

代码优化器可以根据优化规则对中间代码进行优化,并生成优化后的中间代码。

七. 目标代码生成目标代码生成是编译的最后一个阶段,它将中间代码转化为目标代码。

第8章+语义分析和中间代码生成

第8章+语义分析和中间代码生成
(2)数组形式:三列(操作符或操作对象、左儿子位置和右儿子位置)
的二维数组,一结点一行,行号表示结点的位置。 【例】 a=b*c+b*d
1 2 a = 1 3 4 7 6 5 8 9
3
4 5 6 7 8 9
第8章 语义分析和中间代码生成
b
* c + b * d
8.2 中间代码
8.2.3 三地址码
1. 三地址码 (i)x := y op z (1) (2) (3) (4) t1:=b*c t2:=b*d t3:=t1+t2 a:=t3
(c,real)填入符号表,D.t =real
10
D
#
结束
8.3 自底向上语法制导翻译
第8章 语义分析和中间代码生成
8.3.2 说明语句的翻译
2. 数组说明的翻译
数组内情向量:存放数组的相关信息。
内情向量的地址存于符号表中。
数组引用的关键问题 —— 数组元素的地址计算

第8章 语义分析和中间代码生成
语义: E.val=T1.val+T2.val
E (E.val= T1.val+T2.val=12)
T1(T1.val=5)
第8章 语义分析和中间代码生成
T2(T1.val=7)
8.1 语义分析
8.1.2 语义的描述
(2)继承属性 一个文法符号N在产生式的右边出现,若它的t属性由该产生 式的左部非终结符或右部的其他符号的属性决定,则N.t为N的继 承属性。
第8章 语义分析和中间代码生成
8.1 语义分析
8.1.2 语义的描述
例:变量说明语句的文法 D→TL T→real | int L→id | L1, id T.type由real或int决定; 标识符表类型L.in由T.type确定, 且依次传给表中的每一个标识符。

编译器设计-符号表-中间代码生成

编译器设计-符号表-中间代码生成

编译器设计-符号表-中间代码⽣成编译器设计-符号表-中间代码⽣成Compiler Design - Symbol TableCompiler - Intermediate Code Generation⼀.Compiler Design - Symbol Table符号表是编译器为存储变量名、函数名、对象、类、接⼝等各种实体的出现情况⽽创建和维护的⼀种重要的数据结构。

符号表既可⽤于编译器的分析部分,也可⽤于编译器的综合部分。

符号表可⽤于以下⽬的,具体取决于所使⽤的语⾔:将所有实体的名称以结构化形式存储在⼀个位置。

以验证是否已声明变量。

要实现类型检查,请验证源代码中的赋值和表达式在语义上是否正确。

确定名称的作⽤域(作⽤域解析)。

符号表只是⼀个可以是线性表或哈希表的表。

它以以下格式为每个名称维护⼀个条⽬:<symbol name, type, attribute>例如,如果符号表必须存储有关以下变量声明的信息:static int interest;然后它应该存储条⽬,例如:<interest, int, static>attribute⼦句包含与名称相关的条⽬。

实施Implementation如果编译器要处理少量数据,那么符号表可以实现为⽆序列表,这很容易编码,但它只适⽤于⼩表。

符号表可以通过以下⽅式之⼀实现:线性(排序或未排序)列表⼆叉搜索树哈希表其中,符号表主要实现为哈希表,其中源代码符号本⾝被视为哈希函数的键,返回值是关于符号的信息。

操作Operations符号表(线性或哈希)应提供以下操作。

插⼊()此操作在分析阶段使⽤得更频繁,即编译器的前半部分,其中标识了标记并将名称存储在表中。

此操作⽤于在符号表中添加有关源代码中出现的唯⼀名称的信息。

存储名称的格式或结构取决于⼿头的编译器。

源代码中符号的属性是与该符号关联的信息。

此信息包含有关符号的值、状态、范围和类型。

函数的作⽤是:将符号及其属性作为参数,并将信息存储在符号表中。

高级语言程序的两种处理方式——编译和解释

高级语言程序的两种处理方式——编译和解释

⾼级语⾔程序的两种处理⽅式——编译和解释编译⽅式编译程序的功能就是把⾼级语⾔书写的源程序翻译成与之等价的⽬标程序(汇编语⾔或机器语⾔)。

编译程序的⼯作过程词法分析在词法分析阶段,源程序可以简单的看做是⼀个多⾏的字符串。

词法分析阶段是编译过程的第⼀阶段,主要任务是对源程序从前到后(从左到右)逐个字符进⾏扫描,从中识别出⼀个个“单词”符号。

词法分析程序输出的”单词“常采⽤⼆元组的⽅式,即单词类别和单词⾃⾝的值。

词法分析过程依据的语⾔的此法规则,即描述“单词”结构的规则。

词法分析器⼀般来说有两种⽅法构造:⼿⼯构造和⾃动⽣成。

⼿⼯构造可使⽤状态图进⾏⼯作,⾃动⽣成使⽤确定的有限⾃动机来实现。

词法分析器的功能输⼊源程序,按照构词规则分解成⼀系列单词符号。

单词是语⾔中具有独⽴意义的最⼩单位,包括:(1)关键字是由程序语⾔定义的具有固定意义的标识符。

(2)标识符⽤来表⽰各种名字,如变量名,数组名,过程名等等。

(3)常数常数的类型⼀般有整型、实型、布尔型、⽂字型等。

(4)运算符如+、-、*、/等等。

(5)界符如逗号、分号、括号、等等。

语法分析编译程序的语法分析器以单词符号作为输⼊,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成⼀个符合各类语法的构成规则,按该语⾔使⽤的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的⼀个语法单位。

语法分析的⽅法分为两种:⾃上⽽下分析法和⾃下⽽上分析法。

⾃上⽽下就是从⽂法的开始符号出发,向下推导,推出句⼦。

⽽⾃下⽽上分析法采⽤的是移进归约法,基本思想是:⽤⼀个寄存符号的先进后出栈,把输⼊符号⼀个⼀个地移进栈⾥,当栈顶形成某个产⽣式的⼀个候选式时,即把栈顶的这⼀部分归约成该产⽣式的左邻符号。

语法分析只考虑构成该句⼦的语法单位是否符合语法规则。

例如在分析除法表达式时在语法分析阶段只分析运算符左右两边是否为变量、常量、表达式等,⽽不去管除数是否为0。

编译原理课后答案 (2)

编译原理课后答案 (2)

编译原理课后答案1. 什么是编译原理?编译原理是计算机科学领域的一个重要分支,研究如何将高级程序设计语言表示的程序转化为计算机能够执行的机器语言代码。

编译原理主要涉及词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等内容。

2. 为什么需要编译原理?在计算机科学领域中,人们使用高级编程语言来编写程序。

但是,计算机只能理解机器语言,因此需要将高级语言转换为机器语言,以便计算机能够执行程序。

编译原理的作用就是实现这种高级语言到机器语言的转换过程。

3. 编译过程的主要步骤有哪些?编译过程主要包含以下几个步骤:3.1 词法分析词法分析是将源代码分解成一个个的标记(Token)的过程。

一个标记代表源代码中的一个基本单元,例如关键字、标识符、运算符、常量等。

词法分析器通常使用有限自动机(DFA)来实现。

3.2 语法分析语法分析是将词法分析产生的标记序列组织成抽象语法树(Abstract Syntax Tree)的过程。

它通过分析语法规则来确定源代码的结构和语义。

常用的语法分析方法有自顶向下的LL分析和自底向上的LR分析。

3.3 语义分析语义分析是对程序的语义进行静态检查和语义处理的过程。

它会检查程序是否符合语言的语义规范,并进行类型检查等处理。

语义分析将产生中间表示(Intermediate Representation,IR),用于后续的代码生成和优化。

3.4 中间代码生成中间代码生成是将源代码转化为一种中间表示的过程,中间表示通常是一种高级的抽象语言,方便进行后续的代码优化和目标代码生成。

3.5 代码优化代码优化是通过对中间代码进行分析和变换,改进程序的执行效率和资源利用率的过程。

代码优化的目标是生成更高效的目标代码,提高程序的执行速度和资源利用率。

3.6 目标代码生成目标代码生成是将中间代码转化为特定目标机器的机器代码的过程。

目标机器可以是计算机的硬件平台,也可以是虚拟机等。

3.7 符号表管理符号表是编译器中用于存储程序中的标识符信息的数据结构。

ch8-1_语法制导概述-中间代码8.1-8.3_(张素琴)

ch8-1_语法制导概述-中间代码8.1-8.3_(张素琴)

(5)复制语句 x:=y; (6)过程调用语句 param x 和 call p, n ; 过程返回语句 return y; (7)索引赋值 x:=y[i] 及 x[i] :=y ;
方法:语法制导翻译。
采用独立于机器的中间代 码的好处: 1. 便于编译系统建立和编译系统的移植; 2. 便于进行独立于机器的代码优化工作。
30
中间语言有四种形式: • 逆波兰表示(后缀式) • 三元式(三地址码)和树型表示 • 四元式
8.3.1 逆波兰表示
运算对象写在前,运算符在后,ab+,也称为后 缀式。后缀式表示源程序的自然层次结构(表达式 的计算次序),例如: a+b*c 后缀表示为abc*+ (a+b)*c后缀表示为ab+c* a:=b * c+b * -d后缀表示为abc*bd-*+:= 适合翻译表达式,不适合翻译控制语句。
如表达式的求值、
中间代码的生成
符号表的填写、
5
3. 为什么要此阶段?
–逻辑结构清楚;利于不同目标机上实现同一种语言; –有利于进行与机器无关的优化。
4. 什么是中间代码(Intermediate code)
–源程序的一种内部表示,不依赖目标机的结构,易 于机械生成目标代码的中间表示。
5. 中间代码的几种形式
26
练习:设AS为文法的综合属性集,AI为继承属性 集,求下列语法制导定义中的AI和AS
产生式 语义规则
(1) P→xQR
(2)P →yQR
(3) Q→ u (4)R→v
Q.b=R.d R.c=1 R.e=Q.a Q.b=R.f R.c=Q.a R.e=2 Q.a=3 R.d=R.c R.f=R.e

编译原理第八章 符号表

编译原理第八章  符号表
• 需要做作用域分析!
8.3 名字的作用范围(Fortran)
• Fortran 局部、全局
• 执行时过程(函数)不
Name
Information
嵌套,局部区域只有一
···

个现行段;
···
部 • 编译时,尽管查填符号
表过程只限于局部,但
考虑到地址分配的全局
性,需将每个程序段符
号表保存在外存中,采
• 定长方式 • 间接方式 (1)名字的间接存储 (2)信息的间接存储
Name ● ●
Information
如何组织
方式
6 S A MP L E 3 S U M
Name
Information ● ●
数组信息表 维数 首地址 维1
内情向量表
··· ···
以数组为例 维n
如何组织
• 对于名称:把所有标识符都存放在一个 独立的字符串数组,主栏只放一个指示 器和一个整数(名字的长度)
var f, g: real; procedure B3(y:real) const b=5; procedure B4 … end B4 end B3
end B2 end B1
8.3 名字的作用范围 (Pascal)
top
(14)…
B4 (13)…
0
h (12)… 13
sp b (11)…
12
y (10)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希

表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识

语义分析和中间代码的产生

语义分析和中间代码的产生

语义规则
S.nptr:=mknode('assign',mkleaf(id,id.place),E.nptr) 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.place)
15
E.place表示存放E值的名字 E.code表示对E求值的三地址语句序列 newtemp是个函数,对它的调用将产生一个新 的临时变量 三地址语句序列是语法树的线性表示,用临时变 量代替语法树中的结点 实际实现中,三地址语句序列往往是被存放到一 个输出文件中,而不是将三地址语句序列置入 code属性之中
13
(6)过程调用语句 param x 和 call p, n ; 过程返回语句 return y; (7)索引赋值 x:=y[i] 及 x[i] :=y ; (8)地址和指针赋值 x:=&y,x:=* y 和 * x:=y。
14
产生式
S→id:=E E→E1+E2 E→E1*E2 E→-E1 E→(E1) E→id
P→MD M→ε {addwidth(top(tblptr),top(offset)); pop(tblptr); pop(offset)} {t:=mktable(nil); ( ); push(t,tblptr); push(0,offset)} }
D→D1;D2 ; D→proc id; N D1;S D1; {t:=top(tblptr); = ( addwidth(t,top(offset)); pop(tblptr); );pop(offset); ( ); ( enterproc(top(tblptr), ),,t)} ( ), ,

简述符号表的主要功能

简述符号表的主要功能

简述符号表的主要功能符号表(symbol table)是一个数据结构,用于保存程序中的标识符及其相关信息。

它是编程语言编译器的重要组成部分,其主要功能是为编译器提供符号的唯一定义和引用。

符号表在编译过程中起着关键作用,用于记录程序中出现的各种标识符,以便在后续的语义分析、中间代码生成和代码优化等过程中进行查找和处理。

符号表的主要功能包括:1. 保存符号的声明和定义信息:符号表用来存储程序中各个标识符的声明和定义信息,包括变量、函数、类、结构体等。

对于每个标识符,符号表会记录其名称、数据类型、作用域、存储位置等相关信息。

这些信息将在后续的语义分析过程中被引用,确保程序的正确性和一致性。

2. 校验符号的使用:符号表可以帮助编译器检查符号的正确使用,并进行相应的错误处理。

例如,它可以检查变量是否被声明和定义,函数是否被调用时参数数量和类型是否正确等。

符号表通过记录各个标识符的属性和关联信息,可以对程序进行静态和动态的语义检查。

3. 管理符号的作用域和可见性:符号表用于管理程序中的作用域和标识符的可见性。

通过识别和记录定义和引用的符号所在的作用域,符号表可以确定标识符在不同作用域中的可见性和生命周期。

它确保了变量名不会冲突,且在正确的作用域内被引用。

4. 符号的内存分配和地址计算:符号表用于记录变量和其他符号的内存分配和地址计算信息。

对于全局变量、局部变量、类成员等不同类型的符号,符号表可以确定其存储类型(静态、堆、栈等)和存储位置。

这些信息对于生成中间代码和进行代码优化非常重要。

5. 符号的类型检查和转换:符号表可以保存和检查符号的数据类型及其相关信息。

编译器可以根据符号表中的类型信息进行类型检查,确保表达式和操作的类型匹配。

符号表还可以记录类型转换的规则和方法,以便在需要时进行自动转换。

6. 支持符号的查询和引用:符号表可以支持编译器和解释器在后续过程中对符号的查找和引用。

通过符号表,编译器可以根据标识符的名称和上下文,找到对应的符号信息,并进行进一步的处理和分析。

编译原理名词解释

编译原理名词解释

1.可以采用边翻译边执行的解释执行方式,这种处理程序称为解释程序。

解释程序的结果是源程序的执行结果。

2.先用目标机的汇编语言或机器语言书写源语言的一个子集的编译程序,然后再用这个子集作为书写语言,实现源语言的编译程序.通常这个过程会分成若干步,像滚雪球一样直到生成预计源语言的编译程序为止.我们把这样的实现方式称为自展技术.3.前端主要依赖于源语言而与目标机无关,包括词法分析、语法分析、语义分析和中间代码生成。

后端工作指那些以来与目标机而一般不依赖源语言,至于中间代码有关的那些阶段,及目标代码生成以及先关出错处理和符号表操作。

4.编译过程划分为:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段。

词法分析:从左到右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。

语法分析:在词法分析的基础上将单词分解成各类语法短语,如“程序”、“语句”、“表达式”。

语义分析:审查源程序有无语义错误,为代码生成阶段收集类型信息。

中间代码生成:进行了语法分析和语义分析之后,有的编译程序将源代码生成一种内部代码,这种内部表现形式叫中间语言或中间代码。

代码优化:对前阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间目标代码生成:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。

多余状态:从自动机开始状态出发,任何输入都打不到的状态或从该状态出发到不了终止状态。

等价状态:从状态A出发能由某一字符串而停止于终态,从状态B出发也能得出同一字符串而终止,A与b等价正则式:就是记录文本规则的代码基本快:指程序中一个顺序执行的语句,其中只有一个入口语句和一个出口语句,执行的只能从其入口语句进入其出口语句退出*闭包:设A为集合,则定义A的*闭包为A*=A0 UA+可归规范前缀:若含有句柄的规范前缀,且每个句柄是a的后缀称a是可归规范前缀。

编译原理陈意云版答案

编译原理陈意云版答案

编译原理陈意云版答案: 深入理解编译原理的关键概念和技术介绍编译原理是计算机科学中的重要领域之一,它研究的是将高级程序设计语言转换为计算机能够执行的机器语言的过程。

编译原理涉及到词法分析、语法分析、语义分析、中间代码生成、优化和代码生成等多个方面的知识和技术。

本文将从陈意云的角度出发,对编译原理的关键概念和技术进行深入的解析和讲述。

词法分析词法分析是编译过程的第一个阶段,它的目标是将源程序分解成一个个的记号(token)。

记号可以是关键字、标识符、常量、运算符等。

词法分析器通常采用有限自动机(DFA)来实现。

陈意云在词法分析中着重讲解了正则表达式和有限自动机的理论基础,并提供了一些实例来帮助读者更好地理解和掌握相关概念。

语法分析语法分析是编译过程的第二个阶段,它的目标是根据所给的语法规则,将词法分析产生的记号序列转换为语法树。

语法分析器通常采用上下文无关文法和分析算法来实现。

陈意云在语法分析中详细介绍了上下文无关文法和相关的推导、归约和语法树的构建等概念,并通过实例演示了文法定义和分析过程。

语义分析语义分析是编译过程的第三个阶段,它的目标是检查源程序的语义是否合法,并进行类型检查和作用域分析等。

陈意云在语义分析中提到了常见的语义错误类型和处理方法,并介绍了类型推导、符号表和作用域的概念和实现方式。

语义分析是编译过程中非常重要的阶段,它为后续的中间代码生成和代码优化提供了基础。

中间代码生成中间代码是在编译过程中产生的一种抽象的机器无关的代码表示形式。

中间代码生成是编译过程的第四个阶段,它的目标是将源程序转换为中间表示形式,以便后续的优化和代码生成。

陈意云在中间代码生成中详细介绍了常见的中间表示形式和符号表的设计与实现,并通过实例演示了如何将源程序转换为中间代码。

优化和代码生成优化和代码生成是编译过程的最后两个阶段,它们的目标是提高程序的执行效率和优化代码的质量。

陈意云在优化和代码生成中介绍了常见的优化技术和代码生成策略,并通过实例讲解了如何进行代码优化和生成。

语义分析与中间代码生成

语义分析与中间代码生成
out: ...}
第4章 语义分析和中间代码生成
公理语义概念是随着程序正确性的证明而发展
的。当正确性证明能构造时表明程序执行它的规格 说明所描述的计算。在一个证明中,每一个语句之 前之后都有一个逻辑表达式对程序的变量进行约束, 以此说明这个语句的含义。一般的记号是{P} S {Q}。
指称语义的基本概念是给每一段程序实体定义 一个数学意义上的对象,和一个从实体实例向数学 意义对象的映射的函数。
第4章 语义分析和中间代码生成
第4章 语义分析和中间代码生成
4.1 概述 4.2 属性文法 4.3 几种常见的中间语言 4.4 表达式及赋值语句的翻译 4.5 控制语句的翻译 4.6 数组元素的翻译 4.7 过程或函数调用语句的翻译 4.8 说明语句的翻译 4.9 递归下降语法制导翻译方法简介
第4章 语义分析和中间代码生成
(1) 类型检查,如参与运算的操作数其类型应相容。 (2) 控制流检查,用以保证控制语句有合法的转向 点。如C语言中不允许goto语句转入case语句流; break语句需寻找包含它的最小switch、while或for语 句方可找到转向点,否则出错。
第4章 语义分析和中间代码生成
(3) 一致性检查,如在相同作用域中标识符只能说 明一次、case语句的标号不能相同等。
第4章 语义分析和中间代码生成
例如,简单算术表达式求值的属性文法如下:
产生式
语义规则
(1) S→E (2) E→E(1)+T
print (E.val) E.val=E(1).val+T.val
(3) E→T (4) T→T(1)*F (5) T→T(1)
E.val=T.val T.val=T(1).val*F.val T.val=T(1).val

编译过程的六个阶段

编译过程的六个阶段

编译过程的六个阶段
编译过程是将高级语言转换成可执行代码的过程,它包括以下六个阶段:
1. 词法分析(Lexical analysis):将源程序中的字符流转换成
有意义的单词序列,即词法单元(token),并生成词法单元的符号表。

2. 语法分析(Syntax analysis):将词法单元序列转换成抽象语法树(AST)或语法分析树,并进行语法检查。

如果源程序有语法错误,会在此阶段报错。

3. 语义分析(Semantic analysis):对语法分析树进行语义检查,包括类型检查、符号解析、作用域分析等,并生成中间代码。

4. 中间代码生成(Intermediate code generation):将语义分
析阶段生成的抽象语法树或三元组转换成中间代码。

5. 代码优化(Code optimization):对生成的中间代码进行优化,以提高程序的执行效率。

6. 目标代码生成(Target code generation):将中间代码转换
成目标机器代码,包括汇编代码和机器代码,并生成目标程序。

以上六个阶段分别完成不同的任务,是编译过程中必不可少的环节。

- 1 -。

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

Байду номын сангаас
其它语义检查: 1) V[E]中的V是不是变量,而且是数组类型? 2) V.i中的V是不是变量,而且是记录类型?i是不 是该记录的域名? 3) x+f(…)中的f是不是函数名?形参个数和实参个 数是否一致? 4) 每个使用性标识符是否都有声明?有无标识符 的重复声明?
在语义分析同时产生中间代码,在这种模式下, 语义分析的主要功能如下: 语义审查 在扫描声明部分时构造标识符的符号表 在扫描语句部分时产生中间代码
程序设计语言中的表示 a+b a+b*c (a+b)*c 逆波兰表示 ab+ abc * + ab+c *
后缀式的计算机处理 后缀式的最大优点是易于计算机处理 处理过程: 从左到右扫描后缀式,每碰到运算对象就推进栈; 碰到运算符就从栈顶弹出相应目数的运算对象施加 运算,并把结果推进栈。最后的结果留在栈顶。
语义分析、中间代码与符号表
学习目标: 掌握: 常见语法成分的中间代码形式; 符号表的组织管理 理解: 语义分析的内容
源程序 词法分析 语法分析
表 格 管 理
语义分析 中间代码生成 代码优化 目标代码生成 目标程序
出 错 处 理
语义分析基础
语义分析的内容 主要是类型相容检查,有以下几种: 1) 各种条件表达式的类型是不是boolean型? 2) 运算符的分量类型是否相容? 3) 赋值语句的左右部的类型是否相容? 4) 形参和实参的类型是否相容? 5) 下标表达式的类型是否为所允许的类型? 6) 函数说明中的函数类型和返回值的类型是否一 致?
其中t i(i=1,2,3)是编译程序引入的临时变量
四元式的优点: 四元式比三元式更便于优化。 优化要求改变运算顺序或删除某些运算,引起编号 的变化。 三元式通过编号引用中间结果,编号的变化引起麻 烦;四元式通过临时变量引用中间结果,编号变化 无影响。 四元式对生成目标代码有利。 四元式表示很类似于三地址指令,很容易转换成机 器代码。
(2) (* ,
b,
b,
c
d
)
)
三元式的某些运算对象是另一 个三元式的编号(代表其结果)
一目算符只需选用一个运算对 象(ARG1) 多目算符可用连续几个三元式 表示
(3) (+ ,
(4) (:=,
(1),
(3),
(2)
a
)
)
树形表示 二目运算对应二叉子树,多目运算对应多叉子 树,但通常通过引入新结点表示成二叉子树。 例如:a:=b*c+b*d 表示成 := a * b c + * b d
2. 符号表的设计 如何有效记录各类符号的属性,以便在编译的各 个阶段对符号表进行快速、有效的查找、插入、 修改、删除等操作,是符号表设计的基本目标。 符号表的组成 表项分两部分,其中前者是标识符的名字(或在 名表中的地址),而后者是属性部分(不同种类 的标识符属性不同)。 符号表的组织方式和查找方法 符号表的组织方式可以是数组也可以是链表等等, 查找算法可以是顺序查表法、平分查表法、散列 查表法等 合理的组织和查找,将使得符号表的操作更高效
符号表
1. 符号表及其作用 符号表(Symbol Table) 符号表是存放标识符信息的一种表,其中的信息 表示的是标识符的属性(语义)。 符号表的作用 符号表是连接声明与引用的桥梁。一个名字在声 明时,相关信息被填写进符号表,而在引用时, 根据符号表中的信息生成相应的可执行语句。它 的作用主要有: 辅助语义的正确性检查 辅助代码生成
例:表达式-b+c*d的后缀式 b@cd*+的计值过程
d
c b t1 t1
t2 t1 t3
t 1= - b
t2= c*d
t3= t1+t2
8.3.2 三元式和树形表示
三元式 ( 算符 op,第一个运算对象 ARG1, 第二个运算对象 ARG2) 例: a :=b*c+b*d表示为 说明:
(1) (* ,
变量相对本过程 基地址的偏移量
VAR G
NAME:A NAME:B NAME:C NAME:D NAME:E NAME:P
TABLE表中的信息
Kind :CONSTANT Kind :CONSTANT Kind :VARIBALE Kind :VARIBALE Kind :VARIBALE Kind :PROCEDUR VAL:35 VAL:49 LEVEL:LEV LEVEL:LEV LEVEL:LEV LEVEL:LEV
3. 符号的主要属性 名字 类型 存储类别 (静态、regist,公共、内部。。) 作用域及可视性 存储分配信息
两类存储区

静态:生命周期是整个程序的运行过程 动态:适应局部变量的生存和消亡,提高程序运行的空间效率
具体位置
过程的说明部分: CONST A=35,B=49; VAR C,D,E; PROCEDURE P;
5.
分程序结构的符号表 对于具有分程序型结构的语言程序,不同层次分程序中 定义的标识符号具有不同的作用域和不同的可视性规则。 各分程序独立组织(分表结构):每当编译程序扫描到 一个分程序结构开始时,为该分程序建立一张符号表, 在该分程序中定义的标识符,都被登录在该符号表中。 而当编译程序扫描到一个分程序的结束时,编译程序释 放为该分程序所建立的符号表。 统一组织(单表结构):所有分程序中定义的标识符都 集中在单张符号表中。为了实现分程序构造中标识符的 作用域和可视性规则的要求,在符号表中可设立一个属性 域用来登录符号所在分程序的层次。进入分程序时,层 次要增加一层.在退出一个分程序时,层次降低一层,且 需要把符号表中,所有在退出的分程序中登录的符号项 清除。
8.3 中间代码的形式
定义: 中间代码是一种复杂性介于源程序语言和机器 语言之间的一种表示形式。 使用中间代码的好处: 中间代码与具体机器无关 对中间代码进行与机器无关的优化 形式: 逆波兰记号、三元式、四元式和树形表示
8.3.1 逆波兰记号
逆波兰表示法 将运算对象写在前面,把运算符写在后面, 因而也称后缀式。 例如:
8.3.3 四元式
四元式表示 四元式是一种比较普遍采用的中间代码形式 (算符op,ARG1,ARG2,运算结果RESULT) 例如:a:=b*c+b*d的四元式表示如下:
1) (*,
2) (*, 3) (+,
b,
b, t 1,
c,
d, t2, -,
t1 )
t2 ) t3 ) a)
4) (:=, t3 ,
ADR: DX ADR: DX+1 ADR: DX+2 ADR:
SIZE:4
NAME:G Kind :VARIBALE … …
LEVEL:LEV+1 …
ADR: DX …
4. 符号表的总体组织 第一种:按属性完全相同的组织多张表,空间 效率高,但管理复杂 第二种:所有符号一张表,管理集中单一,但 空间臃肿 第三种:折衷方式是根据符号属性相似程度分 类组织成若干张表,每张表中记录的符号都有 比较多的相同属性。
相关文档
最新文档