第六章语义和符号表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VariBody:
CaseUnit VariUnits
FixBody VariBody Next
id CaseType Off
set: Size
file: Size
pointer:
Size
Kind Kind
BaseType CompType
Kind TypeNBaidu Nhomakorabeame
例有如下的类型定义: at = ARRAY [1..10] OF ARRAY[1..100] OF integer; rt = RECORD x : real ; a : at; CASE u: boolean OF false:(k : integer); true:(y: real; b: boolean) END 构造类型的内部表示。
处理符号表的模块: 定义符号表数据结构 定义符号表上的操作
符号表
符号表的作用:为语义检查和代码生成提供 标识符的语义信息。
标识符的处理思想: ▪ 遇到定义性标识符时,在符号表中填写 被定义标识符的符号项; ▪ 当遇到使用性标识符时,用该标识符查 符号表求得其属性。
标识符的特点
标识符的作用域:标识符有效的最大程序段 嵌套作用域规则:当存在标识符的嵌套声明
动态语义:通过程序的执行才能检查的语 义。
语义的描述
语义形式化方法: 1. 操作语义 2. 指称语义 3. 公理语义 4. 代数语义
语义分析的内容:
类型分析 标识符相关信息
语义分析的功能:
检查语义错误 构造标识符属性表(符号表)
语义分析的实现:
与语法分析相结合
语义分析的功能图示
语法分析树 TokenList
语义分析
语义定义 自然语言描述规定
符号表 判定
三种内部表示
标识符的内部表示 类型的内部表示 值的内部表示
标识符的内部表示
标识符种类:
常量名、类型名、变量名、函数名、过程名、域名。
TYPE idkind=( consKind, typeKind, varKind,
fieldKind, procKind,funcKind )
sub: Size Kind HostType Low Up
enum: Size
Kind
Elems Leng
array: Size Kind IndexType ElemType
record: Size Kind FixBody VariBody
FixBody: id FixUnitType Off Next
符号表的实现
用局部符号表实现 proc p:x,y,z
proc p1:x,y1,z1 proc p2:y y,z x,y1,z1,y
proc p3:z,a x,y,a
x,z
符号表的实现
用全局符号表实现 proc p0:x,y proc p1:x,z y proc p2:x1,y1 y x,z
语义分析例子
值的内部表示
非结构类型值的内部表示:
实型 指针 有序类型:整数形式
有序类型的常量表示:
整型常量: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,则值空间
类型的内部表示
类型的种类:标准、子界、枚举、数组、记录、
集合、文件、指针类型等等。 TypeKind=(intTy,boolTy,charTy,realTy,enumTy,
subTy,arrayTy,recordTy,setTy,fileTy,pointerTy)
内部表示:(TypeIR)
标准类型: Size Kind
内部表示(AttributeIR):
常量: TypePtr Kind
Value
类型: TypePtr Kind
Forward
变量: TypePtr Kind Access Level Off
域名*: TypePtr Kind
Off
过函:
TypePtr Kind Level Parm Class
HostType Off Code Size Forward
符号表的种类:全局符号表、局部符号表
原则:
▪ 进入一个局部化区时,记录本层符号表的 位置
▪ 遇到定义性标识符时,构造其语义信息, 查本层符号表,若存在,则有重复声明错 误,否则将语义信息填入表中
▪ 遇到一个使用性标识符时,查表(从里层 到外层),查不到则有未定义标识符错 误,否则构造新的TOKEN
▪ 退出一个局部化区时,作废本层符号表
语义分析和符号表
主要内容: 语义分析概述(必要性、功能、描述方法) 符号表 类型表达式 声明和程序体的语义分析
语义分析的必要性
语法和语义的区别: 语法:关于什么样的字符串才是该语言 在组成结构上合法的程序的法则。 语义:关于结构上合法的程序的意义的 法则。
语义分析的功能
语义种类
静态语义:在编译阶段(从程序文本上)可 以检查的语义。
例有声明如下: 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 的属性表示。
为[ord(C1)...ord(C2)]
符号表
标识符的作用: 声明部分:定义了各种对象及对应的属性和 使用规则。 程序体:对所定义的对象进行各种操作。
必要性 Token: $id idname 新表-符号表(种类、类型等信息):
Idname AttributeIR
有关符号表的操作: 添加、作用域删除、查询
program p() type at=array[1..100] of array[1..10] of inteter var x:real; a:at; i:integer; proc p1(var a1:at; a2:at) var x:integer; a:real; proc p2(n:integer) var m:1..50; x:real; m,n,x(使用性出现) end a1,a2,x,a,i(使用性出现) end x,a,i(使用性出现)
时,最近定义的属性为标识符的当前属性 局部化单位:允许有声明的程序段
P: Var x ,y,z x:=0;
Q: Var x,m,n
x:=1; m:=x+1;
y:=x+1;
局部化区入口
Proc p(… Func f(… 形式过/函 p( … f(… Record begin…
标识符处理的原则