第9章 符号表.

Slides:



Advertisements
Similar presentations
最根本的養生之道 主講人:無毒的家國際連鎖店創辦人 《不用刀的手術》作者 王康裕 不用刀的手術 ── 布魯士根菜汁的神奇配方.
Advertisements

2011年10月31日是一个令人警醒的日子,世界在10月31日迎来第70亿人口。当日凌晨,成为象征性的全球第70亿名成员之一的婴儿在菲律宾降生。 ?
请说出牛顿第一定律的内容。.
初级会计实务 第八章 产品成本核算 主讲人:杨菠.
中考阅读 复习备考交流 西安铁一中分校 向连吾.
我国的宗教政策 第七课第三框.
中央广播电视大学开放教育 成本会计(补修)期末复习
全球暖化 想知道全球暖化的嚴重性嗎? 那就繼續看下去吧!! 組員:陳儀君60524 蘇鈺祺60526 于玉琳60528 林宥嫻60521.
基于二维表的游戏模型 HIC工具链在游戏中的应用.
人教版义务教育课程标准实验教科书 小学数学四年级上册第七单元《数学广角》 合理安排时间 248.
2006年台灣醫學中心大搜查 聰明病人 完全就醫指南.
第三节 细胞外被与细胞外基质 1、胶原 细胞外被(糖萼)指细胞外覆盖的一层粘多糖(糖蛋白或糖脂)
Oracle数据库 Oracle 子程序.
中考语文积累 永宁县教研室 步正军 2015.9.
2-7、函数的微分 教学要求 教学要点.
小学数学知识讲座 应用题.
倒装句之其他句式.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
Using C++ The Weird Way Something about c++11 & OOP tricks
第 22 课 孙中山的民主追求 1 .近代变法救国主张的失败教训: “师夷之长技以制 夷”“中体西用”、兴办洋务、变法维新等的失败,使孙中山
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
第八章 符号表 符号表的作用: 一致性检查和作用域分析; 辅助代码生成..
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
第四章 程序设计初步 顺序结构:赋值语句、输出语句
6 下标变量的中间代码生成 下标:数组;变量: 下标变量:即数组分量: 简单变量:id,其地址可查到;
编译原理与技术 2018/11/30 《编译原理与技术》讲义.
编译原理课程设计.
管理信息结构SMI.
走进编程 程序的顺序结构(二).
辅导课程六.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
3 变量访问环境 临时变量区 变量访问环境 机器状态 返回值 Size InitOff 过程层数 top 堆区空间 栈区空间 静态区空间
第八章 运行时存储空间的组织与管理 目标程序运行时的存储结构 过程活动记录和运行时栈 变量访问环境 是CPU能直接寻址的存储空间.
《编译原理与技术》 期末复习 计算机科学与技术学院 郑启龙 李 诚 25/12/2018.
语义分析概述 符号表 第六章 语义分析.
符号表的管理 1.符号表的结构与组织 ☆ 2.符号表的局部化处理.
第4章 非线性规划 4.5 约束最优化方法 2019/4/6 山东大学 软件学院.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
第六章 语法制导的翻译 本章内容 介绍一种语义描述方法:语法制导的翻译,介绍语法制导的翻译的实现方法。
5.2 常用统计分布 一、常见分布 二、概率分布的分位数 三、小结.
3 变量访问环境 临时变量区 变量访问环境 机器状态 返回值 Size InitOff 过程层数 top 堆区空间 栈区空间 静态区空间
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
信号量(Semaphore).
第4章 Excel电子表格制作软件 4.4 函数(一).
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 Lua基本语法.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
ASP.NET实用教程 清华大学出版社 第4章 C#编程语言 教学目标 教学重点 教学过程 2019年5月5日.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
美丽的旋转.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
基本知识 数据类型、变量、常量、运算符.
手机淘宝“变形”产品—微淘 操作流程指南 (内测版).
第二章 数据类型与表达式 丘志杰 电子科技大学 计算机学院 软件学院.
畢氏定理(百牛大祭)的故事 張美玲 製作 資料來源:探索數學的故事(凡異出版社).
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
PASCAL语言 吉林大学计算机科学与技术学院.
陳維魁 博士 儒林圖書公司 第六章 領域與範圍 陳維魁 博士 儒林圖書公司.
编译原理实践 6.程序设计语言PL/0.
第8章 语法制导翻译与中间代码生成.
第二章 简单数据类型 §2.1 数据类型概述 §2.2 变量和常量 §2.3 简单数据类型 §2.4 简单数据类型的相互转换
102年人事預算編列說明 邁向頂尖大學辦公室製作.
Presentation transcript:

第9章 符号表

