第六章 语义分析(3).pptx
《第六章 语义分析(3).pptx》由会员分享,可在线阅读,更多相关《第六章 语义分析(3).pptx(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 语义分析语义分析l6.1 语义分析概述语义分析概述l6.2 符号表符号表l6.3 类型的语义分析类型的语义分析l6.4 声明的语义分析声明的语义分析l6.5 程序体的语义分析程序体的语义分析l6.6 属性文法和动作文法属性文法和动作文法内容回顾l什么是语义分析什么是语义分析?建立符号表建立符号表;检查语义错误检查语义错误;l在何处进行分析在何处进行分析?声明部分声明部分 -建立符号表;检查建立符号表;检查“重复声明重复声明”错误错误;体部分体部分 -查找符号表,检查查找符号表,检查“有使用无声明有使用无声明”错误和错误和类型相关的错误类型相关的错误;l怎样进行语义分析怎样进行语义
2、分析?属性文法属性文法动作文法动作文法基于语法树的语义分析基于语法树的语义分析;6.3 类型的语义分析l基本概念基本概念类型等价性类型等价性类型相容性类型相容性l类型的语义分析分析什么类型的语义分析分析什么?l在何处分析在何处分析?l怎样分析怎样分析?6.3 类型的语义分析l类型等价性类型等价性按名等价按名等价按结构等价按结构等价typedef int T110;typedef int T210;T1 a,b;T2 c,d;6.3 类型的语义分析l类型相容性类型相容性具体的编译器定义不同具体的编译器定义不同;常见的三种相容性常见的三种相容性l操作分量相容操作分量相容l赋值相容性赋值相容性l形参
3、和值参相容性形参和值参相容性6.3 类型的语义分析l类型的语义分析分析什么类型的语义分析分析什么?建立类型的内部表示建立类型的内部表示;检查类型定义中的语义错误检查类型定义中的语义错误;l在何处进行语义分析在何处进行语义分析?类型声明类型声明 变量声明变量声明参数声明参数声明类类Pascal语言的抽象语法树语言的抽象语法树 类型声明类型声明 变量声明变量声明 过程声明过程声明 根结点根结点ProK 类型声明类型声明 TypeK 变量声明变量声明VarK 程序体程序体 StmLK 程序头程序头 PheadK 声明声明1 声明声明n 声明声明1 声明声明n 语句语句n 语句语句1 过程声明过程声明
4、1 过程声明过程声明n 语句语句n 语句语句1 形参形参n 形参形参1 过程体过程体StmLK 类C语言的抽象语法树程序程序Root节点节点 Node1节点节点 Node2节点节点 Noden节点节点 Node常量声明常量声明类型声明类型声明变量声明变量声明函数声明函数声明FunNode1FunNode1FunNode1语句语句形参声明形参声明类型的语义分析l怎样分析怎样分析?根据类型的不同,分别建立它们的内部表示根据类型的不同,分别建立它们的内部表示;l类型名类型名;l基本类型;基本类型;l枚举类型;枚举类型;l数组类型;数组类型;l结构类型;结构类型;l联合类型;联合类型;l指针类型;指针
5、类型;l递归类型递归类型6.3 类型的语义分析l类型名类型名 查找符号表,取得名字对应的内部表示查找符号表,取得名字对应的内部表示;l基本类型基本类型 由系统预定义好并存储在符号表中,可以直接引用由系统预定义好并存储在符号表中,可以直接引用NameKindTypePtrinttypeKindintPtrbooltypeKindboolPtrchartypeKindcharPtrrealtypeKindrealPtrintSizeintTySize KindboolSizeboolTyrealSizerealTycharSizecharTy6.3 类型的语义分析l枚举类型枚举类型一般形式一般形式
6、:(id1,idn)常量标识符常量标识符:(id1,intType,constKind,0)(idn,intType,constKind,n-1)建立常量标识符的内部表示建立常量标识符的内部表示;建立枚举类型的内部表示建立枚举类型的内部表示;Size Kind EList1enumTyid1 idn nil 6.3 类型的语义分析l数组类型取得数组的下界Low和上界Up;获取或建立成分类型的内部表示指针;计算数组类型的空间大小:size=sizeof(ElemTyp)(Up-Low+1)建立数组类型的内部表示;Size Kind LowUpElemTyarrayTy6.3 类型的语义分析l结构
7、体结构体对每个域名标识符,建立其类型的内部表示对每个域名标识符,建立其类型的内部表示;将所有域的指针链起来形成一个链,表示结构将所有域的指针链起来形成一个链,表示结构体体;将各个域的将各个域的size的和作为结构体的的和作为结构体的size;建立结构体的内部表示建立结构体的内部表示;Size Kind BodystructTy6.3 类型的语义分析l联合体联合体对每个域名标识符,建立其类型的内部表示对每个域名标识符,建立其类型的内部表示(每个域每个域的偏移都是的偏移都是0);将所有域的指针链起来形成一个链,表示联合体将所有域的指针链起来形成一个链,表示联合体;将将size最大的域的最大的域的s
8、ize作为联合体的作为联合体的size;建立联合体的内部表示建立联合体的内部表示;Size Kind BodyunionTy6.3 类型的语义分析l指针类型指针类型取得基类型的指针取得基类型的指针;建立指针类型的内部表示建立指针类型的内部表示;l递归类型递归类型Typedef struct treenode int val;struct treenode*left;struct treenode*right;TreeNode;方法方法:回填回填;第六章第六章 语义分析语义分析l6.1 语义分析概述语义分析概述l6.2 符号表符号表l6.3 类型的语义分析类型的语义分析l6.4 声明的语义分析声
9、明的语义分析l6.5 程序体的语义分析程序体的语义分析l6.6 属性文法和动作文法属性文法和动作文法6.4 声明的语义分析声明的语义分析l一般过程一般过程收集被声明的标识符的属性收集被声明的标识符的属性;建立被声明标识符的内部表示建立被声明标识符的内部表示;检查重复声明错误检查重复声明错误;将被声明标识符的内部表示插入符号表将被声明标识符的内部表示插入符号表;l程序设计语言的声明程序设计语言的声明 常量声明常量声明类型声明类型声明变量声明变量声明函数声明函数声明标号声明标号声明(可选可选)类类Pascal语言的抽象语法树语言的抽象语法树 类型声明类型声明 变量声明变量声明 过程声明过程声明 根
10、结点根结点ProK 类型声明类型声明 TypeK 变量声明变量声明VarK 程序体程序体 StmLK 程序头程序头 PheadK 声明声明1 声明声明n 声明声明1 声明声明n 语句语句n 语句语句1 过程声明过程声明1 过程声明过程声明n 语句语句n 语句语句1 形参形参n 形参形参1 过程体过程体StmLK 类型声明类型声明TypeK类C语言的抽象语法树程序程序Root节点节点 Node1节点节点 Node2节点节点 Noden节点节点 Node常量声明常量声明类型声明类型声明变量声明变量声明函数声明函数声明FunNode1FunNode1FunNode1语句语句形参声明形参声明6.4 声
11、明的语义分析l常量声明常量声明一般形式一般形式:#define id number内部表示内部表示:l建立建立 number值的内部表示值的内部表示;l建立建立 number类型的内部表示类型的内部表示;l建立建立 id的内部表示的内部表示;TypePtrKindValueconstKind6.4 声明的语义分析l类型声明类型声明一般形式一般形式:typedef id type;内部表示内部表示:l建立建立 type的内部表示的内部表示;l建立建立 id的内部表示的内部表示;TypePtrKindtypeKind6.4 声明的语义分析l变量声明变量声明一般形式一般形式:type id;内部表示
12、内部表示:l建立建立 type的内部表示的内部表示;l获取获取l确定存取方式确定存取方式:dir/indirl建立建立 id的内部表示的内部表示;lCurrentOffset+=sizeof(type)TypePtrKindAccessLevelOffsetvarKind6.4 声明的语义分析l函数函数/过程声明过程声明一般形式一般形式:type id(params)body 分析过程分析过程:l建立建立 type的内部表示的内部表示;lCurrentOffset=0;l建立参数的内部表示建立参数的内部表示(层数为层数为CurrentLevel+1);l将参数内部表示链成表将参数内部表示链成表
13、;l建立建立 id 的内部表示的内部表示(层数为层数为 CurrentLevel);lCurrentLevel+;lCode属性需要等待代码生成后回填属性需要等待代码生成后回填;lSize 需要等函数的局部变量全部处理完后才能确定需要等函数的局部变量全部处理完后才能确定;TypePtrKindClassLevelParamCode Size ForwardroutKindactual6.4 声明的语义分析l标号声明标号声明不同的程序设计语言具有不同的标号处理机制不同的程序设计语言具有不同的标号处理机制;标号相关的语法结构标号相关的语法结构:l标号声明标号声明l标号定位标号定位;l跳转语句跳转语
14、句;标号相关的语义错误标号相关的语义错误l标号重复定位标号重复定位;l标号有使用无定位标号有使用无定位;lGoto语句转入结构语句语句转入结构语句,过程体过程体/函数体函数体;l标号重复声明标号重复声明;l标号有定位无声明标号有定位无声明;第六章第六章 语义分析语义分析l6.1 语义分析概述语义分析概述l6.2 符号表符号表l6.3 类型的语义分析类型的语义分析l6.4 声明的语义分析声明的语义分析l6.5 程序体的语义分析程序体的语义分析l6.6 属性文法和动作文法属性文法和动作文法6.5 程序体的语义分析l一般性检查语句中的标识符是否有声明;类型相关的语义错误;l程序体中不同元素有不同的细
15、节需要处理赋值语句条件语句循环语句函数调用语句表达式变量 6.5 程序体的语义分析l赋值语句赋值语句一般形式一般形式:var=Expression一般分析过程一般分析过程:l用用var查符号表,取得其类型属性查符号表,取得其类型属性;l计算计算 Expression结果值的类型属性结果值的类型属性;l检查检查 var 的类型和的类型和 Expression 的类型是否赋值相容的类型是否赋值相容;6.5 程序体的语义分析l条件语句条件语句一般形式一般形式:if Exp S1 else S2 一般过程一般过程:l检查检查 Exp 是否是是否是 boolean 类型类型;6.5 程序体的语义分析l循
16、环语句循环语句不同的循环不同的循环lWhile Exp S检查检查 Exp 是否是是否是 boolean类型类型;lFor i=E1 to E2 S检查检查 i、E1和和E2的类型是否兼容的类型是否兼容;6.5 程序体的语义分析l函数调用函数调用一般形式一般形式:f(E1,.,En)一般过程一般过程:l在符号表中查找在符号表中查找 f的属性的属性;l检查检查 f是不是是不是“routeKind”;l分析分析 Ei(i=1,n)的类型的类型;l检查实参的个数和形参的个数是否相同检查实参的个数和形参的个数是否相同;l检查第检查第i个实参的类型与第个实参的类型与第i个形参的类型是否兼容个形参的类型是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 语义分析3 第六 语义 分析
限制150内