编译原理学习笔记 6.4 分程序结构语言的符号表组织
前言
参考课上PPT内容。 该学习笔记目前仅打算个人使用。
后续会进一步整理,包括添加笔记内容,标明参考资料。
更新中。。。
跳过目录
目录
- 一、分程序的结构语言
- 二、标识符的作用域和基本处理方法
- 作用域
- 基本处理方法
一、分程序的结构语言
模块内可嵌入子模块。
二、标识符的作用域和基本处理方法
作用域
标识符局部于所定义的模块(最小模块)
模块中所定义标识符的作用域是定义该标识符的子程序。
- A为内分程序局部变量:
- A为内分程序局部变量:
A为内分程序全局变量:
都是局部变量:
全局变量与局部变量重名:
过程或函数说明中定义的标识符(包括形参)其作用域为本过程体。
循环语句中定义的标识符,其作用域为该循环语句。
- 不能从循环体外转到循环体内。循环语句应看作一层。
基本处理方法
建查符号表均要遵循标识符作用域规定进行。
- 建表:不能重复,不能遗漏。
- 查表:按标识符作用域查找。
处理方法:
假设标识符是先声明后引用(标号例外,要特殊处理)。
在程序声明部分读到标识符时(声明性出现) 建表:
查本层符号表,有无同名
- 有:重复声明,报错
- 无:填入符号表
在语句中读到标识符(引用性出现),查表:
查本层符号表,有无同名
- 有:即已声明。则取该名字信息(局部量)。
- 无,是否是最外层?
- 是:未声明标识符。报错
- 否:转到直接外层
标准标识符的处理
主要是语言定义的一些标准过程和函数的名字。它们是标识符的子集。
- 如 sin con abs….(注意它们不是语言的保留字)
特点:
- 用户不必声明就可全程使用。
- 设计编译程序时,标准名字及其数目已知。
处理方法:
- 单独建表:使用不便,费时。
- 预先将标准标识符填入名字表中。因为它们是全程量,所以应填入最外层。
分程序符号表的组织方式:
分层组织符号表的登记项
各分程序符号表登记项按照语法识别顺序连续排列在一起,不为其内层分程序的符号表登记项所割裂。
用“分程序表”索引各分程序符号表的信息
分程序表中的各登记项是自左至右扫描源程序的过程中,按分程序出现的顺序依次填入的,且对每一个分程序填写一个登记项。
分程序表登记项序号隐含地表征各分程序的编号。
分程序表结构:
- OUTERN:指明该分程序的直接外层分程序的编号
- ECOUNT:记录该分程序符号表登记项的个数
- POINTER:指向该分程序符号表的起始位置
例:设有如下分程序
PROCEDURE …VAR A, B, C, D: REAL;PROCEDURE …LABEL L1;VAR E, F: REAL;BEGIN…END;PROCEDURE …LABEL L2, L3;VAR G, H: REAL;FUNCTION …VAR A: INTERGER;BEGIN…END;BEGIN…END;BEGIN…END;
嵌套结构:
分程序索引表和符号表:
分程序索引表形成顺序:
- 按每个模块头的出现顺序
分程序符号表形成顺序:
- 按每个模块(语法分析时的语法单位)识别顺序
分程序符号表构造方法:
本例中,分程序符号表的形成顺序为2、4、3、1,这个次序是闭分程序的次序(分程序中END出现的次序)。
为使各分程序的符号表连续地邻接在一起,并在扫描具有嵌套分程序结构的源程序时,总是按先进后出的顺序来扫描其中各个分程序,可设一个临时工作栈。
每当进入一层分程序时,就在栈顶预造该分程序的符号表,而当遇到该层分程序的结束符(END)时,此时该分程序的全部登记项已位于栈顶,再将该分程序的全部登记项移至正式符号表中。
例: Pascal程序的分程序结构示例如下
program main (…);var x, y : real; i, k: integer;name: array [1…16] of char;:procedure m1 (ind: integer);var x : integerprocedure p2 (j : real);:procedure p3;varf : array [1…5] of intrgertest1: boolean;begin:end; {p3}begin:end;{p2}procedure q2;var r1,r2 : real;begin:p2(r1+r2);:end; {q2}begin:p2(x/y);:end;{m1}begin:m1(i+k);:end {main}
栈式符号表结构:
编译P3说明部分后的符号栈状态:
编译q2说明部分后:
当过程和函数体编译完成后,应将与之相应的参数名和局部变量名以及后者的特性信息从符号表中删去。
编译原理学习笔记 6.4 分程序结构语言的符号表组织相关推荐
- 编译原理学习笔记2——高级程序设计语言概述
编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...
- [编译原理学习笔记2-2] 程序语言的语法描述
[编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...
- 编译原理学习笔记20——符号表
编译原理学习笔记20--符号表 20.1 符号表的组织与操作 20.2 符号表的内容 20.3 利用符号表分析名字的作用域 20.1 符号表的组织与操作 符号表 符号表的作用与组织 符号表的整理和查找 ...
- 编译原理学习笔记 5.1 翻译文法和语法制导翻译
前言 参考课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 导言 一.翻译文法和语法制导翻译 输入文法 翻译文法 活动 ...
- 编译原理学习笔记 3.3 正则文法的状态图
前言 参考东南大学廖力老师的编译原理教程和课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 状态图的画法(根据文法画出 ...
- 编译原理学习笔记一(待续)
这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的 ...
- 编译原理学习笔记 6.2 符号表的组织与内容
前言 参考课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 一.符号表的结构与内容 "名字"域 & ...
- 程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言
高级程序设计语言 一.语言概述 1.1 语法 v.s. 语义 程序本质上是一定字符集上的字符串 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序 定义了程序的形式结构 定义语 ...
- 【编译原理学习笔记】1:符号和符号串,文法和语言,文法的类型
符号和符号串 字母表(符号集):元素的非空有穷集合. 符号:字母表中的元素. 符号串:由字母表中的符号组成的任何有穷序列. 头:如符号串z=xy中的x. 尾:如符号串z=xy中的y. 固有头:符号串的 ...
- 【编译原理学习笔记】2:文法与语言描述,二义性,正规文法,左/右句型,句型分析
已知语言描述写出文法 如某种语言中0和1的个数相同,文法可以是这样的: G[A]:A->0B|1CB->1|1A|0BBC->0|0A|1CC 还可以这样: G[S]:S->0 ...
最新文章
- 花了两天,终于把 Python 的 setup.py 给整明白了
- js导出生成PDF插件
- [Objective-c基础教程] chapter one Before You Start chapter two Extensions to C
- 性别从后台获取得值的那点事儿
- Linux之systemctl命令的使用
- python培训中心-吴中区Python培训中心
- python hex 补0_Python保留前导零的二进制到十六进制转换
- UItableView的一些特殊点击效果
- Spring学习总结(5)——IOC注入方式总结
- pycharm的debug
- mifare classic 2.2.3中文_西班牙人为什么学中文?他们是这么说的……
- 易筋SpringBoot 2.1 | 第十一篇:SpringBoot使用actuator
- php arraymap 匿名函数,结合代码详细为你讲解,php中的array_map,array_walk以及匿名函数...
- vs2015显示方法引用个数
- RNA剪接体 Spliceosome | 冷冻电镜 | 结构生物学
- 联通loid认证_光纤LOID 认证 需要填写的用户名是什么?有人说不需要填写密码。为什么我每次认证都是超时?...
- 玩转Python,30行Python代码刷王者荣耀金币
- Mac剪切AVI视频
- 新能源汽车——动力电池
- 经纬度5位数和6位数差多少_经纬度小数点后5位是多少米 经纬度小数点后4位精确到...