10+8--语义分析与符号表

合集下载

编译原理填空集锦

编译原理填空集锦

1-01.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,之间代码生成,代码优化等几个基本阶段,同时还会伴有表格处理和出错处理 .1-02.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序.1-03.编译方式与解释方式的根本区别在于是否生成目标代码 .1-04.翻译程序是这样一种程序,它能够将用甲语言书写的程序转换成与其等价的用乙语言书写的程序 .1-05.对编译程序而言,输入数据是源程序,输出结果是目标程序.1-06.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段: 编译阶段和运行阶段 .如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分为三个阶段:编译阶段, 汇编阶段和运行阶段 .1-07.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。

1-08.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。

其中,词法分析器用于识别单词。

1-09.编译方式与解释方式的根本区别为是否生成目标代码。

2-01.所谓最右推导是指:任何一步α?β都是对α中最右非终结符进行替换的。

2-02.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。

2-03.产生式是用于定义语法成分的一种书写规则。

2-04.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x│S x,x∈VT*} 。

2-05.设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈V*),则称x是文法的一个句型。

2-06.设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈VT*),则称x是文法的一个句子。

3-01.扫描器的任务是从源程序中识别出一个个单词符号。

4-01.语法分析最常用的两类方法是自上而下和自下而上分析法。

编译原理第6章(刘磊 机械工业出版社)

编译原理第6章(刘磊 机械工业出版社)

TypePtr Kind
Level Parm Class
例有声明如下:
CONST pai= 3.14 ; TYPE vector=ARRAY[1..10] OF integer; VAR x, y : real ; r, s : vector ; 设当前层数和可用offset值分别为L和0, 构造标识符 pai, vector, x, y, r 和s 的属性表示。
6.4 值的内部表示

非结构类型值的内部表示:
整型:有直接对应的机器表示。 实型:有直接对应的机器表示。 指针:无符号整型数。 有序类型:整数形式
有序类型的量表示:



整型常量:ord(N) = N 布尔常量:ord(false)=0, ord(true) = 1 字符常量:ord(C) = ASCⅡ (C) 枚举常量:设有枚举类型(D,A,B),则有 ord(D)=0,ord(A)=1,ord(B)=2 子界常量:设有子界类型C1..C2,则值空间 为[ord(C1)...ord(C2)]
TokenList
语义定义 自然语言描述规定
判定
三种内部表示
标识符的内部表示 类型的内部表示 值的内部表示
6.2
标识符种类:
标识符的内部表示
常量名、类型名、变量名、函数名、过程名、域名。 TYPE idkind=( consKind, typeKind, varKind, fieldKind, procKind,funcKind )
标准类型: Size sub: enum: array:
Size Size Size Kind HostType Elems Low Up Leng
Kind Kind Kind

第六章 语义分析(1)

第六章 语义分析(1)

形式语义技术没有形式语法技术成熟 硕士研究生的课程--《形式语义学》 硕士研究生的课程 《形式语义学》
语义分析的主要任务
输入: 输入:抽象语法树 或 TokenList 输出:抽象语法树+符号表 或 TokenList+符号表 输出:抽象语法树 符号表 符号表 数据结构:抽象语法树+符号表 数据结构:抽象语法树 符号表 算法: 算法:
语义分析的必要性
一个语法正确的程序不能保证它是有意义 的! 程序中容易出现各种语义错误: 程序中容易出现各种语义错误:
– 标识符未声明 y = x+3; – 操作数的类型与操作符的类型不匹配 y = x*3; – 数组下标变量的类型出错 A[x]; – ……
语义分析不能检查程序在计算逻辑上 的错误!!!! 的错误!!!!
($int, -) ($id, xentry) ($comma, -) ($id, yentry) ($semi,-) ($int, -) ($id, fentry) ($lparen, -) ($rparen,-) ($semi,-)
常见的语义错误
– 标识符没有声明 标识符没有声明; – 重复声明 重复声明;
根结点 ProK 程序头 PheadK 类型声明 TypeK 变量声明 程序体 StmLK
VarK
声明 1 声明 1
……
声明 n
语句 1
……
语句 n
……
声明 n 过程声明 1
……
过程声明 n
过程体 StmLK 形参 1
……
形参 n 语句 1
……
语句 n
类型声明
变量声明
过程声明
类C语言的抽象语法树
程序Root 程序 节点 Node2 …… 常量声明 类型声明 节点 Node 变量声明 函数声明 形参声明 FunNode1 节点 Noden FunNode1 节点 Node1

