编译原理符号表的原理及典型实例
编译原理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 语句判断是否要删除此符号及其信息。
- 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