- 1、本文档共78页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[编译原理讲义.5.
编译程序设计原理与技术 类型检查 §5 类型检查 学时:4 知识点:类型体制 各语法成分的类型检查 符号表 §5 类型检查 5.1 语义分析的概念 5.2 类型体制 5.3 简单类型检查器的说明 5.4 类型表达式的等价 5.5 类型检查有关的其他主题 5.6 符号表 小 结 作 业 5.1 语义分析的概念 程序设计语言的结构由上下文无关文法来描述 程序结构正确与否与该结构的上下文有关,如: 变量的作用域问题 同一作用域内同名变量的重复声明问题 表达式、赋值语句中的操作数的类型一致性问题 思考: 设计上下文有关文法来描述语言中上下文有关的结构? 理论上可行,构造有困难,构造相应的分析器更困难 解决办法: 设计专门的语义动作补充上下文无关文法的分析器 利用语法制导翻译技术实现语义分析 上下文有关信息的记录与使用 符号表 记录编译过程中识别出的上下文有关的信息,如: 变量的类型 相对地址 信息的引用 根据词法分析器识别出的标识符的属性值(标识符在符号表中的入口),查找符号表中对应该标识符的记录,从而可以取得该标识符有关的信息。 如果编译的程序块处于该变量的作用域内,则这个变量将一直保留在符号表中 静态检查 动态检查:目标程序运行时进行的检查 静态检查:读入源程序、但不执行源程序的情况下进行的检查,包括: 类型检查 对访问数据的操作和被访问数据的类型进行检查,检查操作的合法性和数据类型的相容性。 控制流检查 检查控制流语句是否使控制转移到一个合法的位置。 一致性检查 有些场合要求所定义的对象恰好被定义一次 一个标识符在同一程序块中必须而且只能被说明一次 CASE语句中用于匹配选择表达式的常量必须各不相同 枚举类型定义中的各元素不允许重复 有些场合要求标识某结构的名字必须出现两次或两次以上 类型检查 由类型检查器完成 检验结构的类型是否和它的上下文所期望的一致 算术运算符mod 用户定义的函数,实参与形参一致 类型检查器的位置 5.2 类型体制 设计类型检查器时要考虑的因素: 语法结构 类型概念 把类型指派给语言结构的规则 Pascal、C语言报告中关于类型的描述: 如果算术运算符加、减和乘的两个运算对象都是整型,那么结果是整型。 一元运算符的结果是指向运算对象所代表的实体的指针,如果运算对象的类型是‘…’,结果类型就是指向‘…’的指针。 暗示的概念: 每一个表达式有一个类型 类型有结构 一、类型表达式 类型表达式: 或者由一个基本类型组成,或者由类型构造器施于其他类型表达式组成 基本类型和类型构造器都取决于具体语言 本章使用的类型表达式定义: 基本类型是类型表达式:boolean、char、integer、和 real 专用基本类型: type_error错误类型:标志类型检查期间的错误 void回避类型:以允许检查语句(语句没有数据类型) 类型表达式可以命名,类型名是类型表达式。 类型构造器作用于类型表达式的结果仍是类型表达式 数组:如果T是类型表达式,那么array(I,T)是一个类型表达式,表示一个数组类型, T为元素类型, I为下标集合,I通常是一个整数域。 Pascal的例子:var A:array[1..10] of integer; 与A相关的类型表达式为:array(1..10,integer) 笛卡儿乘积:如果T1和T2是类型表达式,那么它们的笛卡儿乘积T1?T2也是类型表达式,假定?是左结合的。 如Pascal的程序片段: type row=record address:integer; lexeme:array[1..15] of char end; var table:array[1..10] of row; 函数:从定义域类型D到值域类型R的映射 类型由类型表达式 D?R 表示。 Pascal的内部函数mod: int?int?int 用户定义的Pascal函数:function f(a,b:char):?integer; f的类型表达式:char?char?pointer(integer) 函数g: 参数是把整数映射成整数的函数 返回结果是和参数类型相同的另一函数 g的类型表达式为: (integer?integer)?(integer?integer) 类型表达式可以包含变量(称为类型变量),变量的值是类型表达式。 类型表达式的有向图 利用语法制导翻译技术为类型表达式构造树或dag 内部结点:类型构造器 叶结点:基本类型、类
文档评论(0)