第六章符号表组织

合集下载

第六章 语义分析(1)

第六章 语义分析(1)
Program A Var x, y: integer; Procedure P() Var k:array[1..9] of real; m: integer;
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章符号表的组织与

第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章 运行时存储空间组织和符号表

编译原理第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”(也称为“符号表条目”)作为在后续处理中访问符号表的索引。

在编译器的语法分析和语义分析阶段,编译器会利用符号表进行语法分析和语义检查。

例如,在语法分析阶段,编译器需要判断变量是否被正确声明和使用,因此需要在符号表中查找变量的属性信息;而在语义分析阶段,编译器需要对表达式进行类型检查或者函数调用进行参数匹配,因此也需要在符号表中查找相关的属性信息。

需要注意的是,符号表的实现需要考虑到标识符的作用域、重复定义、名称空间等问题。

一般来说,编译器需要支持不同作用域之间的变量共存和访问,因此需要为不同的作用域维护不同的符号表。

当在一个新作用域中遇到相同的标识符时,编译器应该创建新的符号表条目;而在同一作用域中出现重复定义时,编译器应该抛出错误信息。

同样需要注意的是,符号表的实现也需要考虑到数据结构的效率和空间占用。

一些常用的实现方式包括基于哈希表的实现、基于树的实现(如平衡树、二叉查找树等)等。

在编译器优化阶段,符号表的实现也会影响编译器生成的目标代码的质量和效率。

例如,在常量表达式优化中,编译器使用符号表来维护常量的值和类型信息,从而可以直接进行常量表达式的求值,而不必在运行时才计算。

总的来说,在编译器中,符号表是一个极其重要的数据结构,对于编译器的性能和代码质量有着重要的影响。

因此,在设计和实现编译器时,需要认真考虑符号表的性能和可扩展性,并且根据具体的编程语言特性进行相应的优化。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,
相关文档
最新文档