语义分析 主要内容: 语义分析概述 ( 必要性、功能、描述方法 ) 符号表 类型表达式 声明和程序体的语义分析
语义分析的必要性 语法和语义的区别; 语法:关于什么样的字符串才是该语言 在组成结构上合法的程序的法规。 语义:关于结构上合法的程序的意义的 法则。
语义分析的功能 语义种类 静态语义:在编译阶段 ( 从程序文本上 ) 可 以检查的语义。 动态语义:通过程序的执行才能检查的语 义。
语义的描述 语义形式化方法: 1. 操作语义 2. 指称语义 3. 公理语义 4. 代数语义
语义分析的内容: 类型分析; 标识符相关信息; 语义分析的功能: 检查语义错误 构造标识符属性表(符号表) 语义分析的实现: 与语法分析相结合
语义分析的功能图示 语义分析 语法分析树 TokenList 语义定义 自然语言描述规定 符号表 判定
标识符的内部表示 类型的内部表示 值的内部表示 三种内部表示
Cod e 标识符的内部表示 标识符种类: 常量名、类型名、变量名、函数名、过程名、域名。 TYPE idkind=( consKind, typeKind, varKind, fieldKind, procKind,funcKind ) 内部表示( AttributeIR ): 常量: 类型: 变量: 域名 * : 过函: ValueKindTypePtr ForwardKindTypePtr OffLevelAccessKindTypePtr HostTypeOffKindTypePtr SizeForward ClassPar m LevelKindTypePtr 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 子界常量:设有子界类型 C 1..C 2, 则值空间 为 [ord(C 1 )...ord(C 2 )]