符号表专题知识讲座

符号表专题知识讲座


网 :
在一起

业 的
➢优点:每个符号表中存储符号旳属性个数和构造
计 算
完全相同


习 网
➢缺陷:一种编译程序将同步管理若干个符号表,
站 增长了总体管理旳工作量和复杂度
23
❖第2种:把全部语言中旳符号都组织在一张符号表中

威 网
➢优点:总体管理非常集中单一,且不同种类符号旳共
: 专
同属性可一致地管理和处理
机 学 习
空间大小等。

站 对于指针:所指对象类型等。
10
五.符号表旳功能
1.搜集符号属性




专 业
2.上下文语义旳正当性检验旳根据





习 网
3.作为目旳代码生成阶段地址分配旳根据

11
六.符号表旳分类
静态表:事先构造好旳表,如保存字表、原则
盛 威
函数名表等。需要时去查相应旳此类
网 :
号表LT和四元式表QT
31
符号名表SNT
NAME INFORMATION
(1)M 参数,整数,变量
盛 (2)N 参数,整数,变量

网 :
(3)K
整数,变量



计 算 机
常数表CT
学 习
值(VALUE)


(1) 1
(2) 4
32
入口名表ENT
NAME
INFORMATION
(1)INCWAP 二目子程序,入口QT(1)
学 习
地址:变量所分配单元旳首址或地址位移

编译原理符号表的作用

编译原理符号表的作用

编译原理符号表的作用介绍编译原理中的符号表是一个重要的数据结构,用于存储程序中的标识符及其相关信息。

标识符可以是变量、常量、函数名等,在编译过程中需要进行词法和语义分析,符号表提供了一个地方来管理这些标识符,并为编译器的其他模块提供必要的信息。

作用符号表在编译过程中起着关键作用,它具有以下几个主要作用。

1. 标识符的声明符号表记录了程序中所有标识符的声明情况,包括标识符的类型、作用域等信息。

对于变量,符号表可以记录其数据类型和内存地址;对于函数,符号表可以记录其参数列表、返回值类型等。

编译器可以通过符号表查找标识符的声明信息,并根据需要进行语义检查和代码优化。

2. 标识符的引用和解析编译过程中,标识符可能会被多次引用,符号表用于解析标识符的引用。

编译器可以根据符号表中的信息确定标识符的类型、作用域等,从而进行语义检查和类型推导。

如果编译器在符号表中找不到对应的标识符,就会报错或警告,提示可能存在的错误。

3. 作用域管理符号表还可以用于管理标识符的作用域。

在程序中,不同的代码块可能定义了相同名称的标识符,符号表可以通过作用域信息来区分这些标识符。

当编译器遇到一个标识符时,它可以在符号表中查找该标识符的作用域,并根据作用域规则来解析标识符的含义。

4. 错误检测和提示符号表还可以用于错误检测和提示。

编译器可以通过符号表判断标识符是否已经定义或声明,以及是否满足相应的语义规则。

如果标识符在符号表中已经存在多个定义,编译器可以发现这种错误,并给出相应的错误提示信息。

符号表的组织结构为了高效地实现符号表的作用,通常采用哈希表或树形结构来组织符号表。

下面是一些常见的符号表组织结构。

1. 线性表符号表可以使用线性表结构进行组织,例如数组、链表等。

线性表结构简单直观,适用于较小规模的符号表。

但对于大规模的符号表,线性表的查找效率较低。

2. 哈希表哈希表是一种基于键值对存储的数据结构,可以快速地查找和插入数据。

符号表中的标识符可以作为哈希表的键,对应的信息可以作为值进行存储。

2022-2023年软件水平考试《中级软件设计师》预测试题10(答案解析)

2022-2023年软件水平考试《中级软件设计师》预测试题10(答案解析)