9.1 类型的语义表示 单词是最小的语义单位。 标识符的处理主要包括语义代码化、作用域处理、符号表构造、单元分配等工作。

一、符号表的作用 表 格 管 理 词法分析 语法分析 中间代码生成 中间代码优化 目标代码生成 目标程序 源程序 错 误 处 理

在整个编译阶段都离不开符号表。 二、符号表的内容 Pascal0有以下几种类型: 整 型:integer 实 型:real 布尔型:boolean 数组型:ARRAY[N1…N2]OF T 记录型:RECORD id1:T1;…;idn;Tn END

类型表TYPEL结构形如: TYPEL[tp]: TCLASS TPOINT 种类部分 指针

TCLASS部分结构如下: TCLASS: i r b a d 实型 整型 布尔型 记录型 数组型

数组信息表 AINFL的结构形如: AINFL[ap]: LOW UP CTP CLEN 下界 上界 指针 类型的长度

记录信息表 RINFL的表项结构形如: RINFL[rp]: IDE OFF FTP 域名部分 区距部分 FTP是域类型部分

一个记录类型要占几个RINFL表项,不同记录类型所占表项个数不一,而在表项中没有链接部分,因此在不同记录的RINFL表之间可放置一条空项,以表示记录类型的RINFL表中的结束。

TYPEL表 综上所述,我们有: integer: i nil real: r nil boolean: b nil AINFL a array: RINFL record: d

rp:    设一记录类型的RINFL表为 : id1 Off1 tp1 id2 Off2 tp2 idn Offn tpn    idn Offn tpn 假定integer,real,boolean为标准类型,其地址部分分别为itp,rtp,btp。 Leng(itp)=Leng(rtp)=Leng(btp)=1

例1:设有数组类型ARRAY[1…10] OF ARRAY [1…5] OF integer 则其内部表示如下图所示。 AINFL TYPEL tp: a TCLASS TPOINT LOW UP CTP CLEN 1 10 5 a 1 5 itp 1

例2:记录类型RECORD u:integer; a:ARRAY[1…10] OF boolean; r:RECORD x,y:real END END 则表示如下图所示。 d rtp: TCLASS TPOINT u 0 itp a 1 atp r 11 rtp’ AINFL表 TCLASS TPOINT atp: a 1 10 btp 1

d rtp: TCLASS TPOINT x 0 rtp y 1 rtp

9.2 标识符的语义表示 程序中标识符的出现分为定义性的和使用性的。 标识符的定义部分确定标识符的语义,它主要包括种类、类型、地址等等内容。 标识符语义的内部表示称为机内符(机器内部符号)或语义字。

在我们的PASCAL0语言中,标识符的种类有: 常量种类 类型种类 实在变量 变量种类 赋值形参变量 引用形参变量 实在变量 过函种类 赋值形参变量

标识符语义字的一种结构: ITYPE ICLASS IADDR 地址部分 种类部分 类型部分

ICLASS的具体结构如下: ICLASS: c t v p d f r 常量 类型 形参 变量 过函 引用型形参 域名种类

从实际实现的角度来说,ICLASS的上述结构是很不经济的,因为如果用编码方法,三个二进位就够了。但上述结构直观、便于描述,因此还是采用这种结构。 IADDR部分的具体意义依赖于ICLASS内容。 1. 若ICLASS.c=1,则IADDR是CONSL表地址。

2.若ICLASS.t=1,则IADDR是类型长度 3.若ICLASS.v=1.则IADDR是形如: 的抽象地址,其中LEVEL 是层数,OFF是区距部分。 LEVEL OFF 4.若ICLASS.d=1 ,则是域类型长度 5.若ICLASS.p=1,则IADDR是过函信息表PFINFL的地址,该表的表项结构如下:

LEVEL OFF NOFF MOFF FN ENTRY PARAMS 参数个数 参数 层数 区距 子程序入口地址 DISSPLAY表的区距 处理完临时变量时的第一个可用OFF值

标识符的语义字内容如下图所示 ITYPE ICLASS ADDR tp ’c’ CONSL 常量: 类型: tp ’t’ leng 变量: tp ’v’ l off 域名: tp ’d’ leng PFINFL 过函: tp ’p’

例子:设有PASCAL过程说明段: PROCEDURE p(VAR x:real; y:boolean); CONST pai=3.14; TYPE arr=ARRAY[1…10] OF integer; VAR m:integer; a:arr; FUNCTION f(Z:real;FUNCTION G(U,W: real):real;K:integer):integer; BEGIN………………END

各标识符的语义字分别如下图所示 TYPE CLASS ADDR p: x: y: pai: arr: m: p pfinfp1 2…4 rtp v f r x: 2…5 btp v f y: <3.14> rtp c pai: 10 ainfp t arr: 2…offm itp v m:

