编译原理符号表的原理及典型实例
编译原理chapter8符号表(2016)分析
...
...
...
n1
available
SYM1
...
n2 SYM2
available
...
n3 SYM3
...
NULL
...
...
n1
...
...
...
n...2
编译原理
8.3 名字的作用范围
chapter8 符号表
最近嵌套作用域规则:即对每个过程指定一个唯一的 编号,以便跟踪过程里的局部名字。
(1)对给定名字,查询此名是否已在表中; (2)往表中填入一个新名字; (3)对给定名字,访问它的相关信息; (4)对给定名字,往表中填写或更新它的某些信息; (5)从表中删除一个或一组名字。
编译原理
chapter8 符号表
符号表的组织方式NAME
INFORMATION
1、各项各栏所占•存储单元的长度固定 2、间接方式安排•名字栏
(2)若要查找的项小于中项,则继续在1〜[n/2]的各项 中去查找。
(3)若要查找的项大于中项,则就到[n/2]+2〜n的各项 中去查找。
平均查找次数 1+log2n
编译原理
chapter8 符号表
二叉树的形成过程如下:
令第一个碰到的名字作为“根”结点,它的左、右 指示器均置为空,当要加入新结点时,首先把它和根 结点的值作比较,小者放在右枝上,大者放在左枝上。 如果根结点的左(右) 枝已成子树,则让新结点和子 树的根再作比较。重复上述步 骤,直至把新结点插入 使它成为二叉树的一个端末结点(叶)为止。
让链头指向最新项,含有这种链条的线性表叫做自适应线性表。
编译原理
二、对折查找与二叉树
chapter8 符号表
编译原理符号表的应用
编译原理符号表的应用1. 什么是编译原理符号表编译原理中的符号表是一种数据结构,用于记录程序中各个符号的相关信息,包括变量名、函数名、常量等。
在编译过程中,符号表起着重要的作用,可以进行词法分析、语法分析和语义分析等过程中的变量和函数的命名检查、重名检查以及类型检查等功能。
2. 符号表的组织结构符号表可以采用不同的组织结构,最常见的有线性表、散列表和树等。
下面列举了几种常见的符号表组织结构:•线性表:符号表可以通过数组或链表等数据结构来表示。
•散列表:采用散列函数对符号进行映射,能够快速地查找符号。
•树:符号表可以用二叉搜索树、AVL树或红黑树等数据结构来表示,支持快速的查找、插入和删除操作。
3. 符号表在编译过程中的应用符号表在编译过程中扮演着重要的角色,下面介绍了符号表在不同阶段的应用:3.1 词法分析阶段在词法分析阶段,编译器通过符号表来记录程序中出现的各个标识符的信息,包括变量名、函数名和常量等。
符号表可以用来进行标识符的重名检查,以及维护标识符的属性信息,比如变量的类型、作用域和内存地址等。
3.2 语法分析阶段在语法分析阶段,编译器需要判断语法是否正确,并生成语法树。
符号表在此阶段可以用来进行各种类型的语法检查,比如检查函数参数的类型、检查类型转换的合法性等。
符号表还可以用来维护函数的参数表和局部变量表等信息。
3.3 语义分析阶段在语义分析阶段,编译器需要对代码进行语义检查,包括类型检查、作用域检查等。
符号表是进行这些检查的重要依据,通过符号表可以判断变量是否被定义、变量的作用域和类型是否匹配等。
3.4 中间代码生成阶段在中间代码生成阶段,编译器需要将源代码转换成中间代码,符号表可以用来生成中间表示时的参考依据。
符号表可以用来维护中间变量的属性信息,并生成中间代码时进行类型转换的判断。
3.5 代码优化和目标代码生成阶段在代码优化和目标代码生成阶段,符号表可以用来进行变量的寄存器分配和内存分配等操作。
编译原理 符号表6
第8章 符号表与错误处理 例8.1 一示意性源程序如下: PROGRAM PP (input,output); COUNT norw=13;
VAR ll,kk:integer; word:ARRAY[1..norw] OF char;
PROCEDURE getsym; VAR i,j: integer; PROCEDURE getch; BEGIN END; {getch} BEGIN
第8章 符号表与错误处理
这样,在从左至右扫描源程序时就可以按分程序在源 程序中的这种自然顺序(静态层次),对出现在各个分程 序中的标识符进行处理,具体方法如下: (1) 当在一个分程序首部某说明中扫描到一个标识符时 ,就以此标识符查找相应于本层分程序的符号表,如果 符号表中已有此名字的登记项,则表明此标识符 已被 重复说明(定义),应按语法错误进行处理;否则,应在 符号表中新登记一项,并将此标识符及有关信息 (种属、类型、所分配的内存单元地址等)填入。
第8章 符号表与错误处理
j:=1; kk:=i+j END; {getsym} BEGIN END.{pp}
第8章 符号表与错误处理
当编译程序扫描上述源程序时,生成栈式符号表, 试就此符号表回答以下问题:
画出“扫描到getsym过程体之前”的栈符号表; 画出“扫描完getsym过程说明(即扫描完END; {getsym})”时的栈符号表。 [解答] 假定所有的名字在数据区中都只需要一个 单元。 “扫描到getsym过程体之前”的栈符号表如图8- 5 所示。 “扫描完getsym过程说明”时的栈符号表如图8- 6 所示。
度固定的表格易于组织、填写或查找, 因而是最简单的一 种符号表组织方式,
第8章 符号表与错误处理
编译原理课件-符号表
在引用聲明過的識別字時進行
修改表項
在獲得新的語義值資訊時進行
刪除一個或一組無用的項 釋放符號表的空間
在編譯結束前或退出一個分程式
符號表的組織
總體組織和表項屬性資訊組織 第一種: 把屬性種類完全相同的那些符號組織
在一起,構造出多個符號表,常數表、變數名 表、過程名表,標號表 第二種: 把所有語言中的符號都組織在一張符 號表中。組成一張包括了所有屬性的龐大的符 號表 第三種:。。。
上下文語義的合法性檢查的依據
在語義分析中,符號表所登記的內容將用於語義檢查(如檢查一 個名字的使用和原先的說明是否一致)和產生中間代碼。
目標代碼生成階段地址分配的依據
在目標代碼生成階段,當對符號名進行地址分配時,符號表是地 址分配的依據。對一個多遍掃描的編譯程序,不同遍所用的符號 表也往往各有不同。因為每遍所關心的資訊各有差異。
符號表項的排列
符號表作為一個多元組,表中元組的排列組織 是構造符號表的重要成分。在編譯程式的整個工 作過程中,符號表被頻繁地用來建立表項,查找 表項,填充和引用表項的屬性。因此表項的排列 組織對該系統運行的效率起著十分重要的作用。 在編譯程式中,符號表項的組織傳統上採用三種 構造方法。即線性法,二分法及散列法。
根源程式
詞法分析器
單詞符號
符
語法分析器
出
號
語法單位
錯
表
語義分析與中間代碼生成器
管
中間代碼
處
理
代碼優化
中間代碼
理
目標代碼生成器
目標代碼
符號表
符號表是一種數據結構,用來保存根源程 式語言中的各種資訊,如記錄名字的作用 域以及綁定資訊。
在編譯過程不斷彙集和查證出現在根源程 式中的各種單詞的語義屬性特徵資訊。
《编译原理符号表》PPT课件
精选课件ppt
26
符号表的总体组织
属性3栏与属性4栏冗余,可将其合并;
增加了符号表管理和运行的复杂性,但减少了空间开销;
精选课件ppt
27
符号表的总体组织
总结:
为便于符号表的组织管理,每张符号表的表长通常为定 长是合理的;
每张符号表可以看作是一个多元组,每个元组由若干属 性组成,元组之间有相同的成员个数和一致的排列;
下推链域的组织
精选课件ppt
40
等长属性值域组织
可以取相应的数据类型表达属性值
符号布尔性质的属性域
defined 1(true) 表示已定义
defined 0(false) 表示未定义
表示符号的基本数据类型
Data-type 3个bit位(整型值)
Char
0 0 0 (0)
short
散列组织
对符号进行某种函数操作(杂凑函数)所得的函数值确 定它在符号表的位置;
Vhash = fhash(符号代码值)
改进:Lhash = mod(Vhash,N) ……….. …a…… ……..b.. …..a….. ……..d.. …c……. ……b….
精选课件ppt
33
符号表项的排列
▪ 函数外表示文件可视性,函数内表示所在函数可视;
动态存储区:生命周期是定义该变量的局部范围;
精选课件ppt
15
标识符符号的属性(信息)
具体位置:
按该变量在存储区类分别依出现先后的次序排列下 相对该存储区表头的相对位移量来表示的;
… Int a; …. float b; … Struct cc{
元组之间的区分由表项中“符号”一栏区分;
精选课件ppt
编译原理符号表的原理及典型实例
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 语句判断是否要删除此符号及其信息。
编译原理课件第九章符号表
M=M+4 N=K
RETURN
END
经编译头三阶段后所产生的主要表格有:符号 名表SNT、常数表CT、入口名表ENT、标号 表LT和四元式表QT
符号名表SNT
NAME (1)M (2)N (3)K
INFORMATION 哑元,整数,变量 哑元,整数,变量 整数,变量
在整个编译期间,对于符号表的操作大致可 归纳为五类:
• 对给定名字,查询名字是否已在表中;
• 往表中填入一个新的名字;
• 对给定名字,访问它的某些信息;
• 对给定名字,填写或更新它的某些信息;
• 删除一个或一组无用的项。
不同种类的表格所涉及的操作往往也是不同 的。上述五个方面只是一些基本的共同操 作。
.在符号表的信息栏中引入一个指针域(previous)用以链接它在同一过程内 的前一域名字在表中的下标(相对位置)。每一层的最后一个域名字,其 previous 之 值 为 0 。 这 样 , 每 当 需 要 查 找 一 个 新 名 字 时 , 就 能 通 过 DISPLAY找出当前正在处理的最内层的过程及所有外层的子符号表在栈 符号表中的位置。然后,通过previous可以找到同一过程内的所有被说明 的名字。
常Байду номын сангаас表CT
值(VALUE) (1) 1 (2) 4
入口名表ENT
NAME
INFORMATION
(1)INCWAP 二目子程序,入口QT(1)
/*记录入口名INCWAP的入口地址*/
标号表LT
LABLE INFORMATION
(1)10
QT(4)
/*记录了标号10对应的四元式序列号*/
编译原理第八章 符号表
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. 属性信息:在符号表中,每个标识符都有相应的属性信息,包括类型、作用域、地址等。
这些信息可以在后续阶段中被使用。
五、总结在编译过程中,符号表是一个非常重要的数据结构。
它可以存储程序中出现的各种标识符及其属性信息,并在后续阶段中被使用。
符号表通常由一个哈希表和多个链表组成,其中哈希表用于快速查找标识符,链表用于存储每个作用域中出现的所有标识符及其属性信息。
通过对符号表的实现和使用,编译器可以更加准确地将源代码转换为目标代码。
编译原理实用教程 第10章 符号表和错误处理
(4)数组变量的表示。前面我们已经分析过,数 组的详细信息都登记在内情向量表中。数组符号在 符号表中可以设立一个指向内情向量的指针,而在 内情向量表中登记关于数组维数个数和每一维的元 素个数。 例如,设有两个数组: A1(sub1,sub2) A2(sub1,sub2,sub3,sub4,sub5,sub6) A1为一个二维数组,A2为一个四维数组。 它在符号表中的表示为图10-7所示:
符号表可以在词法分析时创建,也可以在语义分析时创建。 在编译程序中,符号表在词法分析时创建,此时符号表中只 含有标识符的名字,其他属性要在语义分析阶段填入。而变 量在符号表中的位置信息将作为标识符符号的属性出现,构 成词法分析器所产生的单词符号的一部分;语法分析阶段只 检查源程序语法的正确性,一般不使用符号表;语义分析程 序对该编码形式进行语义正确性分析,遇到声明语句时会填 入有关标识符的属性。在 符号表中的标识符的属性信息会在 代码生成阶段用于产生目标代码。因此,直到语义分析和代 码生成阶段,许多与变量有关的属性才能相继填入符号表。
第10章 符号表和错误处理
本章学习目标
为了检查语义的正确性和生成代码,需要知
道源程序中所使用的各种标识符的属性。这 些属性常常由编译程序集中起来并存放在一 个标识符表或符号表中。本章的主要内容有: 符号表的组织和内容 符号表的构造和查找 分程序的结构
10.1符号表的组织和内容
在编译的各个阶段经常要收集和使用出现在源程序 中的各种信息,为了方便,通常把这些信息用一些 表格进行记录、存储和管理,如常量表、数组信息 表、保留字表和标识符表等,这些表统称为符号表。 符号表主要保存各类标识符的属性,它在翻译过程 中有两个方面的重要作用,一是检查语义的正确性, 二是辅助生成代码。也就是说在实现语义检查和代 码生成时,需要不断插入和检索符号表中标识符的 属性来实现。
编译原理符号表和词法分析
扫描源程序
识别单词
转换成属性字
六、词法分析(续一)
词法分析的两种处理结构
字符
单词
源程序
词法分析
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
编译原理第八章符号表
第八章符号表编译过程中编译程序需要不断汇集和反复查证出现在源程序中各种名字的属性和特征等有关信息。
这些信息通常记录在一张或几张符号表中。
符号表的每一项包含两部分,一部分是名字(标识符),另一部分是此名字的有关信息。
每个名字的有关信息一般指种属(如简单变量、数组、过程等)、类型(如整、实、布尔等)等等。
这些信息将使用于语义检查、产生中间代码以及最终生成目标代码等不同阶段。
编译过程中,每当扫描器识别出一个单词后,编译程序就查阅符号表,看它是否已在其中。
如果它是一个新名就将它填进表里。
它的有关信息将在词法分析和语法-语义分析过程中陆续填入。
符号表中所登记的信息在编译的不同阶段都要用到。
在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否相一致)和产生中间代码。
在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。
对于一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。
因为每遍所关心的信息各有差异。
本章重点:符号表的一般组织和使用方法。
第一节符号表的组织和使用信息栏通常包含许多子栏和标志位,用来记录相应名字的种种不同属性。
由于查填符号表一般都是通过匹配名字来实现的,因此,名字栏也称主栏。
主栏的内容称为关键字(key word)。
虽然原则上说,使用一张统一的符号表也就够了,但是,许多编译程序按名字的不同种属分别使用许多符号表,如常数表、变量名表、过程名表等等。
这是因为,不同种属名字的相应信息往往不同,并且信息栏的长度也各有差异的缘故。
因而,按不同种属建立不同的符号表在处理上常常是比较方便的。
对于编译程序的符号表来说,它所涉及的基本操作大致可归纳为五类:1、对给定名字,确定此名是否在有中;2、填入新名;3、对给定名字,访问它的有关信息;4、对给字名字,填写或更新它的某些信息;5、删除一个或一组无用的项。
不同种类的表格所涉及的操作往往也是不同的。
上述五方面只是一些基本的共同操作。
精品课程《编译原理》PPT课件第9章 符号表
RINFL[rp]:
域名部分 区距部分
FTP是域类型部分
一个记录类型要占几个RINFL表项, 不同记录类型所占表项个数不一,而 在表项中没有链接部分,因此在不同 记录的RINFL表之间可放置一条空项, 以表示记录类型的RINFL表中的结束。
综上所述,我们有: TYPEL表 integer: i
real: r b a
临时变量 局部变量 DISPLAY表 形式参数2 形式参数1 过函名 管理信息
l+ 1 5 4 3 0-2
抽象地址的变化规律可图示如下:
实在声明:
(l,off) <标号声明部分> (l,off) (l,off) <常量声明部分> (l,off) (l,off) <类型声明部分> (l,off)
在整个编译阶段都离不开符号表。 二、符号表的内容 0 Pascal 有以下几种类型: 整 型:integer 实 型:real 布尔型:boolean 数组型:ARRAY[N1…N2]OF T 记录型:RECORD id1:T1;…; idn;Tn END
类型表TYPEL结构形如: TCLASS
三、标识符的作用域与处理 程序段:PROGRAM…………………END 过程段:PROCEDURE………………END 函数段: FUNCTION………………END 记录类型: RECORD………………END
具体实现方法可分为两种: 真删除法
加标记法
9.4 抽象地址的处理
存储分配分为静态分配与动态分配。 在编译时分配的称静态分配。 在目标程序运行时分配的称动态分配。
2.若ICLASS.t=1,则IADDR是类型长度 3.若ICLASS.v=1.则IADDR是形如: LEVEL OFF 的抽象地址,其中LEVEL 是层数,OFF是区距部分。
编译原理:第10章 符号表
编译原理仅用于教学第10章 符号表第10章 符号表◆ 符号表的作用 ◆ 符号表的内容 ◆ 符号表的组织 ◆ 栈式符号表学习目标 掌握 符号表的作用 符号表的内容 符号表的组织方法 栈式符号表10.1 概述1.符号表的作用 符号表在整个编译期间的作用主要有两条:一是辅助语义的(即上下文有关的)正确性检查;二是辅助代码生成。
2.符号表的生存期 符号表的建立可以开始于词法分析阶段(有些内容初始建立),也可以放到语法语义分析阶段,但符号表的使用, 有时会延续到目标代码的运行阶段(如运行时刻为了诊断的 需要,数组下标地址计算的需要等)。
10.2 符号表的内容◆ 标识符的名字 ◆ 与标识符有关的信息不同的标识符在符号表中具有不同的信息: ⅰ.数组——信息向量表(内情向量表) ⅱ.记录——域紧接着相应的记录变量名字相继存放 ⅲ.过程或函数——参数的个数、类型、次序、是否允 许递归等10.2 符号表的内容① 类型信息 包括种类(常量、变量、数组、标号、函数或过程等)与属性(整型、实型、字符型、布尔型等)。
② 地址码ⅰ.简单变量/常量——在数据区中的绝对或相对地址 ⅱ.数组——在数据区中的首地址 ⅲ.过程或函数——过程或函数的分程序入口地址 ③ 层次信息——标识符所属分程序(过程)的静态层次 ④ 行号信息——标识符在源程序中的行号(说明行与引用行)110.3 符号表的结构与组织1.符号表的结构 线性符号表、树结构、散列表或桶等。
2.符号表的组织 符号表的条目一般由两部分组成,即名字栏与信息栏。
通常,条目用连续的存储字构成的记录来实现。
为保持符号表条目记录的统一,往往把与名字相关联的构造类型等 信息保存在符号表的某处(如数组的信息向量表等),而把相 应的指针或序号放在记录内。
10.3 符号表的结构与组织3.符号表的操作 大量的查找、填表与删除等操作。
10.4 栈式符号表——PASCAL符号表的设计1.语言的特点PASCAL按照最近嵌套作用域原则,一个名字的作用域 是那个包含了这个名字的说明的最小过程或函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、符号表的内容
标识符的名字 与标识符有关的信息
类型信息(包括种类和属性) 地址码 层次信息 行号信息 ……
精品课件
二、符号表的内容
例:Pascal语言的名字信息表nametab
name kind lev typ normal ref adr/val/size link
0 1 tx→
当组在名信程名字息序▪录地▪av字名(类da中址为表体rlc,,分字型o数中表标当当类n名 (对名名的种(s组的ctt一 名 其识b字字字于h存类ya位t为为贮p,个 他na的无r符名 定 义变变单,et型置bs指在n为当布 情))量量元类类a主字 的可、、或;中n0向m名名的名尔况ae型型时时程所层相同mt以过变数当的布ea,(对字量填,的包序在次一tb是程量组名位填尔地a中括是,入类名程b入址的的为常((变字置形型登中他;否用tpv序型字参层程2量记的rr为a们;对(,,体为于uor有填b的于次序的位存ec名过i其o中相依过变标或ea整入o入第置为体应程时程db他l定该次量明不ul一,型n值)名的1变义,名re情o、,,类个每形名填e)量(t静的填时)r况、iy数(名个主推参字e或入np上态,frte组字程形他程名是指一es层参们序的rf)(序个时)否相e向为、a次在体lfr应名i中相填为该指0字r在n代。应字ak定码入变数向符y活规的s动量f组该型)入a记,口形l在过s参e数程, ▪size, 当名字为类型名时,填入精该品类课件型数据所需存贮单元的数目
二、符号表的内容 例:Pascal语言的名字信息表nametab
type a=array[1..10, 1..10] of
integer;
name kind typ ref
k a type arrays n
nametab
tx→
精品课件
二、符号表的内容
例:Pascal语言的数组信息表atab
inxtyp eltyp elref low high elsize size 1 2
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
精品课件
四、符号表的数据结构
散列表——符号表项的位置由对该符号进行 某种函数操作所得到的函数值来
确定
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
ax→
数组的数下组标元类素型类型当该元元数素素组为数下数组数数限组信组组数时息上元组,在限素本它at的身指ab体的向表积体积 中的位置,其他情况为0
精品课件
type a=array[1..10, 1..10] of
integer;
name kind typ ref
k a type arrays n
根据符号属性相似程度分类组织成若干 张表,每张表中记录的符号都有比较多 的相同属性。
精品课件
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 属性1 属性2 属性3 第二类符号 属性1 属性2 属性4 第三类符号 属性2 属性5 属性6
第一种组织法:按属性分类
优点:管理一致,空间效率高 缺点:管理复杂
}
精品课件
NULL
a b
B0的符号表
B1的符号表
b
int main()
{int a=0;
int b=0;
{ int b=1;
{
int a=2;
printf(“%d,%d\n”,a,b);
}
{ int b=3;
printf(“%d,%d\n”,a,b);
}
printf(“%d,%d\n”,a,b);
编译原理
精品课件
第九章 符号表
精品课件
第九章 符号表
在编译程序工作的过程中,需要不断收集、 记录和使用源程序中一些语法符号的类 型和特征等相关信息。这些信息一般以 表格形式存储于系统中。如常数表、变 量名表、数组名表、过程名表、标号表 等等,统称为符号表。
对于符号表组织、构造和管理方法的好 坏会直接影响编译系统的运行效率。
精品课件
五、符号表与作用域
int main()
{ int a=0;
int b=0;
{ int b=1;
{ int a=2;
B2
printf(“%d,%d\n”,a,b);
}
B0
B1
{
B3
}
int b=3; printf(“%d,%d\n”,a,b);
printf(“%d,%d\n”,a,b);
}
printf(“%d,%d\n”,a,b);
第三种组织法:折中方法
精品课件
四、符号表的数据结构
线性表——符号表项按照符号被扫描到的先 后顺序登录
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
精品课件
四、符号表的数据结构
有序表——符号表项按照符号的字符代码串 的值的大小排列
nametab
tx→
inxtyp eltyp elref low high elsize size
atab
n ints arrays m 1 10 10 100
m ints ints 0 1 10 1 10
ax→
精品课件
三、符号表的组织
按照属性种类完全相同的那些符号组织 在一起;
把所有语言中的符号都组织在一张符号 表中;
精品课件
一、符号表的作用和功能
收集符号属性 上下文语义的合法性检查的依据 作为目标代码生成阶段地址分配的依据
例:C语言程序段:int a; a=1;
MOV #1,R0 MOV R0,mema
词法分析:a是一个单词; 语法分析:a出现在一条变量声明语句和一条赋 值语句中; 语义分析:a是一个整形变量,并分配地址。
}
printf(“%d,%d\n”,a,b);
}
B2的符号表
a
B3的符号表
精品课件
b
精品课件
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 属性1 属性2 属性3 第二类符号 属性1 属性2 属性4 第三类符号 属性2 属性5 属性6
第二种组织法:单一组织 优点:管理一致,集中单一 缺点:管理复杂
精品课件
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 属性1 属性2 属性3 第二类符号 属性1 属性2 属性4 第三类符号 属性2 属性5 属性6