编译原理 第八章——符号表
编译原理:第八章 符号表
合肥工业大学 计算机与信息学院软件所
表 0.1 符号名表 SNT NAME INFORMATION M 形式参数,整 型,值参数 N 形式参数,整 型,值参数 K 整型,变量
表 0.2 常数表 CT 值 (VALUE) (1) 1 (2) 4
表 0.3 入口名表 ENT NAME INFORMATION (1) INCWAP 二目子程序, 入口四元式:1
ax→
数组下限 数组上限 数组元素的体积 数组本身的体积 当元素为数组时,它指向 数组元素类型 数组的下标类型 该元素数组信息在atab表 中的位置,其他情况为0
合肥工业大学 计算机与信息学院软件所
type a=array[1..10, 1..10] of integer;
name kind typ ref
合肥工业大学 计算机与信息学院软件所
PL 语言编译程序的符号表
1. 表格的定义 名字表(nametab) 程序体表(btab) 层次显示表(display) 数组信息表(atab) 中间代码表(code)
合肥工业大学 计算机与信息学院软件所
1) 名字表(nametab) 名字表nametab:登记程序中出现的各种名 字及其属性
lastpar last psize vsize 0 1
bx→
指向本程序体中最后一个形式参在 本程序体所有局部数据所 指向本程序体中最后一个名字在 本程序体所有形参所需体积、包 nametab 中的位置 需空间大小 nametab 中的位置 括连接数据所占空间
编译原理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 符号表
编译原理 第八章符号表
第八章符号表编译过程中编译程序需要不断汇集和反复查证出现在源程序中各种名字的属性和特征等有关信息。
这些信息通常记录在一张或几张符号表中。
符号表的每一项包含两部分,一部分是名字(标识符),另一部分是此名字的有关信息。
每个名字的有关信息一般指种属(如简单变量、数组、过程等)、类型(如整、实、布尔等)等等。
这些信息将使用于语义检查、产生中间代码以及最终生成目标代码等不同阶段。
编译过程中,每当扫描器识别出一个单词后,编译程序就查阅符号表,看它是否已在其中。
如果它是一个新名就将它填进表里。
它的有关信息将在词法分析和语法-语义分析过程中陆续填入。
符号表中所登记的信息在编译的不同阶段都要用到。
在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否相一致)和产生中间代码。
在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。
对于一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。
因为每遍所关心的信息各有差异。
本章重点:符号表的一般组织和使用方法。
第一节符号表的组织和使用信息栏通常包含许多子栏和标志位,用来记录相应名字的种种不同属性。
由于查填符号表一般都是通过匹配名字来实现的,因此,名字栏也称主栏。
主栏的内容称为关键字(key word)。
虽然原则上说,使用一张统一的符号表也就够了,但是,许多编译程序按名字的不同种属分别使用许多符号表,如常数表、变量名表、过程名表等等。
这是因为,不同种属名字的相应信息往往不同,并且信息栏的长度也各有差异的缘故。
因而,按不同种属建立不同的符号表在处理上常常是比较方便的。
对于编译程序的符号表来说,它所涉及的基本操作大致可归纳为五类:1、对给定名字,确定此名是否在有中;2、填入新名;3、对给定名字,访问它的有关信息;4、对给字名字,填写或更新它的某些信息;5、删除一个或一组无用的项。
不同种类的表格所涉及的操作往往也是不同的。
上述五方面只是一些基本的共同操作。
编译原理符号表的作用
编译原理符号表的作用介绍编译原理中的符号表是一个重要的数据结构,用于存储程序中的标识符及其相关信息。
标识符可以是变量、常量、函数名等,在编译过程中需要进行词法和语义分析,符号表提供了一个地方来管理这些标识符,并为编译器的其他模块提供必要的信息。
作用符号表在编译过程中起着关键作用,它具有以下几个主要作用。
1. 标识符的声明符号表记录了程序中所有标识符的声明情况,包括标识符的类型、作用域等信息。
对于变量,符号表可以记录其数据类型和内存地址;对于函数,符号表可以记录其参数列表、返回值类型等。
编译器可以通过符号表查找标识符的声明信息,并根据需要进行语义检查和代码优化。
2. 标识符的引用和解析编译过程中,标识符可能会被多次引用,符号表用于解析标识符的引用。
编译器可以根据符号表中的信息确定标识符的类型、作用域等,从而进行语义检查和类型推导。
如果编译器在符号表中找不到对应的标识符,就会报错或警告,提示可能存在的错误。
3. 作用域管理符号表还可以用于管理标识符的作用域。
在程序中,不同的代码块可能定义了相同名称的标识符,符号表可以通过作用域信息来区分这些标识符。
当编译器遇到一个标识符时,它可以在符号表中查找该标识符的作用域,并根据作用域规则来解析标识符的含义。
4. 错误检测和提示符号表还可以用于错误检测和提示。
编译器可以通过符号表判断标识符是否已经定义或声明,以及是否满足相应的语义规则。
如果标识符在符号表中已经存在多个定义,编译器可以发现这种错误,并给出相应的错误提示信息。
符号表的组织结构为了高效地实现符号表的作用,通常采用哈希表或树形结构来组织符号表。
下面是一些常见的符号表组织结构。
1. 线性表符号表可以使用线性表结构进行组织,例如数组、链表等。
线性表结构简单直观,适用于较小规模的符号表。
但对于大规模的符号表,线性表的查找效率较低。
2. 哈希表哈希表是一种基于键值对存储的数据结构,可以快速地查找和插入数据。
符号表中的标识符可以作为哈希表的键,对应的信息可以作为值进行存储。
编译原理 符号表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章 符号表与错误处理
编译原理符号表
编译原理符号表符号表是编译器中一个非常重要的数据结构,用于存储程序中的标识符(如变量、函数名等)和对应的属性信息(如数据类型、作用域等)。
在编译器的各个阶段,都需要使用符号表来进行词法分析、语法分析、语义分析等操作,因此符号表设计的好坏直接影响到编译器的质量和效率。
一般来讲,符号表可以被看作是一个以标识符为键、以属性信息为值的映射表。
在编译器的词法分析阶段,源代码中的每个标识符都会被扫描并加入符号表中,同时为每个标识符生成一个唯一的“id”(也称为“符号表条目”)作为在后续处理中访问符号表的索引。
在编译器的语法分析和语义分析阶段,编译器会利用符号表进行语法分析和语义检查。
例如,在语法分析阶段,编译器需要判断变量是否被正确声明和使用,因此需要在符号表中查找变量的属性信息;而在语义分析阶段,编译器需要对表达式进行类型检查或者函数调用进行参数匹配,因此也需要在符号表中查找相关的属性信息。
需要注意的是,符号表的实现需要考虑到标识符的作用域、重复定义、名称空间等问题。
一般来说,编译器需要支持不同作用域之间的变量共存和访问,因此需要为不同的作用域维护不同的符号表。
当在一个新作用域中遇到相同的标识符时,编译器应该创建新的符号表条目;而在同一作用域中出现重复定义时,编译器应该抛出错误信息。
同样需要注意的是,符号表的实现也需要考虑到数据结构的效率和空间占用。
一些常用的实现方式包括基于哈希表的实现、基于树的实现(如平衡树、二叉查找树等)等。
在编译器优化阶段,符号表的实现也会影响编译器生成的目标代码的质量和效率。
例如,在常量表达式优化中,编译器使用符号表来维护常量的值和类型信息,从而可以直接进行常量表达式的求值,而不必在运行时才计算。
总的来说,在编译器中,符号表是一个极其重要的数据结构,对于编译器的性能和代码质量有着重要的影响。
因此,在设计和实现编译器时,需要认真考虑符号表的性能和可扩展性,并且根据具体的编程语言特性进行相应的优化。
第08章 符号表
7
概括地说,符号表的每一项 (或称入口) 包含 两大栏(或称区段、字域),即名字栏 信息栏 名字栏和信息栏 名字栏 信息栏。 表格的形式如下:
信息栏 (INFORMATION)
名字栏(NAME) 第1项(入口1) 第2项(入口2)
…
第(入口n)
8
信息栏包含许多子栏和标志位,记录相应 名字的种种不同属性。由于查填符号表一般是 通过匹配名字来实现的,故名字栏也称主栏 主栏, 主栏 其内容称为关键字 关键字(keyword) 。 关键字 符号表中每一项都是关于名字的说明。因 为所保存的关于名字的信息取决于名字的用途, 所以各表项的格式不一定统一,为使表中的每 个记录格式统一,可采用指针技术,在记录中 设置指针,把某些信息放在表的外边,用指针 指向存放另外信息的空间。
22
INCWAP(M, PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR K:INTEGER; BEGIN START: K:=M+1; M:=N+4; N:=K; 表 0.2 常数表 CT END. 值 (VALUE) (1) 1 (2) 4
23
INCWAP(M, PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR K:INTEGER; BEGIN START: K:=M+1; M:=N+4; N:=K; 表 0.3 入口名表 ENT END.
表 0.4 标号表 LT NAME INFORMATION (1)START 四元式:(4)
26
INCWAP(M, PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR K:INTEGER; 表 0.5 四元式表 QT BEGIN START: OPR OPN1 OPN2 RESULT K:=M+1; (1) link M:=N+4; N:=K; (2) par INCWAP 1 M END. (3) par INCWAP 2 N (4) + M 1 K (5) + N 4 M (6) := K N (7) return
编译原理符号表的原理及典型实例
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 语句判断是否要删除此符号及其信息。
编译原理第八章 符号表
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)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希
难
表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识
编译原理符号表的原理及典型实例
第二种组织法:单一组织 优点:管理一致,集中单一 缺点:管理复杂
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
第三种组织法:折中方法
四、符号表的数据结构
线性表——符号表项按照符号被扫描到的先 后顺序登录
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
四、符号表的数据结构
有序表——符号表项按照符号的字符代码串 的值的大小排列
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
第一种组织法:按属性分类 优点:管理一致,空间效率高 缺点:管理复杂
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
B1的符号表
B2的符号表
b
aB3的Biblioteka 号表b二、符号表的内容
标识符的名字 与标识符有关的信息 类型信息(包括种类和属性) 地址码 层次信息 行号信息 ……
二、符号表的内容 例:Pascal语言的名字信息表nametab
name kind lev typ normal ref adr/val/size link
0 1 tx→
指向同一程序体中定义的上一个名字 名字所在的程序体的静态层次。规 adr, 当名字为变量名时(包括形参,存入该变量(或形参)在相应活动记录 一个布尔量,用于标明名字是否为变量形参 当名字为数组类型或数组变量名时,ref指向该数组在数 名字的类型,类型有整型(ints)、字符型 名字种类,可以是常量 名字标识符 在nametab中的位置,每个程序体在 中分类的存贮单元的相对地址;对于过程名,填入他们相应代码的入口地 定主程序的层次为1,主程序中定 名,当名字是否为变量形参名时填入false, 组信息表中的位置;当名字为过程名时,ref指向该过程 (chars)、布尔型(bool)、数组(arrays),对 址(constant)、变量(variable)、 nametab中登记的第一个名字的link 义的层次为2,依次类推 val, 当名字为变量名时,填入他们的相应值 其他情况填入true或不填 在程序体表(btab)中的位置;其他情况ref为0 于无类型的名字填入notype 为0 类型(type)、过程(procedure) size, 当名字为类型名时,填入该类型数据所需存贮单元的数目
编译原理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. 属性信息:在符号表中,每个标识符都有相应的属性信息,包括类型、作用域、地址等。
这些信息可以在后续阶段中被使用。
五、总结在编译过程中,符号表是一个非常重要的数据结构。
它可以存储程序中出现的各种标识符及其属性信息,并在后续阶段中被使用。
符号表通常由一个哈希表和多个链表组成,其中哈希表用于快速查找标识符,链表用于存储每个作用域中出现的所有标识符及其属性信息。
通过对符号表的实现和使用,编译器可以更加准确地将源代码转换为目标代码。
编译原理 第八章——符号表
Program B1(input,output); const a=10; var b,c:integer;
NAM E
TOP→7
INFOR PREVIOU MATION S …… …… …… …… …… …… …… …… 7 0 5 4 3 2
e:real; Program B2(); var f:int; ……
…… f B2 e c b a
6 5 4 3 2 1 SP→
6 1
DISPLAY
线性查找、二叉树和杂凑技术
1.线性表 每一项按先来者先填。查找时从表的第一项开始 顺序查找。 要填进新名字时,先查找表格,已在表中则不填, 报重名错;若不在表中,填进AVAILABLE所在位 置,AVAILABLE指向下一空白项。 一张含n项的线性表,查找其中某项,平均做n/2 次比较。 自适应线性表,添加指示器,将所有项按“最新 最近”访问原则连成一条链。
符号表的组织与作用
一张符号表的每一项(入口)包含两大栏(区域、字段): 名字栏和信息栏。 名字栏称主栏,主栏的内容称为关键字,一般不允许重名。
名字栏 (NAME)
第1项(入口1) 第2项(入口2)
信息栏 (INFORMATION)
……
第n项(入口n)
符号表的组织方式
1.各项各栏所占存储单元 的长度都是固定的,每栏 的内容可直接填写在有关 区段。
3.杂凑技术 构造地址函数H。对任何名字SYM, H(SYM)取值0~N-1之间,从H(SYM)获得 SYM在表中的位置。 如:可取N为质数, H(SYM)定义为SYM/N 的余数。 如何解决“地址冲突”? 可使用一张杂凑(链)表将所有相同杂凑 值的符号名连成一串过程相联系。 <名字,过程编号> FORTRAN的符号表组织 将局部名登记在表格区的一端,全局名登记在表格区的另 一端。 Pascal的符号表组织 ——将其符号表设计为栈符号表,当新的名字出现总是从 栈顶填入。 ——引入一个显示(DISPLAY)层次关系表,称为过程的 嵌套层次表。其作用是为了描述过程的嵌套层次,指出当 前正在活动着的各嵌套的过程(或函数)相应的子符号表 在栈符号表中的起始位置(相对地址)。 ——在符号表的信息栏中引入一个指针域(previous)用 以链接它在同一过程内的前一域名字在表中的下标(相对 位置)。
编译原理ch8 符号表
当 ref名指字向为该数▪存▪过av组a储d名 (程名vlr,类,单a在字当字当r型元程i名名种a标名(或的序b字字类数识相o字l体为e为o组对,表)符的变变l、一变)地(、可量b量类名次类量址t个名a名指n中数以型名b;字为型a布时时)向登组是时中m对,所 1(,(尔t包,的,于同记e(常y类填a在t括p量r位过ar主一 的e量入e型r的形fb置程,a指)他程程 第(中、参y有;c名程向们用so序序 一,的其过,整该)序的n,于存他中填体 个位数s程型相体入对标t情入组定中 名a置应((的该p况n他i于明在n值义定 字,rt变r静们ot数)e无名s、的义 的量f每c相组为)态e类字、变(层的l应个信或0di层n型是字u代量形息次上程k次r码的否符为参表e为一序)。的中)名为型0在2个体入的规,相字变(名口c在位应定依h填量地置字n活a主次址入形a;r动在sm程类当n)参记、eo名序推录t名ta布字y中的bp为尔分e层过类型程的名时,
13 B4
0
procedure B3(y:real)
12 h
13
const b=5;
11 b
12
var h:boolean;
10 y
11
procedure B4(z:integer) var i: char;
9 B3
0
begin…
8g
9
if e<0 then B3(f);
7f
8
… end; begin …
变量、数组和语句函 数名的作用范围就是 他们所处的程序段
把局部名和全局名分 指针1→ 别存在不同的地方
一遍扫描时,当一段 程序处理完后,其局 指针2→ 部名不需再保留.
局部名表
...
编译原理符号表和词法分析
扫描源程序
识别单词
转换成属性字
六、词法分析(续一)
词法分析的两种处理结构
字符
单词
源程序
词法分析
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
编译原理课件-符号表
關鍵字域的組織
符號表的關鍵字域(段)就是符號名稱 等長關鍵字域(段)符號表 不等長關鍵字段符號表---採用關鍵字池的 索引結構。
作用域檢查 作用域和可見性
基本作用域規則(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 符號表
.符號表的作用和地位 .符號的主要屬性及作用 .符號表的組織
符號表的作用和地位-----語義檢查的依據
目標代碼生成階段地址分配的依據
在編譯程式中符號表用來存放語言程式中出現的有 關識別字的屬性資訊,符號表中所登記的資訊在 編譯的不同階段都要用到。
在語義分析中,符號表所登記的內容將用於語義檢 查(如檢查一個名字的使用和原先的說明是否一 致)和產生中間代碼。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.用间接方式安排名字栏。
NAME • •
INFORMATION
6 S A M P L E 4 L O O P
•对信息栏也可做类似处理,把一些共同属性直接登记在符 号表信息栏,而把特殊属性登记在别的地方。
整理与查找
一张符号表的每一项(入口)包含两大栏(区域、字段): 名字栏和信息栏。 名字栏称主栏,主栏的内容称为关键字,一般不允许重名。
名字栏 (NAME)
第1项(入口1) 第2项(入口2)
信息栏 (INFORMATION)
……
第n项(入口n)
符号表的组织方式
1.各项各栏所占存储单元 的长度都是固定的,每栏 的内容可直接填写在有关 区段。
2.对折查找与二叉树 将表格中项按名字“大小”顺序排列。 “名字大小”指名字的内码二进值。 对折查找一项最多只需1+log2N次比较。 将符号表组织成一棵二叉树。每项是一个 结点,结点主栏的内码值视为该结点的值。 任何结点P的右枝(RIGHT)的所有结点值小 于P的值,而左枝(LEFT)的值均大于P的值。
3.杂凑技术 构造地址函数H。对任何名字SYM, H(SYM)取值0~N-1之间,从H(SYM)获得 SYM在表中的位置。 如:可取N为质数, H(SYM)定义为SYM/N 的余数。 如何解决“地址冲突”? 可使用一张杂凑(链)表将所有相同杂凑 值的符号名连成一串。
名字的作用范围
名字的作用范围和它所处的那个过程相联系。 <名字,过程编号> FORTRAN的符号表组织 将局部名登记在表格区的一端,全局名登记在表格区的另 一端。 Pascal的符号表组织 ——将其符号表设计为栈符号表,当新的名字出现总是从 栈顶填入。 ——引入一个显示(DISPLAY)层次关系表,称为过程的 嵌套层次表。其作用是为了描述过程的嵌套层次,指出当 前正在活动着的各嵌套的过程(或函数)相应的子符号表 在栈符号表中的起始位置(相对地址)。 ——在符号表的信息栏中引入一个指针域(previous)用 以链接它在同一过程内的前一域名字在表中的下标(相对 位置)。线性查Fra bibliotek、二叉树和杂凑技术
1.线性表 每一项按先来者先填。查找时从表的第一项开始 顺序查找。 要填进新名字时,先查找表格,已在表中则不填, 报重名错;若不在表中,填进AVAILABLE所在位 置,AVAILABLE指向下一空白项。 一张含n项的线性表,查找其中某项,平均做n/2 次比较。 自适应线性表,添加指示器,将所有项按“最新 最近”访问原则连成一条链。
第八章 符号表
符号表用来存放语言程序中出现的有关标识符的 属性信息。 符号表每一项包含两部分:名字(标识符),此 名字的有关信息 种属:简单变量,数组,过程……
类型:整,实,布尔……
符号表的功能: 1.收集符号属性。 2.上下文语义的合法性检查的依据。 3.作为目标代码生成阶段地址分配的依据。
符号表的组织与作用
Program B1(input,output); const a=10; var b,c:integer;
NAM E
TOP→7
INFOR PREVIOU MATION S …… …… …… …… …… …… …… …… 7 0 5 4 3 2
e:real; Program B2(); var f:int; ……
…… f B2 e c b a
6 5 4 3 2 1 SP→
6 1
DISPLAY