编译原理 第七章语义分析和中间代码生成
编译原理 第七章 语义分析和中间代码生成
编泽原理 婚义分轿知中间代号产生 紧接在词法分析和语法分析之后, 编译程序要做的工作就是 进行静态语义检查和翻译。 琶静态语义检查 (1)类型检查。如果操作符作用于不相容的操作数,编译程序 必须报告出错信息。 (2)控制流检查。控制流语句必须使控制转移到合法的地方。 (3)一致性检查。在很多场合要求对象只能被定义一次。 (4)相关名字检查。 其它如名字的作用域分析等。 第2页
编译原理 第2页 语义分析和中间代码产生 紧接在词法分析和语法分析之后,编译程序要做的工作就是 进行静态语义检查和翻译。 静态语义检查 (1)类型检查。如果操作符作用于不相容的操作数,编译程序 必须报告出错信息。 (2)控制流检查。控制流语句必须使控制转移到合法的地方。 (3)一致性检查。在很多场合要求对象只能被定义一次。 (4)相关名字检查。 其它如名字的作用域分析等
编译原理 婚义分桥和中国代号产生 曼使用中间语言的好处 (1)便于进行与机器无关的代码优化工作; (2)使编译程序改变目标机更容易: (3)使编译程序的结构在逻辑上更为简单明确。以中 间语言为界面,编译前端和后端的接口更清晰。 第3页
编译原理 第3页 语义分析和中间代码产生 使用中间语言的好处 (1)便于进行与机器无关的代码优化工作; (2)使编译程序改变目标机更容易; (3)使编译程序的结构在逻辑上更为简单明确。以中 间语言为界面,编译前端和后端的接口更清晰
编泽原理 特义分前和中闻代号产矣 图7.1静态检查和中间代码产生的地位 (go on sto p 第页
编译原理 第4页 语义分析和中间代码产生
编泽原理 婚义分桥和中国代号产生 本章内容目绿 中间语言 赋值语句的翻译 档后缀式 简单算术表达式及赋值语句 雪图表示法 数组元素的引用 当 三地址代码 布尔表达式的翻译 墨说明语句 酒数值表示法 过程中的说明谙旬 作为条件控制的布尔式翻译 保留作用域信息 控制语句的翻译 记录中的域名 第5页
编译原理 第5页 语义分析和中间代码产生 本章内容目录 中间语言 后缀式 图表示法 三地址代码 说明语句 过程中的说明谙旬 保留作用域信息 记录中的域名 赋值语句的翻译 简单算术表达式及赋值语句 数组元素的引用 布尔表达式的翻译 数值表示法 作为条件控制的布尔式翻译 控制语句的翻译
编泽原理 特义分行和中闻代弱户生 中间语言 几种常见的中间语言形式 后缀式 三地址代码(包括三元式、四元式、间接三元式) DAG图表示 第6列
编译原理 第6页 语义分析和中间代码产生 中间语言 几种常见的中间语言形式 后缀式 三地址代码(包括三元式、四元式、间接三元式) DAG图表示
编泽原理 婚义分桥和中国代号产生 后缀式 后缀式表示法又称逆波兰表示法。 这种表示法是把运算量(操作数)写在前面,把算符写在后 面(后缀)。 例如,把a十b写成ab+,把a*b写成ab*。 第7觉
编译原理 第7页 语义分析和中间代码产生 后缀式 后缀式表示法又称逆波兰表示法。 这种表示法是把运算量(操作数)写在前面,把算符写在后 面(后缀)。 例如,把a十b写成ab+,把a*b写成ab*
编泽原理 特义分行和中闻代弱产熊 一个表达式E的后缀形式 (1)如果E是一个变量或常量,则E的后缀式是E自身。 (2)如果E是E1opE2形式的表达式,这里op是任何二元操作 符,则E的后缀式为E1E2op,这里E1'和E2'分别为E1和E2 的后缀式。 (3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后 缀式。 后缀式表示法用不着使用括号。根据运算量和算符出现的 先后位置,以及每个算符的目数,就完全决定了一个表达式 的分解。 第8负
编译原理 第8页 语义分析和中间代码产生 一个表达式E的后缀形式 (1)如果E是一个变量或常量,则E的后缀式是E自身。 (2)如果E是E1 op E2 形式的表达式,这里op是任何二元操作 符,则E的后缀式为E1′E2′op,这里E1′和E2′分别为E1和E2 的后缀式。 (3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后 缀式。 后缀式表示法用不着使用括号。根据运算量和算符出现的 先后位置,以及每个算符的目数,就完全决定了一个表达式 的分解
编译原理 婚义分桥和中闻代号产熊 只要知道每个算符的目数,对于后缀式,不论从哪一端进行 扫描,都能对它正确进行唯一分解。 表7.1 把表达式翻译成后缀式的语义规则描述 产生式 语义规则 E→E1opE2 E.code:=E1-codel lEz.codel lop E→(E) E.code:=E1.code E→id E.code:=id 第9觉
编译原理 第9页 语义分析和中间代码产生 只要知道每个算符的目数,对于后缀式,不论从哪一端进行 扫描,都能对它正确进行唯一分解
编泽原理 语义分折和中闻代弱产美 图表示法 包括DAG与抽象语法树 无循环有向图(Directed Acycli简称DAG)。 与抽象语法树一样,对表达式中的每个子表达式, DAG中都有一个结点。一个内部结点代表一个操作符,它 的孩子代表操作数。 与抽象语法树不同的是,在一个DAG中代公共子表达 式的结点具有多个父结点,而在一棵抽象语法树中公共子表 达式被表示为重复的子树。 第0
编译原理 第10页 语义分析和中间代码产生 图表示法 包括DAG与抽象语法树 无循环有向图(Directed Acycli简称DAG)。 与抽象语法树一样,对表达式中的每个子表达式, DAG中都有一个结点。一个内部结点代表一个操作符,它 的孩子代表操作数。 与抽象语法树不同的是,在一个DAG中代公共子表达 式的结点具有多个父结点,而在一棵抽象语法树中公共子表 达式被表示为重复的子树