2022-2023年软件水平考试《中级软件设计师》预测试题(答案解析)全文为Word可编辑,若为PDF皆为盗版,请谨慎购买!第壹卷一.综合考点题库(共50题)1.面向对象设计时包含的主要活动是( )。

A.认定对象、组织对象、描述对象间的相互作用、确定对象的操作B.认定对象、定义属性、组织对象、确定对象的操作C.识别类及对象、确定对象的操作、描述对象间的相互作用、识别关系D.识别类及对象、定义属性、定义服务、识别关系、识别包正确答案:D本题解析:面向对象设计时包含的主要活动是识别类及对象、定义属性、定义服务、识别关系、识别包。

2.中断向量提供( )。

A.被选中设备的地址B.待传送数据的起始地址C.中断服务程序入口地址D.主程序的断点地址正确答案:C本题解析:中断向量表用来保存各个中断源的中断服务程序的入口地址。

当外设发出中断请求信号(INTR)以后,由中断控制器(INTC)确定其中断号,并根据中断号查找中断向量表来取得其中断服务程序的入口地址,同时INTC把中断请求信号提交给CPU。

3.某种机器的浮点数表示格式如下(允许非规格化表示)。

若阶码以补码表示,尾数以原码表示,则1 0001 0 0000000001表示的浮点数是( ) 。

A.见图AB.见图BC.见图CD.见图D正确答案:B本题解析:题干尾数是原码为:0000000001,数符是0,这表示该尾数是负数为2^-10 。

阶码是0001是补码,转换成原码是1111,是十进制的15,这里注意阶符是1,这表示阶码是负数,因此该浮点数是2^-15 ×2^-10 。

4.下面的标记对中人 ( )用于表示网页代码的起始和终止。

A.image.pnghtml>image.png/html>B.image.pnghead>image.png/head>C.image.pngbody>image.png/body>D.image.pngmeta> image.png/meta>正确答案:A本题解析:image.pnghead>image.png/head>表示文档的头部标签。

符号表与错误处理

符号表与错误处理

第8章 符号表与错误处理
分程序表中的每一登记项由三个字段组成: OUTERN字段用来指明该分程序的直接外层分
程序的编号;COUNT字段用来记录该分程 序符号表登记项的个数;POINTER字段是一个 指示器,它指向该分程序符号表的起始位置。
第8章 符号表与错误处理
下面, 我们给出建造满足上述要求符号表的算法 。为了使各分程序的符号表登记项连续地排列在一 起, 并结合在扫描具有嵌套分程序结构的源程序时 总是按先进后出的顺序来扫描其中各个分程序的特 点, 可设置一个临时工作栈, 每当进入一层分程序时 , 就在这个栈的顶部预造该分程序的符号表, 而当遇 到该层分程序的结束符END时(此时该分程序的全 部登记项都出现在栈的顶部), 再将该分程序的全部 登记项移至正式符号表中。
加1且使POINTER指向新的栈顶。
第8章 符号表与错误处理
③ 当扫描到分程序的结束符END时, 将记入临 时工作栈的本层分程序全部登记项移至正式 的符 号表中, 且修改POINTER值使其指向本层 分程 序全部名字登记项在符号表中的起始位置。此外, 在退出此层分程序时, 还应使它的直接 外层分程 序成为当前的分程序。
第8章 符号表与错误处理
根据编译程序工作阶段的不同划分, 名字表中 的各种信息将在编译程序工作过程中的适当时候填
入。对于在词法分析阶段就建立符号表的编译 程序, 当扫描源程序识别出一个单词(名字)时, 就以 此名 字查找符号表;若表中无此名的登记项, 就将 此名 字填入符号表中;至于与此名相关的其它信 息, 可 视工作方便分别在语法分析、语义分析及中 间代码 生成等阶段陆续填入。
第8章 符号表与错误处理
例8.1 一示意性源程序如下: PROGRAM PP (input,output); COUNT norw=13;

6章符号表组织

6章符号表组织

