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)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希

表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识
  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. 符号表的总体组织 第一种:按属性完全相同的组织多张表,空间 效率高,但管理复杂 第二种:所有符号一张表,管理集中单一,但 空间臃肿 第三种:折衷方式是根据符号属性相似程度分 类组织成若干张表,每张表中记录的符号都有 比较多的相同属性。
相关文档
最新文档