编译原理符号表的原理及典型实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
四、符号表的数据结构
有序表——符号表项按照符号的字符代码串 的值的大小排列
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………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, 当名字为类型名时,填入该类型数据所需存贮单元的数目
二、符号表的内容 例:Pascal语言的名字信息表nametab type a=array[1..10, 1..10] of integer;
name kind typ ref
nametab
k tx→
a
type arrays
n
二、符号表的内容 例:Pascal语言的数组信息表atab
inxtyp eltyp elref low high elsize size 1 2
a
type arrays
n
inxtyp eltyp elref low high elsize size n m ax→atabints i源自tsarrays ints
m 0
1 1
10 10
10 1
100 10
三、符号表的组织
按照属性种类完全相同的那些符号组织 在一起; 把所有语言中的符号都组织在一张符号 表中; 根据符号属性相似程度分类组织成若干 张表,每张表中记录的符号都有比较多 的相同属性。
四、符号表的数据结构
散列表——符号表项的位置由对该符号进行 某种函数操作所得到的函数值来确定
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
五、符号表与作用域
int main() { int a=0; int b=0; { int b=1; { int a=2; B2 printf(“%d,%d\n”,a,b); } B1 { int b=3; B0 printf(“%d,%d\n”,a,b); B3 } printf(“%d,%d\n”,a,b); } printf(“%d,%d\n”,a,b); }
B1的符号表
B2的符号表
b
a
B3的符号表
b
B0的符号表
NULL a
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); } printf(“%d,%d\n”,a,b); }
编译原理
第九章
符号表
第九章
符号表
在编译程序工作的过程中,需要不断收集、 记录和使用源程序中一些语法符号的类 型和特征等相关信息。这些信息一般以 表格形式存储于系统中。如常数表、变 量名表、数组名表、过程名表、标号表 等等,统称为符号表。 对于符号表组织、构造和管理方法的好 坏会直接影响编译系统的运行效率。
ax→
数组下限 数组本身的体积 数组上限 数组元素的体积 当元素为数组时,它指向 数组元素类型 数组的下标类型 该元素数组信息在atab表 中的位置,其他情况为0
type a=array[1..10, 1..10] of integer;
name kind typ ref
nametab
k tx→
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
第一种组织法:按属性分类 优点:管理一致,空间效率高 缺点:管理复杂
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
第二种组织法:单一组织 优点:管理一致,集中单一 缺点:管理复杂
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
第三种组织法:折中方法
四、符号表的数据结构
线性表——符号表项按照符号被扫描到的先 后顺序登录
一、符号表的作用和功能
收集符号属性
上下文语义的合法性检查的依据
作为目标代码生成阶段地址分配的依据 例:C语言程序段:int a; a=1; MOV #1,R0 MOV R0,mema
词法分析:a是一个单词; 语法分析:a出现在一条变量声明语句和一条赋 值语句中; 语义分析:a是一个整形变量,并分配地址。
四、符号表的数据结构
有序表——符号表项按照符号的字符代码串 的值的大小排列
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………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, 当名字为类型名时,填入该类型数据所需存贮单元的数目
二、符号表的内容 例:Pascal语言的名字信息表nametab type a=array[1..10, 1..10] of integer;
name kind typ ref
nametab
k tx→
a
type arrays
n
二、符号表的内容 例:Pascal语言的数组信息表atab
inxtyp eltyp elref low high elsize size 1 2
a
type arrays
n
inxtyp eltyp elref low high elsize size n m ax→atabints i源自tsarrays ints
m 0
1 1
10 10
10 1
100 10
三、符号表的组织
按照属性种类完全相同的那些符号组织 在一起; 把所有语言中的符号都组织在一张符号 表中; 根据符号属性相似程度分类组织成若干 张表,每张表中记录的符号都有比较多 的相同属性。
四、符号表的数据结构
散列表——符号表项的位置由对该符号进行 某种函数操作所得到的函数值来确定
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
五、符号表与作用域
int main() { int a=0; int b=0; { int b=1; { int a=2; B2 printf(“%d,%d\n”,a,b); } B1 { int b=3; B0 printf(“%d,%d\n”,a,b); B3 } printf(“%d,%d\n”,a,b); } printf(“%d,%d\n”,a,b); }
B1的符号表
B2的符号表
b
a
B3的符号表
b
B0的符号表
NULL a
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); } printf(“%d,%d\n”,a,b); }
编译原理
第九章
符号表
第九章
符号表
在编译程序工作的过程中,需要不断收集、 记录和使用源程序中一些语法符号的类 型和特征等相关信息。这些信息一般以 表格形式存储于系统中。如常数表、变 量名表、数组名表、过程名表、标号表 等等,统称为符号表。 对于符号表组织、构造和管理方法的好 坏会直接影响编译系统的运行效率。
ax→
数组下限 数组本身的体积 数组上限 数组元素的体积 当元素为数组时,它指向 数组元素类型 数组的下标类型 该元素数组信息在atab表 中的位置,其他情况为0
type a=array[1..10, 1..10] of integer;
name kind typ ref
nametab
k tx→
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
第一种组织法:按属性分类 优点:管理一致,空间效率高 缺点:管理复杂
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
第二种组织法:单一组织 优点:管理一致,集中单一 缺点:管理复杂
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 第二类符号 第三类符号 属性1 属性1 属性2 属性2 属性2 属性5 属性3 属性4 属性6
第三种组织法:折中方法
四、符号表的数据结构
线性表——符号表项按照符号被扫描到的先 后顺序登录
一、符号表的作用和功能
收集符号属性
上下文语义的合法性检查的依据
作为目标代码生成阶段地址分配的依据 例:C语言程序段:int a; a=1; MOV #1,R0 MOV R0,mema
词法分析:a是一个单词; 语法分析:a出现在一条变量声明语句和一条赋 值语句中; 语义分析:a是一个整形变量,并分配地址。