临时变量值区
v5
b值
v4 数组a值区 链接表
v3
y值
v2 v1
x值 exp值
管理区
【例6.2】有类型说明:
TYPE arr = ARRAY [1..10] OF ARRAY [1..5] OF INTEGER;
试填写符号表。
SYNBL
TYPEL
arr
t
i
r
LENL
c
200
b
AINFL
a
1
10
20
a
6.2 符号表的组织与管理
6.2.1 符号表的工作原理
⑴ 遇 定义性标识符(在说明中)--- 把语义信 息填入表中,并修改其TOKEN的指针,使其指向相 应的表项:(i , ) 该标识符符号表项
⑵ 遇 应用性标识符(在语句中)--- 查符号表 的相应项,查到后修改其TOKEN的指针,使其指向 相应的表项:(i , ) 该标识符符号表项
活动记录:一个有结构的连续存储块。用来存储过 函一次执行中所需要的信息。
活动记录仅是一种存储映像,编译程序所进行 的运行时刻存储分配是在符号表中进行的。
如果不支持可变数据结构,活动记录的体积是 可以在编译时确定的。
局部数据 连接数据
6.5.2 活动记录(续)
2.活动记录的结构
(1)连接数据区
TOP
1
5
itp 4
设:实型占8个存储单元,整型占4个单元,布尔型和字符型占1个单元。
【例6.3】有类型说明: TYPE rec = RECORD
u: INTEGER;
试填写符号表。 SYNBL
v: ARRAY [1..10] OF BOOLEAN; r: RECORD x, y : REAL END END;

第6章 语义分析(2)

第6章 语义分析(2)
类型声明
– 一般形式 id = type; 一般形式: – 内部表示 内部表示:
建立 type的内部表示; 建立 id的内部表示;
TypePtr
Kind typeKind
6.4 声明的语义分析
变量声明
– 一般形式: type id; 一般形式 – 内部表示 : 建立 type的内部表示;
获取<CurrentLevel, CurrentOffset> 获取 确定存取方式: 确定存取方式 dir/indir 建立 id的内部表示; CurrentOffset += sizeof(type)
语句
… FunNode1
6.4 声明的语义分析
常量声明
– 一般形式 id = number; 一般形式: – 内部表示 内部表示:
建立 number值的内部表示; 建立 number类型的内部表示; 建立 id的内部表示;
TypePtr
Kind constKind
Value
6.4 声明的语义分析
第六章 语义分析
6.1 语义分析概述 6.2 符号表 6.3 类型的语义分析 6.4 声明的语义分析 6.5 程序体的语义分析 6.6 属性文法和动作文法
内容回顾
什么是语义分析? 什么是语义分析
– 建立符号表 建立符号表; – 检查语义错误 检查语义错误;
在何处进行分析? 在何处进行分析
– 声明部分 --- 建立符号表;检查“重复声明”错误 建立符号表;检查“重复声明”错误; – 体部分 --- 查找符号表,检查“有使用无声明”错误和 查找符号表,检查“有使用无声明”
Size
Kind structTy
Body
6.3 类型的语义分析

语义分析

语义分析
语义分析概述
1 语义 2 语义分析 3 语义分析的典型实现 4 语义分析的方法
1 语义
a)
b)
与被翻译过程的最终含义密切相关的信 息 两种语义 静态语义 被静态定义,在执行前可以确 定. 编译器实现静态语义分析 动态语义 只有在执行时才能确定
2 语义分析
要求根据编成语言的规则建立正确性, 并保证其正确执行。 典型的语义分析有:
“345”的语法树显示了属性计算
例2 变量声明的属性文法: 变量的属性是数据类型
文法规则 decl->type varlist type->int
语义规则 varlist.dtype=type.dtype type.dtype=integer
type->float type.dtype=real varlist1->id,varlist2 id.dtype=varlist1.dtype varlist2.dtype =varlist1.dtype var-list->id id.dtype=varlist.dtype
6.1 属性和属性文法 6.2 属性计算算法 6.3 符号表 6.4 程序的语义分析
6.1 属性和属性文法
1 属性 定义 属性是编程语言结构的任意特性 属性的典型例子有:
– 变量的数据类型 – 表达式的值 – 存储器中变量的位置 – 程序的目标代码
2 属性文法
属性 属性直接与语言的文法符号相联系(终结 符和非终结符) 如果X 是一个文法符号,a 是X的一个属 性,那么我们把与X关联的 a 的值记作X.a
a)



