编译原理 符号表3
编译原理:第八章 符号表
合肥工业大学 计算机与信息学院软件所
表 0.1 符号名表 SNT NAME INFORMATION M 形式参数,整 型,值参数 N 形式参数,整 型,值参数 K 整型,变量
表 0.2 常数表 CT 值 (VALUE) (1) 1 (2) 4
表 0.3 入口名表 ENT NAME INFORMATION (1) INCWAP 二目子程序, 入口四元式:1
ax→
数组下限 数组上限 数组元素的体积 数组本身的体积 当元素为数组时,它指向 数组元素类型 数组的下标类型 该元素数组信息在atab表 中的位置,其他情况为0
合肥工业大学 计算机与信息学院软件所
type a=array[1..10, 1..10] of integer;
name kind typ ref
合肥工业大学 计算机与信息学院软件所
PL 语言编译程序的符号表
1. 表格的定义 名字表(nametab) 程序体表(btab) 层次显示表(display) 数组信息表(atab) 中间代码表(code)
合肥工业大学 计算机与信息学院软件所
1) 名字表(nametab) 名字表nametab:登记程序中出现的各种名 字及其属性
lastpar last psize vsize 0 1
bx→
指向本程序体中最后一个形式参在 本程序体所有局部数据所 指向本程序体中最后一个名字在 本程序体所有形参所需体积、包 nametab 中的位置 需空间大小 nametab 中的位置 括连接数据所占空间
编译原理课程设计符号表
编译原理课程设计符号表一、教学目标本节课的教学目标是使学生掌握编译原理中的符号表概念及其在编译过程中的作用。
通过本节课的学习,学生应能理解符号表的定义、功能和基本操作,掌握如何使用符号表进行变量、函数等标识符的管理。
1.了解符号表的概念及其在编译过程中的作用。
2.掌握符号表的基本操作,包括插入、查找和删除。
3.理解符号表在程序语言中的重要性。
4.能够使用符号表管理程序中的标识符。
5.能够分析程序中的标识符使用情况,并生成相应的符号表。
情感态度价值观目标:1.培养学生对编译原理的兴趣,提高学生对编程语言的理解。
2.培养学生团队协作、自主探究的学习态度。
二、教学内容本节课的教学内容主要包括符号表的定义、功能、基本操作及其在编译过程中的应用。
具体包括以下几个部分:1.符号表的定义与功能:介绍符号表的概念,解释其在编译过程中的作用,如变量、函数的管理等。
2.符号表的基本操作:讲解符号表的插入、查找和删除等基本操作,并通过实例进行演示。
3.符号表在程序语言中的应用:分析符号表在编程语言中的重要性,举例说明其应用场景。
三、教学方法为了提高学生的学习兴趣和主动性,本节课将采用多种教学方法相结合的方式进行教学,包括讲授法、讨论法、案例分析法和实验法等。
1.讲授法:用于讲解符号表的基本概念、原理和操作。
2.讨论法:学生针对符号表的应用场景进行讨论,促进学生思考。
3.案例分析法:通过分析具体编程语言中的符号表实例,使学生更好地理解符号表的作用。
4.实验法:安排学生在实验环节实际操作符号表,巩固所学知识。
四、教学资源本节课所需的教学资源包括教材、参考书、多媒体资料和实验设备等。
具体如下:1.教材:选用《编译原理》教材,为学生提供理论知识的学习。
2.参考书:推荐学生阅读《编译原理教程》等参考书,丰富学生的知识体系。
3.多媒体资料:制作PPT、动画等多媒体资料,帮助学生形象地理解符号表的概念和操作。
4.实验设备:提供计算机等实验设备,让学生在实验环节实际操作符号表。
编译原理
代码优化器
temp1 = id3 * 60.0 id1 = id2 + temp1
衡量目标程序质量 高低主要标准: 1. 空间指标; 2. 时间指标。
第一章 编译器概述
27
代码生成(target code generator)
符号表 temp1 = id3 * 60.0 id1 = id2 + temp1 1 2 代码生成器 3 position initial rate ... ... ...
第一章 编译器概述
10
由于计算机硬件只懂得自己的指令系 统,因此对于高级程序设计语言编写的程 序无法直接识别。 为解决这个问题,我们需要对所编写 的程序进行改进,改进的方法有两种:翻
译和解释。
第一章 编译器概述
11
翻译:把一种语言编写的程序(源程序)通
过一个翻译器翻译成为与之等价的另一种语言的 程序(目标程序)。
第一章 编译器概述
表达式
数 (60)
22
语法分析(parsing / syntax analysis, hierarchical analysis) id1 = id2 + id3 * 60 1 语法分析器 2 3 := id1 id2 id3
第一章 编译器概述
符号表 position initial rate ... ... ...
第一章 编译器概述
21
语法分析(parsing / syntax analysis, hierarchical analysis) 任何一个标识符都是表 initial + rate * 60 达式; 表达式 任何一个数都是表达 式; 表达式 + 如 果 e1 和 e2 都 是 表 达 表达式 式,那么 表达式 标识符 e1 + e2 * (initial) e1 * e2 标识符 (e1) (rate) 也都是表达式
编译原理符号表的作用
编译原理符号表的作用介绍编译原理中的符号表是一个重要的数据结构,用于存储程序中的标识符及其相关信息。
标识符可以是变量、常量、函数名等,在编译过程中需要进行词法和语义分析,符号表提供了一个地方来管理这些标识符,并为编译器的其他模块提供必要的信息。
作用符号表在编译过程中起着关键作用,它具有以下几个主要作用。
1. 标识符的声明符号表记录了程序中所有标识符的声明情况,包括标识符的类型、作用域等信息。
对于变量,符号表可以记录其数据类型和内存地址;对于函数,符号表可以记录其参数列表、返回值类型等。
编译器可以通过符号表查找标识符的声明信息,并根据需要进行语义检查和代码优化。
2. 标识符的引用和解析编译过程中,标识符可能会被多次引用,符号表用于解析标识符的引用。
编译器可以根据符号表中的信息确定标识符的类型、作用域等,从而进行语义检查和类型推导。
如果编译器在符号表中找不到对应的标识符,就会报错或警告,提示可能存在的错误。
3. 作用域管理符号表还可以用于管理标识符的作用域。
在程序中,不同的代码块可能定义了相同名称的标识符,符号表可以通过作用域信息来区分这些标识符。
当编译器遇到一个标识符时,它可以在符号表中查找该标识符的作用域,并根据作用域规则来解析标识符的含义。
4. 错误检测和提示符号表还可以用于错误检测和提示。
编译器可以通过符号表判断标识符是否已经定义或声明,以及是否满足相应的语义规则。
如果标识符在符号表中已经存在多个定义,编译器可以发现这种错误,并给出相应的错误提示信息。
符号表的组织结构为了高效地实现符号表的作用,通常采用哈希表或树形结构来组织符号表。
下面是一些常见的符号表组织结构。
1. 线性表符号表可以使用线性表结构进行组织,例如数组、链表等。
线性表结构简单直观,适用于较小规模的符号表。
但对于大规模的符号表,线性表的查找效率较低。
2. 哈希表哈希表是一种基于键值对存储的数据结构,可以快速地查找和插入数据。
符号表中的标识符可以作为哈希表的键,对应的信息可以作为值进行存储。
编译原理符号表
编译原理符号表符号表是编译器中一个非常重要的数据结构,用于存储程序中的标识符(如变量、函数名等)和对应的属性信息(如数据类型、作用域等)。
在编译器的各个阶段,都需要使用符号表来进行词法分析、语法分析、语义分析等操作,因此符号表设计的好坏直接影响到编译器的质量和效率。
一般来讲,符号表可以被看作是一个以标识符为键、以属性信息为值的映射表。
在编译器的词法分析阶段,源代码中的每个标识符都会被扫描并加入符号表中,同时为每个标识符生成一个唯一的“id”(也称为“符号表条目”)作为在后续处理中访问符号表的索引。
在编译器的语法分析和语义分析阶段,编译器会利用符号表进行语法分析和语义检查。
例如,在语法分析阶段,编译器需要判断变量是否被正确声明和使用,因此需要在符号表中查找变量的属性信息;而在语义分析阶段,编译器需要对表达式进行类型检查或者函数调用进行参数匹配,因此也需要在符号表中查找相关的属性信息。
需要注意的是,符号表的实现需要考虑到标识符的作用域、重复定义、名称空间等问题。
一般来说,编译器需要支持不同作用域之间的变量共存和访问,因此需要为不同的作用域维护不同的符号表。
当在一个新作用域中遇到相同的标识符时,编译器应该创建新的符号表条目;而在同一作用域中出现重复定义时,编译器应该抛出错误信息。
同样需要注意的是,符号表的实现也需要考虑到数据结构的效率和空间占用。
一些常用的实现方式包括基于哈希表的实现、基于树的实现(如平衡树、二叉查找树等)等。
在编译器优化阶段,符号表的实现也会影响编译器生成的目标代码的质量和效率。
例如,在常量表达式优化中,编译器使用符号表来维护常量的值和类型信息,从而可以直接进行常量表达式的求值,而不必在运行时才计算。
总的来说,在编译器中,符号表是一个极其重要的数据结构,对于编译器的性能和代码质量有着重要的影响。
因此,在设计和实现编译器时,需要认真考虑符号表的性能和可扩展性,并且根据具体的编程语言特性进行相应的优化。
编译原理之符号表
单表结构的组织管理
• 其基本思想是,所有分程序中定义的标识符都 集中在单张符号表中。为了实现分程序构造中 标识符的作用域和可视性规则的要求,在符号表 中可设立一个属性域用来登录符号所在分程序 的层次
• 进入分程序时,层次要增加一层.在退出一个分 程序时,层次降低一层,且需要把符号表中, 所有在退出的分程序中登录的符号项清除。
折中方式组织的符号表
2020/12/4
9.3.2 符号表项的排列
• 符号表作为一个多元组,表中元组的排列组织是构 造符号表的重要成分。
• 在编译程序的整个工作过程中,符号表被频繁地用 来建立表项,查找表项,填充和引用表项的属性。
• 因此表项的排列组织对该系统运行的效率起着十分 重要的作用。
• 在编译程序中,符号表项的组织传统上采用三种构 造方法。即线性法,二分法及散列法。
{ ... float i; ..........(3) ... { ... .............(4) int i[5]; ..........(5) ... { ... ................(6) int i; .....(7) ... } ...i .....................(8) } ...i .......................(9)
931符号表的总体组织第一类符号属性1属性2属性3第二类符号属性1属性2属性4第三类符号属性2属性5属性6符号属性值1属性值2属性值3第一类符号之符号表符号属性值1属性值2属性值4第二类符号之符号表符号属性值2属性值5属性值6第三类符号之符号表按属性分类组织的符号表符号属性值1属性值2属性值3属性值4属性值5属性值6单一组织的符号表符号属性值1属性值2属性值3属性值4符号属性值2属性值5属性值6第一二类符号之符号表第三类符号之符号表折中方式组织的符号表符号表作为一个多元组表中元组的排列组织是构造符号表的重要成分
编译原理符号表的原理及典型实例
05
符号表的设计与实现
符号表的数据结构设计
符号表的数据结构应满足高效、 易扩展和易维护的要求,通常 采用哈希表、二叉树等数据结
构实现。
符号表应包含符号名称、符 号类型、符号属性等信息, 以便在编译过程中快速查找
和识别符号。
符号表还应支持动态添加、删 除和修改等操作,以适应源代
码中符号的变化。
符号表的实现算法
常量名的符号表实例
总结词
常量名符号表实例展示了如何使用符号表来管理程序中的常量。
详细描述
常量名符号表记录了常量的名称、类型和值等信息。通过符号表,编译器能够方 便地查找常量的定义和使用,并进行相应的语义分析和代码生成。在处理常量时 ,符号表有助于编译器优化程序的性能,例如常量折叠和常量传播等。
04
编译原理符号表的原 理及典型实例
目录
• 编译原理符号表概述 • 符号表的原理 • 符号表的典型实例 • 符号表在编译过程中的应用 • 符号表的设计与实现
01
编译原理符号表概述
符号表的概念
符号表是一种用于存储程序中标识符 信息的数据结构,主要用于编译过程 中对标识符进行跟踪和管理。
符号表中的每个条目都包含有关标识 符的信息,如名称、类型、作用域等。
如果符号表中存在该标识符的信息,编译器就可以 使用这些信息来生成相应的代码。
符号表的更新
01
在编译过程中,符号表可能会被更新以反映源代码的变化。
02
当源代码中添加、删除或修改标识符时,符号表中的相关信息
也需要相应地更新。
更新符号表的过程通常涉及到在哈希表中插入、删除或修改相
03
应的条目。
03
符号表的典型实例
典型实例
编译原理符号表
编译原理符号表1. 引言编译原理是计算机科学领域中一个重要的研究方向,它研究的是将高级语言程序转化为机器语言的过程。
在编译器中,符号表是一种常用的数据结构,用于存储程序中的各种符号及其相关信息。
本文将深入探讨编译原理符号表的概念、作用、设计方法以及常见的符号表实现方式。
2. 符号表的概念和作用2.1 符号表的定义符号表是编译器中用于存储程序中各种符号信息的数据结构。
它一般由编译器自动生成和维护,用于支持语法分析、语义分析和代码生成等编译过程。
2.2 符号表的作用符号表在编译器的各个阶段都发挥着重要的作用:•语法分析阶段:符号表用于识别和存储各种变量、函数和类型的声明信息,以支持后续的语义分析过程。
•语义分析阶段:符号表用于检查变量和函数的引用是否合法,并记录其类型信息和作用域等属性,以支持类型检查和语义约束的验证。
•代码生成阶段:符号表用于存储中间代码和目标代码中的符号引用和符号定义的映射关系,以支持代码生成和目标代码优化等过程。
3. 符号表的设计方法3.1 符号表的数据结构符号表的数据结构通常由符号表项组成,每个符号表项用于存储一个符号及其相关信息。
常见的符号表项包括符号名称、符号类型、作用域、内存地址等。
3.2 符号表的组织方式符号表的组织方式可以有多种选择,常见的包括线性表、哈希表、树和图等。
选择合适的组织方式可以提高符号表的查询效率和插入删除的性能。
3.3 符号表的查询算法符号表的查询算法是指根据给定的符号名称,在符号表中进行查找并返回对应的符号表项。
常见的查询算法有线性搜索、二分搜索和哈希搜索等,选择合适的查询算法可以提高符号表的查询效率。
4. 常见的符号表实现方式4.1 线性表实现线性表实现是符号表最简单的一种实现方式,它可以使用数组或链表来存储符号表项。
线性表实现的优点是简单易懂,缺点是查询效率较低,随着符号表规模的增大,性能下降明显。
4.2 哈希表实现哈希表实现是一种常用的符号表实现方式,它通过哈希函数将符号名称映射到符号表项存储的位置。
编译原理符号表
确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。
要考虑能够存储有关名字的信息,并可以高效地完成如下操作:1.查找:根据给定的名字,在符号表中查找其信息。
如果该名字在符号表中不测试范例:procedure test; var b,c,i:integer;begin b:=1; if a>b thenc:=a+b elsec:=a-b;for i:=0 to 3dobeginc:=i;end;end;符号表的结构#include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h>struct{ int m;char name[20]; char inf[20];}co[999]; int num;include 称为文件包含命令,其意义是把尖括号""或引号<>内指定的文件包含到本程序中,成为本程序的一部分。
被包含的文件通常是由系统提供的,其扩展名为.h 而stdio为standard input output的缩写,意为“标准输入输出” .。
#include<string,h>这是C语言/C++中的字符串处理函数的头文件。
#include <ctype.h>是用作字符处理的,#include <stdlib.h>是用于定义杂项函数及内存分配函数,最后是一个结构函数,分别定义了符号名,信息,个数等变量。
符号显示在C-Free中用了void display(),将已经输入进系统的符号全部都显示出来 3. 符号查找本符号表系统中用void find() ,并通过for循环将所要查找的符号及其信息全都显示出来。
如果查找的字符存在,则在显示之前,运用system(“cls”)进行了清屏,把之前屏幕上所显示的内容全部清除,同时,在显示完成以后,又用了if 语句判断是否要删除此符号及其信息。
编译原理 符号表3
…
} // 第四层尾
…a… // 引用的是哪个a?
} // 第三层尾 所以,在符号表属性中需要
} // 第二层尾 } // 第一层尾
记录表示该符号在程序结构
16
上被定义的层次。 广东工业大学计算机学院
LOGO
⑤ 符号变量的存储分配信息
可以根据以下因素来确定每一个变量应分配到哪一个存储 区(静态或动态存储区),以及在该区中的具体位置:
② 符号的类型
标识符中除过程标识符之外,函数和变量标识符都具 有数据类型(data type)属性。对于函数的数据类 型指的是该函数值的数据类型。基本数据类型有整型、 实型、字符型、逻辑型(布尔型)及位组型等,符号 的类型属性是在该符号的定义时得到。变量符号的类 型属性决定了该变量的数据在存储空间的存储格式, 还决定了在该变量上可以施加的运算操作。
13
LOGO 广东工业大学计算机学院
④ 符号的作用域及可视性
一个变量的作用域即该变量可以出现的场合,也就是说在 某个变量作用域范围内该变量是可引用的,这就是变量可 视性的作用域规则。
但是变量可视性不仅仅取决于它的作用域,还有两种情况 影响到一个变量的可视性。
⑴ 函数的形式参数:影响变量可视性的举例
int a;
// 外部定义的整型变量a
int func(a, b)
float a; // 函数内部定义的局部整型变量a,
int b;
{…
在函数func中可看
b = b + a; // 引用的是哪一个a? 到的是float a,
…
14
}
看不到int a。
LOGO 广东工业大学计算机学院
函数的形式参数(续)
编译原理第八章 符号表
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)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希
难
表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识
编译原理08符号表
对这种顺序化的表格可采用对折法查找
15
对一遍扫描的编译程序来说,对折法用处不大。 对一遍扫描的编译程序来说,对折法用处不大。因 符号表是边填边引用的, 为,符号表是边填边引用的,每填进一个新项都得 顺序化符号表, 顺序化符号表,极费时间 可采用二叉树来组织符号表,令每项为一结点, 可采用二叉树来组织符号表,令每项为一结点,每 个结点附设两个指示器栏,一栏为LEFT,另一栏 个结点附设两个指示器栏,一栏为 , 为RIGHT,主栏内码值作为该结点的值 , 任何结点p右枝的所有结点值均小于 的值, 右枝的所有结点值均小于p的值 任何结点 右枝的所有结点值均小于 的值,而左枝 的任何结点值均大于p的值 的任何结点值均大于 的值
14
NAME J1 XYZ I BC
INFORMATION … … … …
3.2 对折查找与二叉树
为提高查表速度,在造表同时把表格中的项按名字的“大小” 为提高查表速度,在造表同时把表格中的项按名字的“大小” 顺序整理排列 名字的“大小”指名字的内码二进制,如规定值小者在前, 名字的“大小”指名字的内码二进制,如规定值小者在前, 值大者在后
11
四元式表QT 四元式表 OPR (1) ) LINK INCWAP INCWAP M N K INCWAP INCWAP 1 2 1 2 1 4 M N K M N M N (2) actpar ) (3) actpar ) (4) ) (5) ) (6) ) + + := AGR1 AGR2 RESULT //保护返回地址及有关寄存器 保护返回地址及有关寄存器 //把第一个实参值传给 把第一个实参值传给M 把第一个实参值传给 //把第二个实参值传给 把第二个实参值传给N 把第二个实参值传给 //K:=M+1 //M:=N+4 //N:=K //把M的值回送给第一个实参 把 的值回送给第一个实参 //把N的值回送给第二个实参 把 的值回送给第二个实参 //恢复寄存器,控制返回调用段 恢复寄存器, 恢复寄存器
编译原理符号表的作用
编译原理符号表的作用一、引言编译器是将高级语言翻译成机器语言的程序,其主要功能是将源代码转换为可执行的目标代码。
在编译过程中,符号表是一个非常重要的数据结构,用于存储程序中出现的各种符号信息。
本文将介绍符号表的作用及其实现原理。
二、符号表的定义符号表是编译器中用于存储程序中出现的各种符号信息的数据结构,包括变量名、函数名、类型名等标识符及其属性信息。
它通常由一个哈希表和多个链表组成。
三、符号表的作用1. 语法分析阶段:在语法分析阶段,编译器会扫描源代码并生成相应的语法树。
同时,在扫描过程中,编译器会将每个标识符添加到符号表中,并记录其类型、作用域等属性信息。
这些信息可以在后续阶段中被使用。
2. 语义分析阶段:在语义分析阶段,编译器会对程序进行类型检查、作用域检查等操作。
这些操作需要使用到之前保存在符号表中的属性信息。
3. 代码生成阶段:在代码生成阶段,编译器会将源代码转换为目标代码。
在此过程中,编译器需要根据符号表中的信息生成目标代码中的符号表。
四、符号表的实现1. 哈希表:符号表通常由一个哈希表和多个链表组成。
哈希表用于快速查找标识符,并将其插入到相应的链表中。
2. 链表:每个链表对应一个作用域,用于存储该作用域中出现的所有标识符及其属性信息。
当进入一个新的作用域时,编译器会创建一个新的链表,并将其添加到符号表中。
当离开该作用域时,编译器会删除该链表。
3. 属性信息:在符号表中,每个标识符都有相应的属性信息,包括类型、作用域、地址等。
这些信息可以在后续阶段中被使用。
五、总结在编译过程中,符号表是一个非常重要的数据结构。
它可以存储程序中出现的各种标识符及其属性信息,并在后续阶段中被使用。
符号表通常由一个哈希表和多个链表组成,其中哈希表用于快速查找标识符,链表用于存储每个作用域中出现的所有标识符及其属性信息。
通过对符号表的实现和使用,编译器可以更加准确地将源代码转换为目标代码。
编译原理第三章语法分析
递归下降程序:
void F() { if(lookahead= =’i’) match(‘i’); else if(lookahead= =’(’) { match(‘(’); E(); if(lookahead= =’)’) match(‘)’); else error(); } else error(); }
输入串
id+id*id;# id+id*id;# id+id*id;# id+id*id;# id+id*id;# +id*id;# +id*id;#
动作
pop(L),push(E;L) pop(E),push(TE’) pop(T),push(FT’) pop(F),push(id) pop(id),next(ip) pop(T’)
形式语言分类
定义:若文法G=(N,T,P,S)的每个产生式α→β中,均有 α∈(N∪T)*N(N∪T)*,且至少含有一个非终结符, β∈(N∪T)*,则称G为0型文法(短语文法)。 ①1型文法(上下文有关文法):G的任何产生式α→β(S→ε 除外)均满足|α|≤| β| (|x|表示x中文法符号的个数); ②2型文法(上下文无关文法):G的任何产生式形如A→β, 其中A∈N,β∈(N∪T)*; ③3型文法(正规文法、线性文法):G的任何产生式形如A→a 或者A→aB(或者A→Ba),其中A,B∈N,a∈T*。
定义:将产生式A→γ的右部代替文法符号序列αAβ 中的A得到αγβ的过程,称为αAβ直接推导 出αγβ,记作:αAβαγβ。
编译原理符号表和词法分析
扫描源程序
识别单词
转换成属性字
六、词法分析(续一)
词法分析的两种处理结构
字符
单词
源程序
词法分析
L1程序
源程序
字符
符号表
单词
词法分析
语法分析
回送单词
符号表
七、取单词
1、单词的种类
单词由字符组成。 <字符>::=<字母>|<数字>|<特定符号>|<无效字符> <字母>::=a|b|c|..z|A| B|C|...|Z <数字>::=0|1|2|3|...|9 <特定符号>::=+|-|*|/|:=|<>|<|…. <无效字符>::=<回车符>|<换行符>|<制表符> symbol=(ident,constsy,notop,mul,div,add,sub….) 单词的机内表示采用长度统一的二元形式(token字) (单词种别码,单词的自身值)
七、取单词 流程图
开始
跳过空格符和回车符
N 字母
Y 读标识符
数字 N Y
查保留字表
取数
查到 N
Y identsy
保留字sy
constsysy
特殊符号 N Y
特殊符号sy
error
结束
八、读标识符
1、标识符的文法规则 <标识符>::=<字母>{<字母>| <数字> } <字母>::=a|b|c|..z|A| B|C|...|Z <数字>::=0|1|2|3|...|9
编译原理样题3(有答案
编译原理样题一选择题[]1. 型文法也称为正规文法。
[A] O [B] 1 [C] 2 [D] 3[]2. 文法不是LL(I)的。
[A]递归 [B]右递归 [C] 2型 [D]含有公共左因子的【]3.文法E-E+E∣E*E∣i的句子i*i+i*i的不同语法分析树的总数为。
[A]l [B]3 [C]5 [D]7[]4.四元式之间的联系是通过实现。
[A]临时变量 [B]指示器 [C]符号表[D]程序变量[1 5.同心集合并可能会产生的新冲突为 O[A]二义[B]移进/移进[C]移进/归约[D]归约/归约[]6.代码优化时所依据的是 o[A]语法规则[B]词法规则 [C]等价变换规则 [D]语义规则1]7.表达式a-(-b) *c的逆波兰表示为 o[A]a-b@c* [B]abθc*- [C]ab0- [D]ab0c-* (注:©为单目减运算符)[]8.过程的D:ISPLAY表记录了。
[A]过程的连接数据[B]过程的嵌套层次[C]过程的返回地址[D]过程的入口地址二填空题1.编译过程的六个阶段为:词法分析、、语义分析、代码优化和目标代码生成。
2.词法分析阶段的任务式从左到右扫描,从而逐个识别 o3.对于文法Gl和G2,若有,则称文法Gl和G2是等价的。
4.对于文法 G[E] : E→T∣E+T T→F∣T*F F→P^F∣ P PT(E)I i,句型 T+T*F+i 的句柄是,最左素短语是 O所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语。
所谓最左素短语是指处于句型最左边的那个素短语。
如,P*P和i是句型P*P+i的素短语,而P*P 是它的最左素短语。
5.最右推导的逆过程称为,也称为。
6.规范规约中的可规约串是,算符优先分析中的可规约串是 o7. (AV B) A (CV -I DA E)的逆波兰式是 o8.在属性文法中文法符号的两种属性分别称为和 O9.符号表的每•项是由名字栏和两个栏目组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
每个函数或过程的形参个数、形参的排列次序及每个 形参的类型,都体现了调用该函数或过程时的属性, 它们都应该反映在符号表的函数或过程标识符的项中。
18
LOGO 广东工业大学计算机学院
本课内容
9.1 符号表的作用和地位 9.2 符号的主要属性及作用 9.3 符号表的组织 9.4 符号表的管理
15
LOGO 广东工业大学计算机学院
影响变量可视性的规则举例2
⑵ 分程序(或复合语句)结构: 影响变量可视 性的举例
…
{int a; // 第一层开头,定义局部整型变量a
…
{char a; // 第二层开头,定义局部字符型变量a
…
{ // 第三层开头
第二层的char a
… {float a; // 第四层头,定义局部实型变量a
13
LOGO 广东工业大学计算机学院
④ 符号的作用域及可视性
一个变量的作用域即该变量可以出现的场合,也就是说在 某个变量作用域范围内该变量是可引用的,这就是变量可 视性的作用域规则。
但是变量可视性不仅仅取决于它的作用域,还有两种情况 影响到一个变量的可视性。
⑴ 函数的形式参数:影响变量可视性的举例
LOGO 广东工业大学计算机学院
2. 符号表项的排列——线性组织
在编译程序中,符号表项的组织传统上采用三种构造方法: 线性法,二分法和散列法。
1. 线性组织
优点: 无空白项,存储空间效率高 缺点: 查找效率低下
这种方法规定符号表中表项按它的符号被扫描到的先后顺序 登录。例如有一程序中出现符号的情况如下:
② 符号的类型
标识符中除过程标识符之外,函数和变量标识符都具 有数据类型(data type)属性。对于函数的数据类 型指的是该函数值的数据类型。基本数据类型有整型、 实型、字符型、逻辑型(布尔型)及位组型等,符号 的类型属性是在该符号的定义时得到。变量符号的类 型属性决定了该变量的数据在存储空间的存储格式, 还决定了在该变量上可以施加的运算操作。
6
LOGO 广东工业大学计算机学院
2. 作为上下文语义的合法性检查的依据
通过符号表中属性记录可进行相应上下文的语义检查。
例如:在一个C语言程序中出现 int i[3,5]; //定义整型数组i
… float i[4,2]; //定义实型数组i,重定义冲突
… int i[3,5]; //定义整型数组i,重定义冲突
符号表构造举例(续2)
假设一个语言程序发现有下列3类符号及其所需之属性:
第1类符号 属性1 属性2 属性3 第2类符号 属性1 属性2 属性4 第3类符号 属性2 属性5 属性6
第三种造表方式:据符号 属性相似程度分类造若干
个表。
缺点:仍然存在可能的 存储空间浪费,需设计者 根据经验和要求进行选 择和调整.
符号变量的存储类别定义
这些变量出现的位置和次序
在符号表中用相对区头的位移量表示。
例如有以下程序段(C语言) … int a;
标识 类型 位置属
符
性
…
… float b;
a int
0
b float 4
…
d int
0
struct cc{ int d; float e; …
e float 4
在C语言的最新文本中增加了一个语法记号∷,使得可 以在函数内部显式地引用外部的同名变量。
上例可改写如下:
int a = 2;
int func (a, b)
float a = -1;
int b = 1;
{ …
引用float a
b = b + a;
b = b + ∷a…
}
引用int a
则b = ?2
LOGO
第九章
符号表
广东工业大学计算机学院
1
引言
符号表作为编译系统的重要设施,贯穿于文法分析、检 查和语义处理的编译全过程。
在编译程序中符号表用来存放源程序中出现的有关名字 的属性信息,这些信息集中反映了名字的语义特征属性。
符号表总体结构的设计和实现下列因素有关: 源语言的复杂性(包括词法结构、语法结构的复杂性)
int a;
// 外部定义的整型变量a
int func(a, b)
float a; // 函数内部定义的局部整型变量a,
int b;
{…
在函数func中可看
b = b + a; // 引用的是哪一个a? 到的是float a,
…
14
}
看不到int a。
LOGO 广东工业大学计算机学院
函数的形式参数(续)
① 符号名
② 符号的类型
③ 符号的存储类别 ④ 符号的作用域及可视性
⑤ 符号变量的存储分配信息
⑥ 符号的其它属性:数组内情向量、记Hale Waihona Puke 结构型 的成员信息、函数及过程的形参
11
LOGO 广东工业大学计算机学院
① 符号名
符号表中设置一个符号名域,存放该标识符,该域通 常就是符号表的关键字域。(书P205)
符号表中所登记的信息在编译的不同阶段都要用 到。例如:在词法分析及语法分析过程中不断更 新表中的信息,
另外,在词法分析到代码生成的各阶段则会从表 中获取不同的属性信息。
符号表的功能主要归结为以下几个方面: ① 收集符号属性 ② 作为上下文语义的合法性检查的依据 ③ 作为目标代码生成阶段地址分配的依据
22
LOGO 广东工业大学计算机学院
符号表构造举例(续3)
第3类符号 属性2 属性5 属性6
下面单独考察“第一,二类符号之符号表”
第1类符号 属性1 属性2 属性3 第2类符号 属性1 属性2 属性4
对第1类符号来说,属性值4栏 是冗余的,而对于第2类符号, 则属性值3栏是冗余的。
把属性值3和属性值4合并成属 性值34。
19
LOGO 广东工业大学计算机学院
1. 符号表构造举例
假设一个语言程序发现有下列3类符号及其所需之属性:
第1类符号 属性1 属性2 属性3
第2类符号 属性1 属性2 属性4
第3类符号 属性2 属性5 属性6
第一种造表方式:构造 等长表项的多个表
注意:各属性不一定等长
20
LOGO 广东工业大学计算机学院
12
LOGO 广东工业大学计算机学院
③ 符号的存储类别
大多数语言对变量的存储类别定义采用两种方式:
(1) 用关键字指定。
例如在C语言中用static定义是属于文件的静态 存储变量或属于函数内部的静态存储变量。
(2) 根据变量声明在程序中的位置来决定。
例如在C语言中,在函数体外定义的变量是缺省是 程序的公共存储变量,而在函数体内定义的变量 是该函数所独有的私有存储变量。
在当该表项符号是属第1类时,
C语言中可用UNION来实现。这样 属性值34中收集的是属性值3
的组织结构会增加符号表管理和运 行的复杂性,但减少了空间开销。
的值;若是第2类符号时,属 性值34中收集的是属性值4的
23
值。
LOGO 广东工业大学计算机学院
各种造表方式的优缺点比较
造表方式 第一种:构造等 第二种: 构造一张 第三种:据符号属性相 长表项的多个表 包括所有属性的表 似程度分类造若干个表
………………… …a…………… //第1次出现a …………b…… //第1次出现b …a…………… //第2次出现a …………d…… //第1次出现d …c…………… //第1次出现c …………b…… //第2次出现b
……
h:表头,是表的开始位置;
25 p:符号表当前的结束位置。
LOGO 广东工业大学计算机学院
…… 首先要确定其被分配的区域。例如,在C语言中有公
c
共区、文件静态区、函数静态区、函数运行时的动态
区等。
b
a 其次是根据变量出现的次序。通常使用在该区域中相 …… 对于区头的相对位置来决定该变量在某个区中所处的
具体位置。
动态区头位置
8
LOGO 广东工业大学计算机学院
本课内容
9.1 符号表的作用和地位 9.2 符号的主要属性及作用 9.3 符号表的组织 9.4 符号表的管理
符号表项的排列——排序组织及二分法
2. 排序组织及二分法
优点: 查找效率高 缺点:造表过程需要耗费较大的
代价(表项的比较和移动)
符号表中的表项按其符号的字符代码串(可以看成
一个整数值)的值的大小从大到小(或从小到大)排
列。
26
LOGO 广东工业大学计算机学院
符号表项的排列——散列组织
散列组织(哈希表)具有 较高的运行效率,因而 绝大多数编译程序中的 符号表采用散列组织。
从本例还可以看出,无论在后面两句中i的其它属性
与前一句是否完全相同,只要标识符名重定义,就将
产生重定义冲突的语义错误。
7
LOGO 广东工业大学计算机学院
3. 作为目标代码生成阶段地址分 配的依据
每个符号变量在目标代码生成时需要确定其在存储分 配中的位置(主要是相对位置)。
要确定一个变量在目标代码生成时的地址,需要:
关键在于采用适当的哈 希函数以及冲突解决办 法。
27
LOGO 广东工业大学计算机学院
3. 关键字域的组织
符号表的关键字域就是符号本身,它可以是 语言的保留字,操作符号或标识符(包括变量 名,函数名,记录结构标志等)。
关键字域的组织有两种方式:
(1) 等长关键字域(段)符号表
(2) 不等长关键字段符号表---采用关键字池 的索引结构。