符号表组织符号表组织语义分析之一
变量名符号表
ENTER过程完成。
说明部分的分析与处理(程序)
• 说明类型的定义: • object= (constant, variable,procedur) • (定义纯量/枚举类型) • 名字表的定义 table:array[0..txmax] of
record name:alfa; • case kind:object of
表也是一个栈,栈顶指针为level。当进入一个新过程时,level增加1;每当退 出一个过程时,level减1。DISPLAY(level)总是指向当前正在处理的最内层的 过程的子符号表在栈符号表中的起始位置。
.在符号表的信息栏中引入一个指针域(previous)用以链接它在同一过程内 的前一域名字在表中的下标(相对位置)。每一层的最后一个域名字,其 previous之值为0。这样,每当需要查找一个新名字时,就能通过
地址ble表的下标指针tx补充说
明:
tx 6 (9)
LE 1
V BLOCK
tx ...
0
(6)
LE 0 V BLOCK
主程
序
tx是BLOCK的 实际值参
BLOCK(LEV+1,TX, …) (递归进入分程序)
第1次调用block BLOCK(0, 0, …)
编译程序按名字的不同种属分别使用许多符号 表,如常数表、变量名表、过程名表等等。
SUBROUTINE INCWAP(M,N)
10 K=M+1
M=M+4 N=K RETURN END
经编译头三阶段后所产生的主要表格有: 符号 名表SNT、常数表CT、入口名表ENT、标号 表LT和四元式表QT
符号名表SNT
几种通常都是需要的。 1 符号名 2 符号的类型 3 符号的存储类别 4 符号的作用域及可视性 5 符号变量的存储分配信息 6 符号的其它属性(1) 数组内情向量 (2) 记录结构型的成员信息(3) 函数及过程
编译原理课件(刘铭)第6章
本章小结
也就是说标识符是一个没有意义 的字符序列,而名字有确切的意义。 在程序语言中标识符可以是一个变量 的名字或一个函数的名字。
例如 area , 作为标识符,它没有 任何意思,但作为名字,可以表示 变量名或函数名等。
本章小结
3. 符号表的查找
符号表查找算法与该符号表的构造方法 密切相关即有顺序查找、折半查找和杂 凑查找算法。
6.3 符号表的组织
一个编译程序,从词法分析、语法 分析、语义分析到代码生成的整个过程 中,符号表是连贯上下文进行语义检查、 语义处理、生成代码和存储分配的主要 依据,因此符号表的组织直接关系到这 些语义功能的实现和语义处理的时空效 率。
6.3 符号表的组织
符号表的表格形式
名 字 栏 信 息 栏
符号表的作用
符号表的组织
符号表的建立和查找
6.1 符号表的作用与生成期
符号表的作用 符号表用来存放程序语言中出现 的有关标识符的属性和特征。 符号表在整个编译期间的作用归 纳为以下几个方面: 将标识符的名字及属性登录在符号 表中
6.1 符号表的作用与生成期
在分析说明语句时,编译程序根 据说明语句信息将标识符的相应属性 如标识符的类型:实型,整型,布尔 型等;标识符的种属:数组名,变量 名,过程名,函数名等; 标识符的作用 域:全局变量或局部变量等信息登录 到符号表中。
名字栏存放标识符的名字,信息栏存放 名字相关属性。
. . .
. . .
6.3 符号表的组织
符号表的总体组织 1. 编译程序按名字的不同属性构造出多 个符号表。如常量表、变量名表等。 符号表结构相同,表项等长。不便管理。
2. 编译程序把语言中的所有名字组织在 一张符号表中。 符号表便于管理,但表结构复杂且表项 不等长。
符号表专题知识讲座
威
网 :
在一起
专
业 的
➢优点:每个符号表中存储符号旳属性个数和构造
计 算
完全相同
机
学
习 网
➢缺陷:一种编译程序将同步管理若干个符号表,
站 增长了总体管理旳工作量和复杂度
23
❖第2种:把全部语言中旳符号都组织在一张符号表中
盛
威 网
➢优点:总体管理非常集中单一,且不同种类符号旳共
: 专
同属性可一致地管理和处理
机 学 习
空间大小等。
网
站 对于指针:所指对象类型等。
10
五.符号表旳功能
1.搜集符号属性
盛
威
网
:
专 业
2.上下文语义旳正当性检验旳根据
的
计
算
机
学
习 网
3.作为目旳代码生成阶段地址分配旳根据
站
11
六.符号表旳分类
静态表:事先构造好旳表,如保存字表、原则
盛 威
函数名表等。需要时去查相应旳此类
网 :
号表LT和四元式表QT
31
符号名表SNT
NAME INFORMATION
(1)M 参数,整数,变量
盛 (2)N 参数,整数,变量
威
网 :
(3)K
整数,变量
专
业
的
计 算 机
常数表CT
学 习
值(VALUE)
网
站
(1) 1
(2) 4
32
入口名表ENT
NAME
INFORMATION
(1)INCWAP 二目子程序,入口QT(1)
学 习
地址:变量所分配单元旳首址或地址位移
编译原理符号表的作用
编译原理符号表的作用介绍编译原理中的符号表是一个重要的数据结构,用于存储程序中的标识符及其相关信息。
标识符可以是变量、常量、函数名等,在编译过程中需要进行词法和语义分析,符号表提供了一个地方来管理这些标识符,并为编译器的其他模块提供必要的信息。
作用符号表在编译过程中起着关键作用,它具有以下几个主要作用。
1. 标识符的声明符号表记录了程序中所有标识符的声明情况,包括标识符的类型、作用域等信息。
对于变量,符号表可以记录其数据类型和内存地址;对于函数,符号表可以记录其参数列表、返回值类型等。
编译器可以通过符号表查找标识符的声明信息,并根据需要进行语义检查和代码优化。
2. 标识符的引用和解析编译过程中,标识符可能会被多次引用,符号表用于解析标识符的引用。
编译器可以根据符号表中的信息确定标识符的类型、作用域等,从而进行语义检查和类型推导。
如果编译器在符号表中找不到对应的标识符,就会报错或警告,提示可能存在的错误。
3. 作用域管理符号表还可以用于管理标识符的作用域。
在程序中,不同的代码块可能定义了相同名称的标识符,符号表可以通过作用域信息来区分这些标识符。
当编译器遇到一个标识符时,它可以在符号表中查找该标识符的作用域,并根据作用域规则来解析标识符的含义。
4. 错误检测和提示符号表还可以用于错误检测和提示。
编译器可以通过符号表判断标识符是否已经定义或声明,以及是否满足相应的语义规则。
如果标识符在符号表中已经存在多个定义,编译器可以发现这种错误,并给出相应的错误提示信息。
符号表的组织结构为了高效地实现符号表的作用,通常采用哈希表或树形结构来组织符号表。
下面是一些常见的符号表组织结构。
1. 线性表符号表可以使用线性表结构进行组织,例如数组、链表等。
线性表结构简单直观,适用于较小规模的符号表。
但对于大规模的符号表,线性表的查找效率较低。
2. 哈希表哈希表是一种基于键值对存储的数据结构,可以快速地查找和插入数据。
符号表中的标识符可以作为哈希表的键,对应的信息可以作为值进行存储。
第六章 语义分析和符号表
FixBody: VariBody:
CaseUnit VariUnits
FixBody
VariBody Next
id CaseType Off
set:
Size Size Size
Kind Kind Kind
BaseType CompType TypeName
file:
pointer:
例有如下的类型定义:
标号部分语义分析原理
设置五种表:LDEC,LDEF,LUSE,SL,PL
LDEC表:(Flag, Label,<Label>); LDEF、LUSE表:(Label); SL表:(kind,LDEFaddr,LUSEaddr); PL表:(LDECaddr,LDEFaddr);
标号的语义分析原理
符号表
符号表的作用:为语义检查和代码生成提供 标识符的语义信息。 标识符的处理思想: 遇到定义性标识符时,在符号表中填写 被定义标识符的符号项; 当遇到使用性标识符时,用该标识符查 符号表求得其属性。
标识符的特点
标识符的作用域:标识符有效的最大程序段 嵌套作用域规则:当存在标识符的嵌套声明 时,最近定义的属性为标识符的当前属性 局部化单位:允许有声明的程序段
标准类型: Size sub: enum: array:
Size Size Size Kind HostType Elems Low Up Leng ElemType
Kind Kind Kind
IndexType
record:
Size Kind FixBody VariBody id FixUnitType Off Next
类型的内部表示
类型的种类:标准、子界、枚举、数组、记录、 集合、文件、指针类型等等。 TypeKind=(intTy,boolTy,charTy,realTy,enumTy, subTy,arrayTy,recordTy,setTy,fileTy,pointerTy)
符号表的组织和
5.2 符号表的主要属性及其作用
– 不同的符号类别包含了不同的属性,由于它们的信 息不同,也就导致了符号表的组织有较大的差别。 例如,数量类型的变量名字和过程名字:
• 对于一个变量名要记录其类型(如整型、实型、布尔型等)、占用 的存储字节以及相对与某个基准位置的相对位置;
• 对一个过程名要记录的属性包括参数的个数及其类型,该过程是否 有返回值,过程中的变量声明,甚至过程声明(如果像Pascal语言 允许嵌套过程声明)等信息。
• 同样,在内层作用域中,外层的标识符将被内层的同名标 识符所屏蔽,变得不可见,即外层中同名标识符的可见范 围是作用域中挖去内层块的范围,在内存块形成了作用域 洞。
整理课件
– (6 )存储分配信息
• 编译程序需要根据符号的存储类别定义以及它们在程序中 出现的位置和顺序来确定每一个符号应该分配的存储区域 及其具体位置。
整理课件
– 作用域与可见性
• 标识符的可见性从另外一个角度说明其有效性,它与作用 域有一定一致性。
• 标识符的作用域包含可见范围,但是,可见范围不会超过 作用域。
• 可见性在理解同名是不是合法的作用域嵌套时十分直观。 对于外层块域内层块定义的同名标识符,在外层作用域中, 内层所定义的标识符时不可见的,即外层所引用的是外层 所定义的标识符;
不同的程序语言规定了符号 的不同性质以及语法、语义和规 则,几种基本整的理课件符号属性。
– (1)符号名
• 语言中的符号名通常用标识符来表示。根据语言的定义,程序中 出现的重名标识符定义将按照该标识符在程序中的作用域和可视 规则进行相应的处理。而在程序的运行过程中,符号表中的符号 名始终是唯一的标志。
4. 在面相对象语言中,还必须把一个类或其超类所定义同名方法 存放在一个方法表中,指向每个方法的实现操作,以便实现面 相对象的继承性质。
c语言符号表
C 语言符号表C 语言符号表是一个重要的编译器数据结构,它用于存储和管理程序中的各种符号。
符号是指程序中的变量、函数、常量、类型等具有标识作用的名称。
符号表的作用是在编译过程中,为符号分配内存地址、类型、作用域等属性,并在需要时查找和修改符号的相关信息。
本文将从以下几个方面简述 C 语言符号表的概念、结构、功能和实现方法:符号表的概念和分类符号表的结构和组织方式符号表的功能和操作符号表的实现方法和技术符号表的概念和分类符号表的概念符号表是一种映射关系,它将程序中的符号名称映射到其对应的属性集合。
属性集合包括了符号的内存地址、数据类型、作用域、存储类别、初始化值等信息。
例如,下面的 C 语言代码片段中,定义了一个全局变量globalA,一个静态变量globalB,一个函数funcA和一个主函数main:/*** 全局变量*/int globalA =2022;/*** 静态变量*/static int globalB =2023;int funcA() {int localFuncAValue =13;return0;}int main(int argc, char*argv[]) {int localMainValue =14;return0;}对于这段代码,编译器会为每个符号创建一个符号表项,并填充其属性。
一个可能的符号表如下:符号名称内存地址数据类型作用域存储类别初始化值globalA1000int全局外部2022globalB1004int全局静态2023funcA2000int()全局外部-main3000int(int, char**)全局外部-localFuncAValue-4(%rbp)int局部(funcA)自动-localMainValue-4(%rbp)int局部(main)自动-可以看到,每个符号表项由一个符号名称和一个属性集合组成。
属性集合可以根据不同的编译器设计而有所差异,但一般都包含了上述几个基本属性。
第6章 语义分析(1)
类型的内部表示
为什么需要类型的内部表示?
– 类型是标识符的重要属性; – 类型检查是语义分析的重要部分; – 类型的结构对类型检查很重要;
程序语言的类型
– 基本类型 Integer (int ) Real (float) Bool Char – 构造类型 数组(Array) 结构体(Structure、record) 联合类型(Union、变体记录) – 枚举类型 – 指针类型
联合类型的内部表示
Kind Body unionT y Body: 指向联合体中域定义链表 Size: 所有域的类型的size中最大值;
Body
FieldName FieldType Next
Size
typedef union{ int i; char name[10]; real x; } test;
基本类型的内部表示
Size intPtr Kind
intSize
boolSize realSize
intTy
boolTy realTy
boolPtr realPtr
charPtr
charSize
charTy
数组类型的内部表示
Size
Kind arrayTy
Low
Up
ElemTy
size = sizeof(ElemTy) (Up-Low+1) ElemTy: 指向数组成分类型的指针; array [2..9] of integer; (8, arrayTy, 2, 9, intPtr)
第六章 语义分析
6.1 语义分析概述
6.2 符号表
6.3 类型的语义分析 6.4 声明的语义分析 6.5 程序体的语义分析 么是符号表(Symbol Table)?
编译原理符号表
编译原理符号表1. 引言编译原理是计算机科学领域中一个重要的研究方向,它研究的是将高级语言程序转化为机器语言的过程。
在编译器中,符号表是一种常用的数据结构,用于存储程序中的各种符号及其相关信息。
本文将深入探讨编译原理符号表的概念、作用、设计方法以及常见的符号表实现方式。
2. 符号表的概念和作用2.1 符号表的定义符号表是编译器中用于存储程序中各种符号信息的数据结构。
它一般由编译器自动生成和维护,用于支持语法分析、语义分析和代码生成等编译过程。
2.2 符号表的作用符号表在编译器的各个阶段都发挥着重要的作用:•语法分析阶段:符号表用于识别和存储各种变量、函数和类型的声明信息,以支持后续的语义分析过程。
•语义分析阶段:符号表用于检查变量和函数的引用是否合法,并记录其类型信息和作用域等属性,以支持类型检查和语义约束的验证。
•代码生成阶段:符号表用于存储中间代码和目标代码中的符号引用和符号定义的映射关系,以支持代码生成和目标代码优化等过程。
3. 符号表的设计方法3.1 符号表的数据结构符号表的数据结构通常由符号表项组成,每个符号表项用于存储一个符号及其相关信息。
常见的符号表项包括符号名称、符号类型、作用域、内存地址等。
3.2 符号表的组织方式符号表的组织方式可以有多种选择,常见的包括线性表、哈希表、树和图等。
选择合适的组织方式可以提高符号表的查询效率和插入删除的性能。
3.3 符号表的查询算法符号表的查询算法是指根据给定的符号名称,在符号表中进行查找并返回对应的符号表项。
常见的查询算法有线性搜索、二分搜索和哈希搜索等,选择合适的查询算法可以提高符号表的查询效率。
4. 常见的符号表实现方式4.1 线性表实现线性表实现是符号表最简单的一种实现方式,它可以使用数组或链表来存储符号表项。
线性表实现的优点是简单易懂,缺点是查询效率较低,随着符号表规模的增大,性能下降明显。
4.2 哈希表实现哈希表实现是一种常用的符号表实现方式,它通过哈希函数将符号名称映射到符号表项存储的位置。
语义分析与符号表
第五章语义分析5.1语义分析基础5.1.1 语义分析内容程序设计语言的语义可分为静态语义和动态语义。
所谓静态语义是指在编译阶段能检查的语义,而动态语义则指只有在目标码的运行阶段才能检查的语义。
如果所有类型均能在编译阶段检查,则称这种语言为强类型语言。
Pascal是强类型语言的一个例子。
在某些语言里变量的类型是可变的,这时类型的语义成为动态语义,因为类型相容问题只能在代码运行时才能检查出来。
语言的静态语义成分越多编译器和解释器的区别会越大,如果都属于动态语义,那么编译器和好的解释器的差别将会变小。
类型在大多数语言里都属于静态语义,而且它是最重要的静态语义,可以说,静态语义问题主要是类型相容的问题。
类型检查主要有以下几种:∙各种条件表达式的类型是不是boolean型?∙运算符的分量的类型是否相容?∙赋值语句的左右部的类型是否相容?∙形参和实参的类型是否相容?∙下标表达式的类型是否为所允许的类型?∙变体记录中表示情形的常量是否为合法类型?∙函数说明中的函数类型和返回值的类型是否一致?等除了上述类型检查外,还要进行如下一些语义检查:∙V[E]中的V是不是变量,而且是数组类型?∙V.i中的V是不是变量,而且是记录类型? i是不是该记录类型中的域名?∙V↑中的V是不是指针或文件变量?∙y+f(....)中的f是不是函数名?形参个数和实参个数是否一致?∙p(....)语句中的p是不是过程名?形参个数和实参个数是否一致?∙每个使用性标识符是否都有相应的声明?在同层内有无标识符被声明多次?∙标号是否有声明?有无重复声明和重复定位错误?有无非法转入错误?∙子界类型中的下界和上界类型是否相容?下界是否小于等于上界?∙ ..........................................一遍扫描的编译器是从源程序的ASC码序列即源语言的字符串序列直接生成目标代码,因此不会有独立的语义分析器。
多遍扫描的编译器,也未必有独立的语义分析器,如果没有,则意味着把语义检查工作分散到编译过程的几个阶段中顺便完成。
编译原理第八章 符号表
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)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希
难
表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识
符号表组织符号表组织语义分析之一
返回X地址
6.5.4 嵌套过程语言的栈式存储分配
1.标识符的作用域 ·过程嵌套的一个关键问题:标识符的作用域问题 。
标识符的作用范围往往与它所处的过程相关,也就 是说,同一个标识符,在不同的程序段里,代表不同的 对象,具有不同的性质,因此要分配不同的存储空间。
·标识符的有效范围:服从最小作用域原理;
• TP(域成分类型指针) – 指针,指向idk域成分类型 (在类型表中的信息);
6.3.5 函数表(PFINFL)
---- 过程或函数语义信息 ※ 结构:
LEVEL OFF FN ENTRY PARAM …
• LEVEL(层次号) –该过函静态层次嵌套号, • OFF(区距) –该过函自身数据区起始单元相对该 过函值区区头位置 ; • FN(参数个数) – 该过函的形式参数的个数; • PARAM(参数表) – 指针,指向形参表; • ENTRY(入口地址) – 该函数目标程序首地址(运 行时填写);
SYNBL
PFINFL
exp rtp f
?
2 ENT
…
x rtp vf v2
y itp vn v3
pai rtp c
arr
t
a
v v4
b rtp v v5
CONSL
3.14
LENL
50
TYPEL
c,i,r,b a a
AINFL
15
10
1 10 itp 1
x rtp vf v2
y itp vn v3
VALL
TOP 临时单元
局
内情向量
部 数
局部变量
据
指向调用该过程的主调程序的
形式单元
编译原理的名词解释
编译原理的名词解释编译原理是计算机科学中的一门重要课程,它研究的是如何将高级语言程序转化为计算机能够执行的机器指令。
编译原理涉及许多专业术语和概念,下面将对其中一些重要的名词进行解释。
词法分析(Lexical Analysis)词法分析是编译过程中的第一个阶段,也被称为扫描器。
它负责将源程序中的字符序列转化为单词(词法单元)的序列。
在词法分析的过程中,会忽略不需要关注的字符,如空格和注释。
语法分析(Syntax Analysis)语法分析是编译过程中的第二个阶段,也被称为解析器。
它负责根据词法分析阶段产生的词法单元序列,构建出一棵语法树。
通过语法分析,可以检查源程序是否符合语法规范,并将程序转化为抽象语法树。
语义分析(Semantic Analysis)语义分析是编译过程中的第三个阶段,它负责对语法树进行语义检查和语义规则的应用。
语义分析可以捕捉到一些错误,在编译过程中对源程序进行修正。
此外,语义分析还对程序中的语义逻辑进行处理,包括类型检查、作用域检查等。
中间代码生成(Intermediate Code Generation)中间代码是一种介于高级语言和目标机器语言之间的中间形式。
中间代码生成是编译过程中的一个重要阶段,它将源程序翻译为一种中间表示形式。
中间代码的生成可以便于程序的优化和后续阶段的处理。
代码优化(Code Optimization)代码优化是编译过程中的一个关键环节,它旨在改进生成的目标代码的效率和质量。
代码优化技术包括常量传播、死代码消除、循环优化等。
通过代码优化,可以提高程序的执行效率和资源利用率,改善程序的性能。
目标代码生成(Code Generation)目标代码生成是编译过程中的最后一个阶段,它将中间代码转化为目标机器的机器指令。
目标代码生成需要考虑目标机器的硬件特性和指令集,将中间代码转化为可以被计算机直接执行的机器指令。
符号表(Symbol Table)符号表是编译器中非常重要的数据结构,用于存储程序中出现的所有标识符的信息。
编译原理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的值回送给第二个实参 把 的值回送给第二个实参 //恢复寄存器,控制返回调用段 恢复寄存器, 恢复寄存器
10+8--语义分析与符号表
基本概念
符号表
类型检查
VSL语言的符号表 1/3
符号表元素的数据类型 typedef struct symb { struct symb *next; int type; union { int val; char *text;
/* /* /* /* /*
} val1; union { /* 变量的第一个值 */ int val; /* 对变量取偏移量等 */ struct tac *label; /* 对标号取三地址码 指针 */ } val2 ; } SYMB ; /* 整数常量, 字符串常量和语句标号等也使用 本数据类型, 但是由于没有对其查找的要求, 这些数据将不保存在Hash表中 */ SYMB *symbtab[HASHSIZE] ; /* 符号表 */
静态性质(static):在编译阶段就可以确定的性质, 如:C语言的全 局变量, 类型, 变量和类型的关系,运算和转移指令和函数的入口 地址; 动态性质(dynamic):程序在运行阶段才能确定的性质— 程序在运 行时才能确定的性质,如:C语言的被调用函数的运行环境 (参数、 返回地址、 局部变量和返回值) ;面向对象语言的Virtual Function的动态绑定(binding); 动态性质有相对不变性, 栈式运行环境中, 如: 局部变量和栈顶的 位置关系是不变的; 动态性质必须用其相对不变性实现, 如:函数的调用和被调用转 化为相对不变的调用序列和被调用序列; 语义分析(Semantic Analysis)是编译器前端(front-end)的最后一个 环节, 主要是符号表的建立和类型检查(type checking), 为下一 步中间表示提供必要的上下文相关的信息。
下一个节点 */ 符号的数据类型 */ 变量的第一个值 */ 对整数常数取其值 */ 对变量取其形, 为字符指针 */
编译原理符号表的作用
编译原理符号表的作用一、引言编译器是将高级语言翻译成机器语言的程序,其主要功能是将源代码转换为可执行的目标代码。
在编译过程中,符号表是一个非常重要的数据结构,用于存储程序中出现的各种符号信息。
本文将介绍符号表的作用及其实现原理。
二、符号表的定义符号表是编译器中用于存储程序中出现的各种符号信息的数据结构,包括变量名、函数名、类型名等标识符及其属性信息。
它通常由一个哈希表和多个链表组成。
三、符号表的作用1. 语法分析阶段:在语法分析阶段,编译器会扫描源代码并生成相应的语法树。
同时,在扫描过程中,编译器会将每个标识符添加到符号表中,并记录其类型、作用域等属性信息。
这些信息可以在后续阶段中被使用。
2. 语义分析阶段:在语义分析阶段,编译器会对程序进行类型检查、作用域检查等操作。
这些操作需要使用到之前保存在符号表中的属性信息。
3. 代码生成阶段:在代码生成阶段,编译器会将源代码转换为目标代码。
在此过程中,编译器需要根据符号表中的信息生成目标代码中的符号表。
四、符号表的实现1. 哈希表:符号表通常由一个哈希表和多个链表组成。
哈希表用于快速查找标识符,并将其插入到相应的链表中。
2. 链表:每个链表对应一个作用域,用于存储该作用域中出现的所有标识符及其属性信息。
当进入一个新的作用域时,编译器会创建一个新的链表,并将其添加到符号表中。
当离开该作用域时,编译器会删除该链表。
3. 属性信息:在符号表中,每个标识符都有相应的属性信息,包括类型、作用域、地址等。
这些信息可以在后续阶段中被使用。
五、总结在编译过程中,符号表是一个非常重要的数据结构。
它可以存储程序中出现的各种标识符及其属性信息,并在后续阶段中被使用。
符号表通常由一个哈希表和多个链表组成,其中哈希表用于快速查找标识符,链表用于存储每个作用域中出现的所有标识符及其属性信息。
通过对符号表的实现和使用,编译器可以更加准确地将源代码转换为目标代码。
编译原理符号表和词法分析
扫描源程序
识别单词
转换成属性字
六、词法分析(续一)
词法分析的两种处理结构
字符
单词
源程序
词法分析
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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
※ 这里假定:值单元个数依字长为单位计算。
路漫漫其修远兮, 吾将上下而求索
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 符号表的维护、管理方式
※一个源文件有若干个函数组成,通常,每个函数对 应一个符号表,此外,还是有一个公用符号表;
※符号表如何管理?往往取决于所属语言的程序结
构,就 C语言来说,可以在内存设置一定长度的符号
表区,并建立适当的索引机制,访问相应的符号表:
符号表组织符号表组织 语义分析之一
路漫漫其修远兮, 吾将上下而求索
2020年4月5日星期日
6.1 符号表的地位和功能
符号表是标识符的动态语义词典,属于 编译中语义分析的知识库;主要内容:
标识符 四种语 义信息
❖⑴ 名字 — 标识符源码,用作查询关键字;
❖⑵ 类型 -- 该标识符的数据类型及其相关信息 ;
索引
机制
公用符号表
全局
符号表区
…
路漫漫其修远兮, 吾将上下而求索
现行函数符号表
…
FUNCTION 2 符号表 FUNCTION 1 符号表
局部 符号表区
6.3 符号表的结构设计
【例6.1】有下列函数过程:
FUNCTION exp(x:REAL;VAR y:INTEGER):REAL;
CONST pai=3.14;
TYPE arr=ARRAY[1..5,1..10] OF
INTEGER;
VAR a:arr; b,a:real;
E⑴ND;需要进BE符GI号N 表…的标; 识a[符2,:5]:=100; b:=z+6;… exp(函数,附带信息:类型、参数情况和入口地址
…pa)i,(常量),arr(类型),a(下标变量),b(简单变量),
路漫漫其修远兮, 吾将上下而求索
6.3.2 类型表(TAPEL)
※ 结构:
TVAL
TPOINT
•TVAL(类码)– 类型代码: i(整型),r(实型),c(字符型),b(布尔型),
a(数组型),d(结构型),…
•TPOINT(指针) – 根据数据类型不同,指向不同的 信息表项:
① 基本数据类型(i,r,c,b)– nul(空指针);
② 数组类型(a) – 指向数组表;
③ 结构类型(d) – 指向结构表;…
路漫漫其修远兮, 吾将上下而求索
6.3.3 数组表(AINFL)
※ 结构:
LOW
UP
每维占表中一个纪录
CTP
CLEN
• LOW(数组的下界)--(C语言自动设为:0); • UP(数组的上界)— • CTP(成分类型指针) – 指针,指向该维数组成分类 型(在类型表中的信息);
❖⑶ 种类 -- 该标识符在源程序中的语义角色;
❖⑷ 地址 -- 与值单元相关的一些信息;
符号表 的功能
① 定义和重定义检查; ② 类型匹配校验;
③ 数据的越界和溢出检查;
④ 值单元存储分配信息;
路漫漫其修远兮, 吾将上下而求索
⑤ 函数、过程的参数传递与校验; …
6.2 符号表的组织与管理
6.2.1 符号表的工作原理
⑵…怎样检查出:a 重定义、z 无定义以及下表变量
a[2,5]的值地址在何处?…
路漫漫其修远兮, 吾将上下而求索
※ 符号表的体系结构设计
由于标识符的种类不同,导致语义属性也不尽相同; 怎样组织符号表?下面提供一个符号表的体系结构:
token i·
SYNBL(符号表)
NAME TYPE CAT ADDR
路漫漫其修远兮, 吾将上下而求索
6.3.6 其他表(…)
⑴ 常量表(CONSL)-- 存放相应常量的初值; ※ 结构:
⑵ 长度表(LENL) – 存放相应数据类型所占值单元 个数;※ 结构:
⑶ 活动纪录表(VALL) – 一个函数(或过程)虚拟 的值单元存储分配表;此分配表在运行调用时才可 用,故称活动纪录。
•NEME(名字)— 标识符源码(或内部码) •TYP(类型) – 指针,指向类型表相应项; •CAT(种类) – 种类编码:
f(函数),c(常量),t(类型),d(域名), v,vn,vf(变量,换名形参,赋值形参); •ADDR(地址) – 指针,根据标识符的种类不同,分 别指向:PFINFL,CONSL,LENL,VALL,…
⑴ 遇 定义性标识符(在说明中)--- 把语义信 息填入表中,并修改其TOKEN的指针,使其指向相 应的表项:(i , ) 该标识符符号表项
⑵ 遇 应用性标识符(在语句中)--- 查符号表 的相应项,查到后修改其TOKEN的指针,使其指向 相应的表项:(i , ) 该标识符符号表项
6.2.2 符号表的查询、访问方式
LEVEL OFF FN ENTRY PARAM …
• LEVEL(层次号) –该过函静态层次嵌套号, • OFF(区距) –该过函自身数据区起始单元相对该 过函值区区头位置 ; • FN(参数个数) – 该过函的形式参数的个数; • PARAM(参数表) – 指针,指向形参表; • ENTRY(入口地址) – 该函数目标程序首地址(运 行时填写);