静态类型检查: 运算符的分量类型是否相同? 赋值号的左右边类型是否相同? 形参与实参类型是否相同? 数组下标的类型是否为所允许的类型? 函数说明中的函数类型和返回值的类型 是否一致?

语义分析与符号表

语义分析与符号表

第五章语义分析5.1语义分析基础5.1.1 语义分析内容程序设计语言的语义可分为静态语义和动态语义。

所谓静态语义是指在编译阶段能检查的语义,而动态语义则指只有在目标码的运行阶段才能检查的语义。

如果所有类型均能在编译阶段检查,则称这种语言为强类型语言。

Pascal是强类型语言的一个例子。

在某些语言里变量的类型是可变的,这时类型的语义成为动态语义,因为类型相容问题只能在代码运行时才能检查出来。

语言的静态语义成分越多编译器和解释器的区别会越大,如果都属于动态语义,那么编译器和好的解释器的差别将会变小。

类型在大多数语言里都属于静态语义,而且它是最重要的静态语义,可以说,静态语义问题主要是类型相容的问题。

类型检查主要有以下几种:∙各种条件表达式的类型是不是boolean型?∙运算符的分量的类型是否相容?∙赋值语句的左右部的类型是否相容?∙形参和实参的类型是否相容?∙下标表达式的类型是否为所允许的类型?∙变体记录中表示情形的常量是否为合法类型?∙函数说明中的函数类型和返回值的类型是否一致?等除了上述类型检查外,还要进行如下一些语义检查:∙V[E]中的V是不是变量,而且是数组类型?∙V.i中的V是不是变量,而且是记录类型? i是不是该记录类型中的域名?∙V↑中的V是不是指针或文件变量?∙y+f(....)中的f是不是函数名?形参个数和实参个数是否一致?∙p(....)语句中的p是不是过程名?形参个数和实参个数是否一致?∙每个使用性标识符是否都有相应的声明?在同层内有无标识符被声明多次?∙标号是否有声明?有无重复声明和重复定位错误?有无非法转入错误?∙子界类型中的下界和上界类型是否相容?下界是否小于等于上界?∙ ..........................................一遍扫描的编译器是从源程序的ASC码序列即源语言的字符串序列直接生成目标代码,因此不会有独立的语义分析器。

多遍扫描的编译器,也未必有独立的语义分析器,如果没有,则意味着把语义检查工作分散到编译过程的几个阶段中顺便完成。

编译原理第八章 符号表

编译原理第八章  符号表
• 需要做作用域分析!
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. 词法分析器(Lexer):也称为扫描器(Scanner),用于将源代码分割成一个个单词(Token)。

2. 语法分析器(Parser):将词法分析器生成的单词序列转换成语法树(Parse Tree)或抽象语法树(Abstract Syntax Tree)。

3. 语法树(Parse Tree):表示源代码的语法结构的树状结构,它由语法分析器根据语法规则生成。

4. 抽象语法树(Abstract Syntax Tree):比语法树更加简化和抽象的树状结构,用于表示源代码的语义结构。

5. 语义分析器(Semantic Analyzer):对抽象语法树进行语义检查,并生成中间代码或目标代码。

6. 中间代码(Intermediate code):一种介于源代码和目标代码之间的中间表示形式,可以被不同的优化器和代码生成器使用。

7. 目标代码生成器(Code Generator):将中间代码转换成特定目标平台的机器代码。

8. 优化器(Optimizer):用于对中间代码进行优化,以提高代码的执行效率和资源利用率。

9. 符号表(Symbol Table):用于存储程序中的标识符(变量、函数等)的信息,包括名称、类型等。

10. 语言文法(Grammar):定义了一种语言的语法规则,常用的形式包括上下文无关文法和正则文法。

11. 上下文无关文法(Context-free Grammar):一种形式化的语法表示方法,由产生式和非终结符组成,描述一种语言的句子结构。

12. 语言解释器(Interpreter):将源代码逐行解释执行的程序,不需要生成目标代码。

