语义分析
主要内容:
? 语义分析概述 (必要性、功能、描述方法 )
? 符号表
? 类型表达式
? 声明和程序体的语义分析
语义分析的必要性
?语法和语义的区别;
语法,关于什么样的字符串才是该语言
在组成结构上合法的程序的法规。
语义,关于结构上合法的程序的意义的
法则。
语义分析的功能
? 语义种类
静态语义,在编译阶段 (从程序文本上 )可
以检查的语义。
动态语义,通过程序的执行才能检查的语
义。
? 语义的描述
语义形式化方法:
1,操作语义
2,指称语义
3,公理语义
4,代数语义
? 语义分析的内容:
类型分析;
标识符相关信息;
? 语义分析的功能:
检查语义错误
构造标识符属性表(符号表)
? 语义分析的实现:
与语法分析相结合
语义分析的功能图示
语义分析语法分析树TokenList
语义定义
自然语言描述规定
符号表
判定
?标识符的内部表示
?类型的内部表示
?值的内部表示
三种内部表示
Code
?标识符的内部表示
?标识符种类:
常量名、类型名、变量名、函数名、过程名、域名。
TYPE idkind=( consKind,typeKind,varKind,
fieldKind,procKind,funcKind )
?内部表示( AttributeIR):
常量:
类型:
变量:
域名 *:
过函:
ValueKindTypePtr
ForwardKindTypePtr
OffLevelAccessKindTypePtr
HostTypeOffKindTypePtr
Size ForwardClassParmLevelKindTypePtr
Off
? 例有声明如下:
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
的属性表示。
? 类型的内部表示
? 类型的种类,标准、子界、枚举、数组、记录、
集合、文件、指针类型等等。
TypeKind=(intTy,boolTy,charTy,realTy,enumTy,
subTy,arrayTy,recordTy,setTy,fileTy,pointerTy)
? 内部表示,(TypeIR)
标准类型:
sub,
enum,
array:
UpLowHostTypeKindSize
LengElemsKindSize
ElemTypeIndexTypeKindSize
KindSize
record:
FixBody:
VariBody:
set,
file:
pointer,
VariBodyFixBodyKindSize
NextOffFixUnitTypeid
VariUnitsCaseUnit NextVariBodyFixBody
OffCaseTypeid
BaseTypeKindSize
CompTypeKindSize
TypeNameKindSize
?例有如下的类型定义:
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
构造类型的内部表示。
? 值的内部表示
? 非结构类型值的内部表示:
实型:
指针:
有序类型:整数形式
有序类型的常量表示:
? 整型常量,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)]