第六章符号表组织
第六章 语义分析(1)
Function f(i:integer) Var j:integer; Begin …… End; Begin …… End; 层数为0 层数为1 k : (1, 0) m : (1,18) x : (0, 0) y : (0, 1)
($int, -) ($id, x) ($comma, -) ($id, y) ($semi,-)
($int, -) ($id, f) ($lparen, -) ($rparen,-) ($semi,-) xentry: yentry: (x,varkind,intptr,……) (y,varkind,intptr,……)
– 符号表的接口函数
知识关系图
语义分析
需要标识符的更 多信息
符号表
标识符的内部表示
标识符的属性
类型的内部表示
值的内部表示
标识符的内部表示
标识符的不同种类
– 常量标识符 – 类型标识符 – 变量标识符 – 函数/过程标识符
– 域名标识符
typedef enum {constKind, typeKind, varKind, routKind, fieldKind} idKid;
域名标识符的属性
TypePtr
Kind fieldKind
Offset
Ptr
TypePtr
– 指向域名类型的内部表示;
Kind
– 标识符的种类, 所有域名标识符的Kind =fieldKind;
Offset:
– 该域名针对所在结构类型的偏移量;
符号表
三、杂凑技术
1、假定有一个足够大的区域,这个区域用来填写一张含N项的符号 、假定有一个足够大的区域,这个区域用来填写一张含 项的符号 表。构造一个地址函数 ,对任何名字,H函数的取值于 至N-1之间 构造一个地址函数H,对任何名字, 函数的取值于0至 之间 地址函数 函数的取值于 即不论对此项查表或填表,都能从H函数中获得它在表中的位置 函数中获得它在表中的位置。 即不论对此项查表或填表,都能从 函数中获得它在表中的位置。 2、对地址函数H有两点要求: 、对地址函数 有两点要求: (1)函数的计算要简单、高效; )函数的计算要简单、高效; 2)函数值能比较均匀的分布在0至N-1之间 之间。 (2)函数值能比较均匀的分布在0至N-1之间。 3、构造函数H的办法: 直接地址法、数字分析法、平方取中法、 、构造函数 的办法 直接地址法、数字分析法、平方取中法、 的办法: 折叠法、除留余数法、 折叠法、除留余数法、随机地址法 、解决地址冲突的办法: 开放地址法、再哈希法、链地址法(p228)、 、 建立一个公共溢出区
二、对折查找与二叉树
在造表的同时把表格中的项按名字的“大小”顺序整理排列。 在造表的同时把表格中的项按名字的“大小”顺序整理排列。 名字的“ 指名字的内码二进制。 所谓名字的 大小”通常是指名字的内码二进制 所谓名字的“大小”通常是指名字的内码二进制。 对于经顺序化的表格的查找可用对折法 顺序化的表格的查找可用对折法。 对于经顺序化的表格的查找可用对折法。 对折法的查找方法如下: 对折法的查找方法如下: 查找方法如下 (1)首先把要查找的项和中项 ) (即第[n/2]+1项)作比较,若 即第 项 作比较, 相等,则宣布查找成功。 相等,则宣布查找成功。
特殊属性登记在别的地方, 而把某些特殊属性登记在别的地方 • 而把某些特殊属性登记在别的地方,并在信息栏中附设一指示 器,指向存放特殊属性的地方。 指向存放特殊属性的地方。 特殊属性的登记:例如: 特殊属性的登记:例如:对 于数组标识符 专门开辟一个信息表区,即为 专门开辟一个信息表区, 数组信息表也称为 也称为内情向量表 数组信息表也称为内情向量表 在符号表的地址栏中存入符号 表与内情向量表连接入口地址
第6章符号表的组织与
2021/4/9
23
本章小结
主要介绍:符号表的作用、内容和组织 方法,讨论对符号表的几种不同建立和 查找方法,主要有线性表,二分查找和 二叉树差查找以及散列法。
学习重点:学习查找方法时注意结合数 据结构知识,掌握查找方法的基本思想。
2021/4/9
24
感谢您的阅读收藏,谢谢!
2021/4/9
2021/4/9符自身
{ { 标识符
与标识符有 关的信息
类型:如实数、整型、布尔型 种属:如数组名、变量名等
作用域:如全局变量或
局部变量
2021/4/9
3
6.1.1符号表的组成
符号表的每一项通常由两部分组成
第一部分是名字栏,其内容为标识符名, 也称为主栏。一个标识符可以是变量名, 函数名,过程名等。由若干个非空格字 符串组成,且通常情况下在整个程序中 唯一。
P.left
P.val P.Right
2021/4/9
19
二分查找和二叉树
组成二叉树的原则: 左分支的任何结点值都大于结点P的值,
右分支的所有结点的值都小于结点P的值。 在随机情况下,平均查找长度为1+4log2 n 优点:减少了符号排序的时间,每查找一
项所需要比较的次数和log2 n成比例。
2021/4/9
2021/4/9
13
符号表的组织
设置符号表时注意事项: 考虑标识符在源程序中的不同作用域。作 用域不同,信息栏的内容也不同。
符号表中也能体现哪些标识符可以使用, 哪些标识符不能用。
2021/4/9
14
符号表的实现方法:
实现符号表的一种简洁而又实用的方法是 链式表结构。
2021/4/9
编译原理符号表的作用
编译原理符号表的作用介绍编译原理中的符号表是一个重要的数据结构,用于存储程序中的标识符及其相关信息。
标识符可以是变量、常量、函数名等,在编译过程中需要进行词法和语义分析,符号表提供了一个地方来管理这些标识符,并为编译器的其他模块提供必要的信息。
作用符号表在编译过程中起着关键作用,它具有以下几个主要作用。
1. 标识符的声明符号表记录了程序中所有标识符的声明情况,包括标识符的类型、作用域等信息。
对于变量,符号表可以记录其数据类型和内存地址;对于函数,符号表可以记录其参数列表、返回值类型等。
编译器可以通过符号表查找标识符的声明信息,并根据需要进行语义检查和代码优化。
2. 标识符的引用和解析编译过程中,标识符可能会被多次引用,符号表用于解析标识符的引用。
编译器可以根据符号表中的信息确定标识符的类型、作用域等,从而进行语义检查和类型推导。
如果编译器在符号表中找不到对应的标识符,就会报错或警告,提示可能存在的错误。
3. 作用域管理符号表还可以用于管理标识符的作用域。
在程序中,不同的代码块可能定义了相同名称的标识符,符号表可以通过作用域信息来区分这些标识符。
当编译器遇到一个标识符时,它可以在符号表中查找该标识符的作用域,并根据作用域规则来解析标识符的含义。
4. 错误检测和提示符号表还可以用于错误检测和提示。
编译器可以通过符号表判断标识符是否已经定义或声明,以及是否满足相应的语义规则。
如果标识符在符号表中已经存在多个定义,编译器可以发现这种错误,并给出相应的错误提示信息。
符号表的组织结构为了高效地实现符号表的作用,通常采用哈希表或树形结构来组织符号表。
下面是一些常见的符号表组织结构。
1. 线性表符号表可以使用线性表结构进行组织,例如数组、链表等。
线性表结构简单直观,适用于较小规模的符号表。
但对于大规模的符号表,线性表的查找效率较低。
2. 哈希表哈希表是一种基于键值对存储的数据结构,可以快速地查找和插入数据。
符号表中的标识符可以作为哈希表的键,对应的信息可以作为值进行存储。
编译原理第6章 运行时存储空间组织和符号表
运行时存储空间组织和符号表
3
当前活动记录一般包含如下内容: 连接数据: ①返回地址 ②动态链:指向调用该过程前的运行活动记录地 址的指针。运行时,使运行栈上各数据区按动态 建立的次序连成链。链头为栈顶起始位置。 ③静态链:指向静态直接外层最新活动记录地址 的指针,用来访问非局部数据。 形式单元:存放相应实在参数的地址或值。 局部数据区:局部数据、内情向量、临时单元。 ( P164 图6.7 )
2013-6-28
运行时存储空间组织和符号表
35
1
14
例:n=13 32
2013-6-28
运行时存储空间组织和符号表
36
三、 名字的作用范围 1、Fortran的符号表组织
2013-6-28
运行时存储空间组织和符号表
37
2、Pascal符号表组织
最近嵌套作用域原则:一个名字的作用 域是那个包含了这个名字的说明的最小 函数。 设计符号表: ①采用栈符号表:新的名字从栈顶填入, 每当进入一个过程时建立一张子符号表, 退出时释放。 ②引入过程的嵌套层次表(DISPLAY)
2013-6-28
运行时存储空间组织和符号表
14
§2 静态存储分配
FORTRAN77采用的是静态存储分配,它 的程序是段结构,整个程序由主程序段和若 干个子程序段组成,它的每个数据名所需的 存储空间大小都是常量,并且不允许递归调 用,这样,整个程序所需存储空间的总量在 编译时就能完全确定,所以,可以采用静态 存储分配方式。
2013-6-28
运行时存储空间组织和符号表
42
2013-6-28
运行时存储空间组织和符号表
43
2013-6-28
运行时存储空间组织和符号表
符号表的组织和
5.2 符号表的主要属性及其作用
– 不同的符号类别包含了不同的属性,由于它们的信 息不同,也就导致了符号表的组织有较大的差别。 例如,数量类型的变量名字和过程名字:
• 对于一个变量名要记录其类型(如整型、实型、布尔型等)、占用 的存储字节以及相对与某个基准位置的相对位置;
• 对一个过程名要记录的属性包括参数的个数及其类型,该过程是否 有返回值,过程中的变量声明,甚至过程声明(如果像Pascal语言 允许嵌套过程声明)等信息。
• 同样,在内层作用域中,外层的标识符将被内层的同名标 识符所屏蔽,变得不可见,即外层中同名标识符的可见范 围是作用域中挖去内层块的范围,在内存块形成了作用域 洞。
整理课件
– (6 )存储分配信息
• 编译程序需要根据符号的存储类别定义以及它们在程序中 出现的位置和顺序来确定每一个符号应该分配的存储区域 及其具体位置。
整理课件
– 作用域与可见性
• 标识符的可见性从另外一个角度说明其有效性,它与作用 域有一定一致性。
• 标识符的作用域包含可见范围,但是,可见范围不会超过 作用域。
• 可见性在理解同名是不是合法的作用域嵌套时十分直观。 对于外层块域内层块定义的同名标识符,在外层作用域中, 内层所定义的标识符时不可见的,即外层所引用的是外层 所定义的标识符;
不同的程序语言规定了符号 的不同性质以及语法、语义和规 则,几种基本整的理课件符号属性。
– (1)符号名
• 语言中的符号名通常用标识符来表示。根据语言的定义,程序中 出现的重名标识符定义将按照该标识符在程序中的作用域和可视 规则进行相应的处理。而在程序的运行过程中,符号表中的符号 名始终是唯一的标志。
4. 在面相对象语言中,还必须把一个类或其超类所定义同名方法 存放在一个方法表中,指向每个方法的实现操作,以便实现面 相对象的继承性质。
(优选)符号表的组织和管理
– 例 C语言的变量声明
short int a;
float b = 0.0;
– 把标识符a声明为短整数型,把b声明为浮点类型, 而且初始化为0。那么,编译程序对每个变量要记 录它的类型,以便执行类型检查和分配存储,比如 短整型变量i占2个字节;要记录它在存储器中的位 置(相对位移或绝对地址),以便目标程序运行时 访问;若像b有初始值,则还需要记录这个初始值。
• (2) 查找符号的属性
– 符号表存放了源程序中的各种类型的信息,比如数 值、变量类型、参数传递的地址等,在分析和翻译 源程序的过程中会被不断地查询。
– 例如,对于上述的变量声明,如果源程序有代码 a + b时,就需要查找、计算表达式中运算数的类型 和值,以便计算出表达式。
– 又如,在源程序中如果出现了函数调用factory (6), 编译程序就需要查找到factory的声明,找到实参6 的地址并传给形参n,执行函数factory的体,并返 回值等。
• 区别符号存储类型地属性是编译过程中语义处理、检查和 存储分配的重要依据。
3. 又如,面向对象语言的继承性和多态性允许同一 个消息在不同的环境中调用不同的方法(函数), 即调用同名但在不同的类中实现的方法。这就需 要编译或者运行时在方法的符号表中查询在参数、 返回数以及方法方面名字一致的实现。
• (3) 作为目标代码生成阶段地址分配的依据
– 标识符由它定义的存储类型或它在程序中的位置来确定。
– (2)符号种属
• 由于语言中符号所拥有的属性可能不同,其组织就可以采用不 同的数据结构,可以用符号的种属来区别每个符号的基本划分。
• 根据不同的语言,符号的种属可以包括:简单变量、结构型变 量、数组、过程、类型、类等。
编译原理符号表
编译原理符号表符号表是编译器中一个非常重要的数据结构,用于存储程序中的标识符(如变量、函数名等)和对应的属性信息(如数据类型、作用域等)。
在编译器的各个阶段,都需要使用符号表来进行词法分析、语法分析、语义分析等操作,因此符号表设计的好坏直接影响到编译器的质量和效率。
一般来讲,符号表可以被看作是一个以标识符为键、以属性信息为值的映射表。
在编译器的词法分析阶段,源代码中的每个标识符都会被扫描并加入符号表中,同时为每个标识符生成一个唯一的“id”(也称为“符号表条目”)作为在后续处理中访问符号表的索引。
在编译器的语法分析和语义分析阶段,编译器会利用符号表进行语法分析和语义检查。
例如,在语法分析阶段,编译器需要判断变量是否被正确声明和使用,因此需要在符号表中查找变量的属性信息;而在语义分析阶段,编译器需要对表达式进行类型检查或者函数调用进行参数匹配,因此也需要在符号表中查找相关的属性信息。
需要注意的是,符号表的实现需要考虑到标识符的作用域、重复定义、名称空间等问题。
一般来说,编译器需要支持不同作用域之间的变量共存和访问,因此需要为不同的作用域维护不同的符号表。
当在一个新作用域中遇到相同的标识符时,编译器应该创建新的符号表条目;而在同一作用域中出现重复定义时,编译器应该抛出错误信息。
同样需要注意的是,符号表的实现也需要考虑到数据结构的效率和空间占用。
一些常用的实现方式包括基于哈希表的实现、基于树的实现(如平衡树、二叉查找树等)等。
在编译器优化阶段,符号表的实现也会影响编译器生成的目标代码的质量和效率。
例如,在常量表达式优化中,编译器使用符号表来维护常量的值和类型信息,从而可以直接进行常量表达式的求值,而不必在运行时才计算。
总的来说,在编译器中,符号表是一个极其重要的数据结构,对于编译器的性能和代码质量有着重要的影响。
因此,在设计和实现编译器时,需要认真考虑符号表的性能和可扩展性,并且根据具体的编程语言特性进行相应的优化。
章符号表组织
10
1 10 itp 1
x rtp vf v2
y itp vn v3
•VALL
临时变量值区
•v
b值
•5v 数组a值区
4
链接表
•v
y值
•3v •2v
x值 exp值
1 管理区
PPT文档演模板
章符号表组织
• 【例6.2】有类型说明:
•
TYPE arr = ARRAY [1..10] OF ARRAY [1..5] OF
PPT文档演模板
• 活动记录仅是一种存储映像,编译程序所进行 的运行时刻存储分配是在符号表中进行的。
• 如果不支持可变数据结构,活动记录的体积是 可以在编译时确定的。
章符号表组织
6.5.2 活动记录(续)
• 2.活动记录的结构
•(1)连接数据区
•TO
•·返回地址:
P
•·动态链:
• 指向调用该过程的主调程序
PPT文档演模板
章符号表组织
6.3.2 类型表(TAPEL)
•※ 结构: TVAL TPOINT
•TVAL(类码)– 类型代码:
• i(整型),r(实型),c(字符型),b(布尔型),
• a(数组型),d(结构型),…
•TPOINT(指针) – 根据数据类型不同,指向不同的 信息表项:
• ① 基本数据类型(i,r,c,b)– nul(空指针);
•注:•值单元分配是以过程函数为单位的。
PPT文档演模板
章符号表组织
6.5.2 活动记录
•1.三个概念
•过程:•一个可执行模块,过程或函数,通常完成特 定的功能。
•活动:•过函的一次执行。每执行一次过程体,则产 生该过函的一个活动。
符号表的组织与管理
15
根据语言的定义,程序中出现的重名标识符定义将按照该标识 符在程序中的作用域和可视性规则进行相应的处理。 而在符号表运行过程中,表中的标识符名始终是唯一的标志。 在一些允许操作重载(operator over load)的语言中,函 数名、过程名是可以重名的,对于这类重载的标识符要通过它 们的参数个数和类型以及函数返回值类型来区别,以达到它们 在符号表中的唯一性。
一般来说一个变量的作用域就是该变量可以出现的场合,也就
是说在某个变量作用域范围内该变量是可引用的,这就是变量
可视性的作用域规则。
21
其它两种情况影响到一个变量的可视性
⑴ 函数的形式参数:
int a; // 外部定义的整型变量 a int func(float a, int b) // 函数内部定义的局部整型变量 a, // 屏蔽了外部定义的整型变量 a {
一般来说,若把外部变量视为 0 层的话,则函数内部作为第 1 层,依次向内嵌套定义的分程序分别为 2,3,…层。Байду номын сангаас
在 C 语言程序中函数之间是并列定义的,因此每个函数内部 都定义为第一层,而函数内的分程序也可以是并列定义的,对 于并列定义的分程序当然具有相同的层次号。
24
5、符号变量的存储分配信息
根据符号变量的存储类别定义及它们出现的位置和次序来确定 每一个变量应分配的存储区及在该区中的具体位置,用相对区 头的位移量表示。 通常有两类存储区,即静态存储区和动态存储区;
} // 第二层尾
} // 第一层尾
23
怎么确立符号的作用域和可视性?
为确立符号的作用域和可视性。符号表属性中除了需要符号的 存储类别之外还需要表示该符号在程序结构上被定义的层次。 符号表中设置一个表达符号所在层次的属性域,存放该符号的 定义层次。
编译原理课件-符号表
在引用聲明過的識別字時進行
修改表項
在獲得新的語義值資訊時進行
刪除一個或一組無用的項 釋放符號表的空間
在編譯結束前或退出一個分程式
符號表的組織
總體組織和表項屬性資訊組織 第一種: 把屬性種類完全相同的那些符號組織
在一起,構造出多個符號表,常數表、變數名 表、過程名表,標號表 第二種: 把所有語言中的符號都組織在一張符 號表中。組成一張包括了所有屬性的龐大的符 號表 第三種:。。。
上下文語義的合法性檢查的依據
在語義分析中,符號表所登記的內容將用於語義檢查(如檢查一 個名字的使用和原先的說明是否一致)和產生中間代碼。
目標代碼生成階段地址分配的依據
在目標代碼生成階段,當對符號名進行地址分配時,符號表是地 址分配的依據。對一個多遍掃描的編譯程序,不同遍所用的符號 表也往往各有不同。因為每遍所關心的資訊各有差異。
符號表項的排列
符號表作為一個多元組,表中元組的排列組織 是構造符號表的重要成分。在編譯程式的整個工 作過程中,符號表被頻繁地用來建立表項,查找 表項,填充和引用表項的屬性。因此表項的排列 組織對該系統運行的效率起著十分重要的作用。 在編譯程式中,符號表項的組織傳統上採用三種 構造方法。即線性法,二分法及散列法。
根源程式
詞法分析器
單詞符號
符
語法分析器
出
號
語法單位
錯
表
語義分析與中間代碼生成器
管
中間代碼
處
理
代碼優化
中間代碼
理
目標代碼生成器
目標代碼
符號表
符號表是一種數據結構,用來保存根源程 式語言中的各種資訊,如記錄名字的作用 域以及綁定資訊。
在編譯過程不斷彙集和查證出現在根源程 式中的各種單詞的語義屬性特徵資訊。
符号表组织符号表组织语义分析之一
※ 这里假定:值单元个数依字长为单位计算。
路漫漫其修远兮, 吾将上下而求索
6.3.4 结构表(RINFL)
※ 结构:
每个域占表中一个纪录
ID
OFF TP
• ID(结构的域名)—
• OFF(区距)—是idk的值单元首址相对于所在记录值 区区头位置;
…
名字 类型 种类 地址
PFINFL(函数表)
TYPEL(类型表) TVAL TPOINT· AINFL(数组表 )
RINFL(结构表)
…
CONSL(常量表)
LENL(长度表 ) VALL(活动纪录 )
路漫漫其修远兮, 吾将上下而求索
6.3.1 符号表总表(SYNBL)
※ 结构: NAME TYP CAT ADDR
约定:off1=0, off2= off1+LEN(tp1), …… offn= offn-1+LEN(tpn-1)。 idn-1的长度
• TP(域成分类型指针) – 指针,指向idk域成分类型 路漫漫其修远兮, (在类型表中的信息);
吾将上下而求索
6.3.5 函数表(PFINFL)
---- 过程或函数语义信息 ※ 结构:
※ 结构:
…
路漫漫其修远兮, 吾将上下而求索
6.4 符号表的构造过程示例:
SYNBL
PFINFL
exp rtp f
?
2 ENT
线性表、顺序表、索引表和散列表,皆可以采用。
路漫漫其修远兮, 吾将上下而求索
6.2.3 符号表的维护、管理方式
※一个源文件有若干个函数组成,通常,每个函数对 应一个符号表,此外,还是有一个公用符号表;
《编译原理》教学大纲
《编译原理》教学大纲大纲说明课程代码: 3225003总学时: 64 学时(讲课 48 学时,实验16 学时)总学分: 4课程类别:学科基础课适用专业 : 计算机科学与技术(专业)预修要求: C 语言程序设计、 C++ 程序设计、数据结构课程的性质、任务及地位:《编译原理》是计算机科学与技术专业的一门重要基础课。
通过对该课程的学习,使学生掌握编译过程中的相关原理和编译技术,让学生能初步进行编译程序的开发和维护,同时促进提高学生开发软件的能力。
教学目的与基本要求:本课程的目的,通过向学生讲述编译系统的结构、工作流程及编译程序各部分的设计原理和实现技术,使学生既掌握编译技术理论的基础与基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
本课程理论性较强。
因授课对象为工科学生,所以在强调编译系统的构造原理和实现方法的同时,为培养学生的实际工作能力,通过上机实践进一步加深学生对课堂教学内容的理解。
目的是要使学生牢固掌握相关的基本理论和基本方法,并能初步利用上述理论和方法解决简单实际问题。
教学方法和教学手段的建议:在教学方法上,贯彻理论联系实际、“精讲、多练”的原则,进行案例式、启发式的教学,对于一些实际性较强的问题要多采用课堂讨论等方式,以提高学生的思辨能力和学习的主动性;引导学生读书、理解、体悟、运用相结合;提高学生的学习兴趣与热情,培养与发挥学生的提出、分析及解决问题的能力。
教学手段:运用多媒体教学手段 +黑板 +上机实验的手段。
采取课堂讲授、课堂讨论、课后练习与自学等形式。
大纲的使用说明:大纲对课程性质、目的等作简单说明,同时列出各章节要学习的知识点、重点、难点,便于教学时教授重点的安排和学生自学安排。
大纲正文第一章引论学时: 4 学时(讲课 4 学时,实验 0 学时)了解编译的概念;理解编译程序的各组成部分及功能。
本章讲授要点:介绍程序设计语言与编译程序间的关系,主要内容包括:各级程序设计语言的定义、源程序的执行、编译程序的构造、编译程序的分类、形式语言理论与编译实现技术的联系。
符号表
6
构造符号表的算法
1.初始化: CURRBL =0; LASENT=0; LASTBL=0; TOPENT=0; /*注:以上各量 在下面的程序中分别简记为 CB,LE,LT,TE*/ 2.(1)当进入分程序的首符号或 过程时: B[++LT].OUTERN=CB; B[LT].ECOUNT=0; B[LT].POINTER=TE; CB=LT; (2) 遇到分程序中的定义性出现 时: TP--;S[TE]=相关信息; B[CB].ECOUNT++; B[CB].POINTER=TE; (3)遇到END时: B[CB].POINTER=LE+1; for(k=1; k<=B[CB].EC; k++) S[++LE]=S[TE++]; CB=B[CB].OUTERN; 3.重复2.,直到扫描结束. 对于前面的程序结构,其构造符 号表的过程见教材中P266图 6-5
对符号表的访问常见操作有: (1)判定一给定的名字是否在表中; (2)在表中填入一个新名字; (3)访问与给定名字相关的信息; (4)为给定的名字填入或更新其某些信息; (5)从表中删除一个或一组名字 在很多程序设计语言中,对名字的作用域有相应的规定, 即同一名字的标识符,在不同的作用域里标识了不同的 对象,且占用了不同的存储空间. 因此,在组织符号表时,应能反映各个标识符的作用域.
2
6.2 分程序结构语言符号表的建立
分程序结构语言 用其所写的程序单元(program unit) 中,可以再包含嵌套的程序单元,且其中每个程序单元均 可定义属于自己的一组局部变量.如PASCAL中的过程 说明,C中花用括{}号括起来的分程序或复合语句等. 程序单元的嵌套导致了变量作用域的嵌套,故把允许名 字作用域嵌套的语言称为具有分程序结构语言的语言. PASCAL是典型的分程序结构语言之一. 对于嵌套的作用域,同名变量在不同处代表了不同的实 体,因此,需采用分层建立和处理符号表的方式.
编译原理课件-符号表
關鍵字域的組織
符號表的關鍵字域(段)就是符號名稱 等長關鍵字域(段)符號表 不等長關鍵字段符號表---採用關鍵字池的 索引結構。
作用域檢查 作用域和可見性
基本作用域規則(lexical rule) int a;
void Binky(int a) { int a; a = 2; ...
} 作用域檢查實現: 1每個作用域一個獨立的符號表,這些符號表組織成作用域
name:alfa; case kind: object of
constant: (val: integer); variable,procedur: (level, adr, size: integer) end;
例程式說明部分為:
CONST A=35,B=49;
Const(常量)無層次
VAR C,D,E;
VAL:35 VAL:49 LEVEL:LEV LEVEL:LEV LEVEL:LEV LEVEL:LEV LEVEL:LEV+1
ADR:DX ADR:DX+1 ADR:DX+2 ADR: ADR:DX
SIZE:4
…… ……
……
……
名字
類型
層次/值
地址 存儲空間
某編譯器的符號表實例
編譯程序分析第13行時符號表的內容
7.4 符號表
.符號表的作用和地位 .符號的主要屬性及作用 .符號表的組織
符號表的作用和地位-----語義檢查的依據
目標代碼生成階段地址分配的依據
在編譯程式中符號表用來存放語言程式中出現的有 關識別字的屬性資訊,符號表中所登記的資訊在 編譯的不同階段都要用到。
在語義分析中,符號表所登記的內容將用於語義檢 查(如檢查一個名字的使用和原先的說明是否一 致)和產生中間代碼。
6章符号表组织
临时变量值区
v5
b值
v4 数组a值区 链接表
v3
y值
v2 v1
x值 exp值
管理区
【例6.2】有类型说明:
TYPE arr = ARRAY [1..10] OF ARRAY [1..5] OF INTEGER;
试填写符号表。
SYNBL
TYPEL
arr
t
i
r
LENL
c
200
b
AINFL
a
1
10
20
a
6.2 符号表的组织与管理
6.2.1 符号表的工作原理
⑴ 遇 定义性标识符(在说明中)--- 把语义信 息填入表中,并修改其TOKEN的指针,使其指向相 应的表项:(i , ) 该标识符符号表项
⑵ 遇 应用性标识符(在语句中)--- 查符号表 的相应项,查到后修改其TOKEN的指针,使其指向 相应的表项:(i , ) 该标识符符号表项
活动记录:一个有结构的连续存储块。用来存储过 函一次执行中所需要的信息。
活动记录仅是一种存储映像,编译程序所进行 的运行时刻存储分配是在符号表中进行的。
如果不支持可变数据结构,活动记录的体积是 可以在编译时确定的。
局部数据 连接数据
6.5.2 活动记录(续)
2.活动记录的结构
(1)连接数据区
TOP
1
5
itp 4
设:实型占8个存储单元,整型占4个单元,布尔型和字符型占1个单元。
【例6.3】有类型说明: TYPE rec = RECORD
u: INTEGER;
试填写符号表。 SYNBL
v: ARRAY [1..10] OF BOOLEAN; r: RECORD x, y : REAL END END;
第六章6.3 符号表的管理
下图表示线性符号表登录新符号symbol i的前后情况:
对于二分法组织的符号表,根据登录符号在符号 表中按词典排序所确定的位置,把该位置以后的所 有原表项下移一个表项的位置,然后在选定位置登 录新符号
下图表示在排序符号表中登录新符号symbol k的前后情况:
symbol k
对于散列表,新符号的登录是通过杂凑算法决定 登录表项的位置
Pascal过程声明嵌套的例子
procedure P( ); var x,y:integer; procedure Q( ); var x,z:real; begin ....... end
begin ......
end
带有分程序的C程序的例子
void main( )
{ int a = 1;
B1
例3:
1. procedure P( )
2.
var i, j, k: integer;
{t1} i ……
j …… k ……
3.
procedure Q( )
4.
var x, y: real; {t2}
x …… y ……
5.
procedure R( )
6.
var a, x: boolean; {t3} a …… x ……
可行的解决方法:把所有符号的可能属性作为符号 表表项属性。
– 忧点:有助于降低符号表管理的复杂度; – 缺点:对于某些类具体符号可能增加无用的属性空间,
从而增加了空间开销。
第2种方法组织上例中的符号得到一张符号表,如下图所 示:
3、折中方式
根据符号属性相似程度分类组织成若干张表,每 张表中记录的符号都有比较多的相同属性。
6.3 符号表的管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•S 第六章符号表组织
6.5.4 嵌套过程语言的栈式存储分配
•1.标识符的作用域 •·过程嵌套的一个关键问题:•标识符的作用域问题 。
• 标识符的作用范围往往与它所处的过程相关,也就 是说,同一个标识符,在不同的程序段里,代表不同的 对象,具有不同的性质,因此要分配不同的存储空间。
•·标识符的有效范围:•服从最小作用域原理;
INT•E试GE填R; 写符号表。
•SYNBL
•TYPEL
•arr
•t
•LENL
•200
•AINFL
•a
•1 •1
•20
0
•a
•1
•5
•it •4
p
•设:实型占8个存储单元,整型占4个单元,布尔型和字符型占1个单元。
PPT文档演模板
第六章符号表组织
• 【例6.3】有类型说 •TYPE rec = RECORD
•※ 结构:
PPT文档演模板
• LEVEL(层次号) –该过函静态层次嵌套号, • OFF(区距) –该过函自身数据区起始单元相对该 过函值区区头位置 ;
• FN(参数个数) – 该过函的形式参数的个数; • PARAM(参数表) – 指针,指向形参表; • ENTRY(入口地址) – 该函数目标程序首地址(运 行时填写);
PPT文档演模板
第六章符号表组织
6.5.2 活动记录
•1.三个概念
•过程:•一个可执行模块,过程或函数,通常完成特 定的功能。
•活动:•过函的一次执行。每执行一次过程体,则产 生该过函的一个活动。
•活动记录:•一个有结构的连续存储块。用来存储过 函一次执行中所需要的信息。
PPT文档演模板
• 活动记录仅是一种存储映像,编译程序所进行 的运行时刻存储分配是在符号表中进行的。
p•rt
•d
p
•TYPEL
•1
•r •1
0•1
•x
4 •0
•rt
6•8
•y
•8
p•rt
p
•8
•d
•AINFL
•a
•1 •1
•bt •1
0
p
•d
PPT文档演模板 •设:实型占8个存储单元,整型占4个单元,布尔型第六和章符字号符表组型织 占1个单元。
• 【例6.4】•有过程说明:
•PROCEDURE P1(VAR x: REAL; y: INTEGER);
项
•6.2.2 符号表的查询、访问方式
•线性表、顺序表、索引表和散列表,皆可以采用。
PPT文档演模板
第六章符号表组织
•6.2.3 符号表的维护、管理方式
• ※一个源文件有若干个函数组成,通常,每个函数 对应一个符号表,此外,还是有一个公用符号表;
• ※符号表如何管理?往往取决于所属语言的程序
结构,就 C语言来说,可以在内存设置一定长度的符
•1 •P1 •2
• ……
•设P1所在• B层ELGEIVNEL=…1,… 即E所ND定;义的层LEVEL=2,•试填写符号表。
•SYNBL
•P1
•p
•x •rt •v •?
•y •prt
•nv
•?
p
f
•TYPEL
•PFINFL
•2 •? •2 •Entr y
•x •rt •v
•?
•y
•prt
n•v
号表区,并建立适当的索引机制,访问相应的符号表:
•索引 机制
公用符号表
•全局
符号表区
现行函数符号表
…
…
•局部
FUNCTION 2 符号表
符号表区
FUNCTION 1 符号表
PPT文档演模板
第六章符号表组织
6.3 符号表的结构设计
【例6.1】有下列函数过程:
PPT文档演模板
FUNCTION exp(x:REAL;VAR y:INTEGER):REAL;
• CLEN(成分类型的长度)– 成分类型的数据所占值单 元的个数;
• ※ 这里假定:值单元个数依字长为单位计算。
PPT文档演模板
第六章符号表组织
6.3.4 结构表(RINFL)
•※ 结构:
•每个域占表中一个纪录
PPT文档演模板
• ID(结构的域名)—
• OFF(区距)—是idk的值单元首址相对于所在记录值 区区头位置;
•⑵ 怎样检查出:a 重定义、z 无定义以及下表变量
•a[2,5]的值地址在何处?…
第六章符号表组织
※ 符号表的体系结构设计
由于标识符的种类不同,导致语义属性也不尽相同;怎 样组织符号表?下面提供一个符号表的体系结构:
•• • token •• i ·
SYNBL(符号表)
NAME TYPE CAT ADDR
•·以C语言为例:•没有分程序结构,过程定义不允许嵌套, 但允许过程的递归调用。
•1.C语言程序的存储组织
•TO
• 【例6.5】•C语言过程调用关系:
P •S P
•Main( ) Q( ) R( )
•则,活动记录栈状态为:
•TO
•2.C的活动记录
P
•其中:
•Old SP值,即前一活动记录的地址;
PPT文档演模板
6.5.1 标识符值单元分配
•值单元分配分两类:
•1.静态分配
•
在编译阶段即可完成真实的地址分配。在编译
时对所有数据对象分配固定的存储单元,且在运行是
始终保持不变。
•2.动态分配 • 指在运行时刻进行的值单元分配,在编译时只能进 行相对地址分配。
•·栈式动态分配; •·堆式动态分配。
•注:•值单元分配是以过程函数为单位的。
第六章符号表组织
PPT文档演模板
2020/11/28
第六章符号表组织
6.1 符号表的地位和功能
符号表是标识符的动态语义词典,属于 编译中语义分析的知识库;主要内容:
•标识符 四种语 义信息
⑴ 名字 — 标识符源码,用作查询关键字;
⑵ 类型 -- 该标识符的数据类型及其相关信息;
⑶ 种类 -- 该标识符在源程序中的语义角色;
第六章符号表组织
6.3.6 其他表(…)
•⑴ 常量表(CONSL)-- 存放相应常量的初值; •※ 结构:
•⑵ 长度表(LENL) – 存放相应数据类型所占值单元 个数;•※ 结构:
PPT文档演模板
•⑶ 活动纪录表(VALL) – 一个函数(或过程)虚拟 的值单元存储分配表;此分配表在运行调用时才可 用,故称活动纪录。
明:
•
•试填写符号表。••
•SYNBL
•
u: INTEGER; v: ARRAY [1..10] OF BOOLEAN; r: RECORD x, y : REAL END END;
•re
•t
•LENL
•RINFL
c•u
•it
•d
•v
p
•d
•30
•u
•0 •it
•4
•v
•4
p
•r
•d
•x
•rt
•d
•y
…
•名字 类型 种类 地址
•PFINFL(函数表)
•TYPEL ( 类 型 表
)
• AINFL(数组
• TVAL TPOINT· 表)
•RINFL(结构表)
•…
•CONSL(常量表)
•LENL(长度表)
•VALL(活动纪 录)
PPT文档演模板
第六章符号表组织
6.3.1 符号表总表(SYNBL)
•※ 结构:
• ② 数组类型(a) – 指向数组表;
• ③ 结构类型(d) – 指向结构表;…
PPT文档演模板
第六章符号表组织
6.3.3 数组表(AINFL)
•※ 结构:
•每维占表中一个纪录
• LOW(数组的下界)--(C语言自动设为:0);
• UP(数组的上界)—
• CTP(成分类型指针) – 指针,指向该维数组成分类 型(在类型表中的信息);
•NEME(名字)— 标识符源码(或内部码) •TYP(类型) – 指针,指向类型表相应项; •CAT(种类) – 种类编码: • f/P(函数),c(常量),t(类型),d(域名), • v,vn,vf(变量,换名形参,赋值形参); •ADDR(地址) – 指针,根据标识符的种类不同,分 别指向:PFINFL,CONSL,LENL,VALL,…
PPT文档演模板
第六章符号表组织
6.3.2 类型表(TAPEL)
•※ 结构:
•TVAL(类码)– 类型代码:
• i(整型),r(实型),c(字符型),b(布尔型),
• a(数组型),d(结构型),…
•TPOINT(指针) – 根据数据类型不同,指向不同的 信息表项:
• ① 基本数据类型(i,r,c,b)– nul(空指针);
•·解决问题的思想:
• 为了在活动记录中查找这些 •TO 非局部名字所对应的存储空间, P 过程Q运行时必须设法跟踪它的所 有外层过程的最新活动记录的地 址。
•·解决方案:
• 活动记录中增加静态链!使 其指向直接外层的最新活动记录 的首地址;
PPT文档演模板
•S P 第六章符号表组织
据连 接 数
•
•3.嵌套层次显示表(display)和活动记录结构
•(1)连接数据区: •0~2;
•·老SP — 主调过程的活动记录首址;
• ·全局display地址 — 主调过程的显示区表首址;
•(2)参数个数: •3;
•TO
•约定:off1=0,