13. 回溯法(Backtracking):一种递归式的算法,用于在语法分析过程中根据产生式进行选择。

14. 正则表达式(Regular Expression):用于描述一类字符串的表达式,可以用于词法分析中的模式匹配。

15. 自顶向下分析(Top-down Parsing):从文法的起始符号开始,按照语法规则逐步构建语法树的过程。

编译原理的名词解释

编译原理的名词解释

编译原理的名词解释编译原理是计算机科学中的一门重要课程,它研究的是如何将高级语言程序转化为计算机能够执行的机器指令。

编译原理涉及许多专业术语和概念,下面将对其中一些重要的名词进行解释。

词法分析(Lexical Analysis)词法分析是编译过程中的第一个阶段,也被称为扫描器。

它负责将源程序中的字符序列转化为单词(词法单元)的序列。

在词法分析的过程中,会忽略不需要关注的字符,如空格和注释。

语法分析(Syntax Analysis)语法分析是编译过程中的第二个阶段,也被称为解析器。

它负责根据词法分析阶段产生的词法单元序列,构建出一棵语法树。

通过语法分析,可以检查源程序是否符合语法规范,并将程序转化为抽象语法树。

语义分析(Semantic Analysis)语义分析是编译过程中的第三个阶段,它负责对语法树进行语义检查和语义规则的应用。

语义分析可以捕捉到一些错误,在编译过程中对源程序进行修正。

此外,语义分析还对程序中的语义逻辑进行处理,包括类型检查、作用域检查等。

中间代码生成(Intermediate Code Generation)中间代码是一种介于高级语言和目标机器语言之间的中间形式。

中间代码生成是编译过程中的一个重要阶段,它将源程序翻译为一种中间表示形式。

中间代码的生成可以便于程序的优化和后续阶段的处理。

代码优化(Code Optimization)代码优化是编译过程中的一个关键环节,它旨在改进生成的目标代码的效率和质量。

代码优化技术包括常量传播、死代码消除、循环优化等。

通过代码优化,可以提高程序的执行效率和资源利用率,改善程序的性能。

目标代码生成(Code Generation)目标代码生成是编译过程中的最后一个阶段,它将中间代码转化为目标机器的机器指令。

目标代码生成需要考虑目标机器的硬件特性和指令集,将中间代码转化为可以被计算机直接执行的机器指令。

符号表(Symbol Table)符号表是编译器中非常重要的数据结构,用于存储程序中出现的所有标识符的信息。

编译原理符号表

编译原理符号表