a: f: Z: G: K: 2…offa ainfp v pfinfp2 itp p 3…4 f v rtp pfinfp3 f rtp 3…7 f v itp K: 实在过函标识符的OFF值为3,第一个形参的OFF值为4,ainfp表示AINFL表的一表项地址如下图:

AINFL[ainfp]= 1 itp 10 Pinfp1 如所示: 其他的情况类似 PFINFL PARINFL PARAMS ENTRY FN MOFF NOFF OFF LEVEL 2 6 3 1 SEMAN(y) SEMAN(x) 其他的情况类似

9.3 符号表的组织 一、符号表的结构 符号表记为SYMBL,它是标识符的语义表,在语义学中,把这种表称为环境。SYMBL表项的结构如下: SYMBL[i]: IDENT SEMAN 标识符部分 语义字部分

二、定义性标识符 1.CONST Pi=3.14 2.TYPE A… 3.VAR A,B,C 4.PROCEDURE X( A,B ) 5.FUNCINON X( A,B ):Tname 6.RECORD X:T;…;X END

三、标识符的作用域与处理 程序段:PROGRAM…………………END 过程段:PROCEDURE………………END 函数段: FUNCTION………………END 记录类型: RECORD………………END 具体实现方法可分为两种: 真删除法 加标记法

9.4 抽象地址的处理 存储分配分为静态分配与动态分配。 在编译时分配的称静态分配。 在目标程序运行时分配的称动态分配。 编译程序只能确定某种结构的形式地址,称之为抽象地址。

抽象地址通常采用如下结构: level off 层数部分 区距部分 0层 1层 2层 q p 主

每当一个过程说明的子程序被调用时,就要给其中的变量分配一串存贮单元,称这一串单元为该过程的一个活动区。 从第3号单元开始分配给过函名、形参等。

活动区的分配情况如下图所示: 临时变量 局部变量 DISPLAY表 l+1 形式参数2 形式参数1 过函名 5 4 3 管理信息 0-2

抽象地址的变化规律可图示如下: 实在声明: (l,off) (l,off) (l,off) (l,off+size(T)) (l,off) (l,off) <标号声明部分> <常量声明部分> <类型声明部分> var id:T <过程声明部分> <函数声明部分>

形参入口: (l,off) (l +1,4) proc p( func p( proc P( func F(

形参声明: (l,off) (l ,off+Size(T)) (l,off) (l ,off+1) (l,off) (l ,off+2) Id:T Var id:T func F(…):T proc P(…): 形参出口: (l,off) (l,off+l+1) <形参结束”)”>

其中小写字母的标识符表示实在标识符,大写字母的标识符则表示形参标识符。Size(T)表示类型T的长度。 在形参出口,off+l+1中的l+1表示DISPLAY表的位置。

例:在下面程序中,每个对偶(l,i)表示此刻的LEVEL和OFF值。 (l,10)LABEL 100,200; (l,10)CONST pai=3.14; (l,10)TYPE arr=ARRAY[1…10]OF integer; (l,10)VAR x:integer; (l,11) a:ARRAY[1…5] OF integer; (l,16) FUNCTION f( (l+1,4)VAR x:real; (l+1,5) a:arr; (传值)

):real; BEGIN………………END; (l+1,15)VAR c:arr; (传地址) (l+1,16)PROCEDURE G( ); (l+1,18)FUNCTION F( ):real (l+1,20) ):real; (l+1,20+l+2) (形参结束 off+(l+1)+1 ) BEGIN………………END; (l,16)

9.5 标识符的处理算法 最后得到下列一些表的内容: 例子:设有非形参过程首部(层数为l)。 PROCEDURE P(X,Y:integer; VAR Z: real; PROCEDURE G(U:real;J:integer); FUNCTION F( VAR W:real; FUNCTION H(M:integer):real): bool) 最后得到下列一些表的内容:

Scope[s]: P SEMAN(P) SEMAN(F) SEMAN(G) SEMAN(Z) SEMAN(Y) SEMAN(X) X 5 3 1 PFINFL 表 P SEMAN(P) SEMAN(F) SEMAN(G) SEMAN(Z) SEMAN(Y) SEMAN(X) PFINFL 表 X SEMAN(X) Y SEMAN(Y) Z SEMAN(Z) G SEMAN(G) F SEMAN(F) PFINFL 表 PFINFL 表 9 2 7 2

SEMAN(w) SEMAN(U) SEMAN(H) SEMAN(J) SEMAN(M) PFINFL 表 PFINFL 表 5 1 PFINFL 表 SEMAN(M)