tx 6 (9)
LEV 1
BLOCK
...
tx
0 (6)
LEV
0
BLOCK 主程序
tx是BLOCK旳 实际值参
BLOCK(LEV+1,TX,…) (递归进入分程序)
第1次调用block BLOCK(0,0,…)
• 往表中填入一种新旳名字;
• 对给定名字,访问它旳某些信息;
• 对给定名字,填写或更新它旳某些信息;
• 删除一种或一组无用旳项。
不同种类旳表格所涉及旳操作往往也是不同 旳。上述五个方面只是某些基本旳共同操 作。
符号属性(信息)
几种一般都是需要旳。 1 符号名 2 符号旳类型 3 符号旳存储类别 4 符号旳作用域及可视性 5 符号变量旳存储分配信息 6 符号旳其他属性 (1) 数组内情向量 (2) 统计构造型旳组员信息 (3) 函数及过
分表构造旳组织管理
其基本思想是,每当编译程序扫描到一种 分程序构造开始时,为该分程序建立一 张符号表,在该分程序中定义旳标识符, 都被登录在该符号表中。而当编译程序 扫描到一种分程序旳结束时,编译程序 释放为该分程序所建立旳符号表。这种 符号表旳分表构造与源程序旳分程序层 次构造一一相应
单表构造旳组织管理
编译程序按名字旳不同种属分别使用许多符号 表,如常数表、变量名表、过程名表等等。
SUBROUTINE INCWAP(M,N) 10 K=M+1
M=M+4 N=K
RETURN
END
经编译头三阶段后所产生旳主要表格有:符号 名表SNT、常数表CT、入口名表ENT、标号 表LT和四元式表QT
符号名表SNT
• 名字表旳定义 table:array[0..txmax] of record name:alfa; case kind:object of constant:(val:integer); variable:procedur:(level,adr,size: integer);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c hfwang - 8/22 -
基本概念
符号表
类型检查
VSL语言的符号表 1/3
符号表元素的数据类型 typedef struct symb { struct symb *next; int type; union { int val; char *text;
/* /* /* /* /*
} val1; union { /* 变量的第一个值 */ int val; /* 对变量取偏移量等 */ struct tac *label; /* 对标号取三地址码 指针 */ } val2 ; } SYMB ; /* 整数常量, 字符串常量和语句标号等也使用 本数据类型, 但是由于没有对其查找的要求, 这些数据将不保存在Hash表中 */ SYMB *symbtab[HASHSIZE] ; /* 符号表 */
静态性质(static):在编译阶段就可以确定的性质, 如:C语言的全 局变量, 类型, 变量和类型的关系,运算和转移指令和函数的入口 地址; 动态性质(dynamic):程序在运行阶段才能确定的性质— 程序在运 行时才能确定的性质,如:C语言的被调用函数的运行环境 (参数、 返回地址、 局部变量和返回值) ;面向对象语言的Virtual Function的动态绑定(binding); 动态性质有相对不变性, 栈式运行环境中, 如: 局部变量和栈顶的 位置关系是不变的; 动态性质必须用其相对不变性实现, 如:函数的调用和被调用转 化为相对不变的调用序列和被调用序列; 语义分析(Semantic Analysis)是编译器前端(front-end)的最后一个 环节, 主要是符号表的建立和类型检查(type checking), 为下一 步中间表示提供必要的上下文相关的信息。
下一个节点 */ 符号的数据类型 */ 变量的第一个值 */ 对整数常数取其值 */ 对变量取其形, 为字符指针 */
HASH符号表 i(int) • • f(fct) • • g(fct) j(int) • 用chaining解决HASH表的collision l(int) •
c hfwang
- 9/22 -
c hfwang
- 5/22 -
基本概念
符号表
类型检查
命题公式的抽象语法树的数据结构
struct symrec { char *name; /* 原子名 */ int value; /* 原子的值 */ } sym_table [16]; /* 符号表 */ typedef enum { And=1, Or=2, Impl=3, Not=4, Equi=5, ConstKind=6, Atom = 7} Kind; /* AST 结点类型 */ typedef struct streenode { Kind op; struct streenode *lchild, *rchild; union { int true_value; struct symrec *atom; } val; } STreeNode; /* AST数据结构 */ typedef STreeNode * SyntaxTree; in lex file: [a-zA-Z][a-zA-Z0-9]* { int tmp = getsym(yytext); yylval = mkAtomNode(&sym_table[tmp]); return ID; }
有序或无序线性链表:适合处理较小规模的符号表;如:记录C语言 的纪录类型的分量名和相关属性 Binary Search tree: 访问速度: O(log(n)) (n是符号表元素的个数) Hash表: 访问速度: O(n/m) (n是符号表元素的个数, m是hash表的 大小); 在实践中效果最好, 是目前编译器采用的主要方法.
HASH符号表 i(int) • • f(fct) • • g(fct) j(int) • 用chaining解决HASH表的collision l(int) •
c hfwang
- 10/22 -
基本概念
符号表
类型检查
VSL语言的符号表 3/3
插入与查表操作 void insert( SYMB *s ) { int hv = hash( s->TEXT1 ) ; s->next = symbtab[hv] ; /* 插入到链表的表头 */ symbtab[hv] = s ; } SYMB *lookup( char *s ) /* 查找是否在符号表中是否有和s同名的符号, 如果没有则返回空指针。 */ { int hv = hash( s ) ; SYMB *t = symbtab[hv] ; while( t != NULL ) if( strcmp( t->TEXT1, s ) == 0 ) break ; else t = t->next ; return t ; }
插入操作的动态演示 i(int) • • f(fct) • • g(fct) j(int) • 用chaining解决HASH表的collision! l(int) •
c hfwang
- 11/22 -
基本概念
符号表
类型检查
VSL语言的符号表 3/3
插入与查表操作 void insert( SYMB *s ) { int hv = hash( s->TEXT1 ) ; s->next = symbtab[hv] ; /* 插入到链表的表头 */ symbtab[hv] = s ; } SYMB *lookup( char *s ) /* 查找是否在符号表中是否有和s同名的符号, 如果没有则返回空指针。 */ { int hv = hash( s ) ; SYMB *t = symbtab[hv] ; while( t != NULL ) if( strcmp( t->TEXT1, s ) == 0 ) break ; else t = t->next ; return t ; }
插入操作的动态演示 i(int) • • f(fct) • • g(fct) j(int) • 用chaining解决HASH表的collision! l(int) • k(int)
c hfwang
- 11/22 -
基本概念
符号表
类型检查
VSL语言的符号表 3/3
插入与查表操作 void insert( SYMB *s ) { int hv = hash( s->TEXT1 ) ; s->next = symbtab[hv] ; /* 插入到链表的表头 */ symbtab[hv] = s ; } SYMB *lookup( char *s ) /* 查找是否在符号表中是否有和s同名的符号, 如果没有则返回空指针。 */ { int hv = hash( s ) ; SYMB *t = symbtab[hv] ; while( t != NULL ) if( strcmp( t->TEXT1, s ) == 0 ) break ; else t = t->next ; return t ; }
c hfwang
evaluate($1); } { { { { { { { { $$ $$ $$ $$ $$ $$ $$ $$ = = = = = = = = $1; } $1; } mkOpNode(And, $1, $3); } mkOpNode(Or, $1, $3); } mkOpNode(Impl, $1, $3); } mkOpNode(Equi, $1, $3); } mkOpNode(Not, $2, NULL); } $2; }
c hfwang - 3/22 -
基本概念
符号表
类型检查
抽象语法树
具体文法(Concrete Syntax): 借助一些辅助终结符号用产生式表达的文 法, 如: 增加覆盖优先级别的括号中缀表达式文法; 后缀表达式文法等 具体文法可能存在二义性; 抽象文法(Abstract Syntax): 表达不同具体文法的相同特征; 如, 前缀, 中 缀和后缀表达式均要表达的是运算量和运算符结合的次序关系; 抽象文法的表现形式是抽象语法树(Abstract Syntax Tree); 如: 运算符作 为父结点, 运算符或运算量作为子结点的树结构是任何表达式文法的抽象 语法树; AST避开的具体文法的细节和二义性; 如: 没有括号, 没有了优先级别和 结合次序等 AST作为编译过程的一个属性, 在编译器需要对文法结构进行多次遍历时 使用, 这样可以避免了对具体文法进行多次遍历;
基本概念符Βιβλιοθήκη 表类型检查语义分析
c hfwang
- 1/22 -
基本概念
符号表
类型检查
1
基本概念 引言 抽象语法树 命题公式的抽象语法树 符号表 符号表 非全局变量的处理 向前引用 类型检查 类型检查 类型等价
2
3
c hfwang
- 2/22 -
基本概念
符号表
类型检查
语义分析Semantic Analysis
对命题公式求其真值表, 需要对公式遍历2n 次(n为公式中原 子的个数); C语言的说明语句, 需要保留被说明的类型, 可以用类型表达 式这样一个AST.
c hfwang - 4/22 -
基本概念
符号表
类型检查
Example: 命题公式的抽象语法树
公式(P → Q) ↔ (¬P ∨ Q)的抽象语法树 ↔ → P Q P ¬ ∨ Q
c hfwang
- 6/22 -
基本概念
符号表
类型检查
命题公式的抽象语法树的建立
in yacc file: %{ #define YYSTYPE SyntaxTree %} %token NUM ID %left ’=’ %left ’>’ %left ’|’ %left ’&’ %right ’-’ %% line : exp ’\n’ { ; exp : NUM | ID | exp ’&’ exp | exp ’|’ exp | exp ’>’ exp | exp ’=’ exp | ’-’ exp | ’(’ exp ’)’ ;
相关文档
最新文档