编译原理课件 第7章 语义分析与中间代码的产生.ppt

编译原理课件 第7章 语义分析与中间代码的产生.ppt

编译原理课件 第7章 语义分析与中间代码的产生

Ch7.语义分析和中间代码产生 本章在编译程序中的地位 语义分析和中间代码的产生 语义分析的概念: 源程序经过词法分析、语法分析后,表明该源程序书写正确、符合程序语言所规定的语法,但语法分析并未对程序内部的逻辑含义加以分析,因此编译程序接着进行语义分析,即审查每个语法成分的静态语义。如果静态语义正确,则生成与该语言成分等效的中间代码,或直接生成目标代码。 教学要求 掌握: 1. 逆波兰式, DAG图, 抽象语法树, 三地址代码, 三元式, 四元式等中间代码表示; 2. 简单赋值语句的翻译, 带数组元素引用的赋值句的翻译; 3. 布尔表达式的翻译, 控制语句中布尔表达式的翻译; 4. 控制语句的翻译。 了解理解:说明语句的翻译,过程调用和参数的处理。 教学内容 7.1 中间语言 后缀式,DAG,三地址码(四元式,三元式,间接三元式) *7.2 说明语句的翻译 7.3 赋值语句的翻译,数组元素引用的翻译 7.4 布尔表达式的翻译 求布尔式值的翻译,作为控制条件的翻译 7.5 控制语句的翻译 if , while , goto , case 7.6 过程调用的处理, 参数传递的处理 *7.7 类型检查(不作要求,不讲) 7.1 中间语言 要掌握几种中间语言的基本结构: 逆波兰表示即后缀式 抽象语法树 DAG图 三地址代码(四元式、三元式、间接三元式) 7.1.1 后缀式 波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示法,又称逆波兰式表示法。 后缀式这种方法是,把运算量(操作数)写在算符的前面,把算符写在运算量的后面(后缀)。 后缀式的定义(P167.) 一个表达式的后缀式可以如下定义: 1. 如果E是一个变量或常量,则E的后缀式是E自身。 2. 如果E是 E1 op E2 形式的表达式,这里op是任何二元操作符,则E的后缀式为 E1’E2’op,这里E1’ 和E2’分别为E1和E2的后缀式。 3. 如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。 要求会正确写出表达式的后缀式。 后缀式求值 可以使用一个栈来求值 求值过程: 从左到右扫描后缀式,每碰到运算量就把它 推进栈,每碰到k目运算符就把它作用于栈顶 的k个项,弹出这k项,并用运算结果来代替这 k个项 后缀式:例 写表达式的后缀式要点: 1.后缀式中运算量的顺序与中缀式的相同; 2.算符出现的次序即表达式的运算次序; 3.不使用括号。 例:a+b ab+ a*(b+c) abc+* (a+b)*(c+d) -a+b*c a?bc*+ a/b*c-d*e x := a-b/(c+d) 用 ?表示取负算符(uminus) := 表示赋值算符(assign) 7.1.2 抽象语法树 语法制导翻译以语法树作基础, 实际上, 语法树可以作为一种合适的中间语言形式。 现在对语法树进行改造,去掉那些对翻译不必要的信息,将语法树进行抽象 --- 抽象语法树。 在表达式的抽象语法树中,运算符、关键字不作叶子结点而作为内部结点,叶子结点只是运算量。 抽象语法树也可以属性化,给结点加上属性变成带附注的抽象语法树。 语法制导翻译既可以基于语法分析树也可以基于抽象语法树进行,采用的基本方法是一样的。 抽象语法树:简例 例,为下面文法的句子 a-4+c 建立抽象语法树。 E? E+T | E-T | T T? (E) T? id | num 为每个运算量或运算符号都建立一个结点。 可以根据表达式的运算顺序自下而上的构造 --- 手工构造。 7.1.3 DAG图表示法: 无循环有向图(DAG ) 与语法树一样,对于表达式中的每个子表达式,DAG图中都有一个结点: 一个内部结点代表一个操作符,它的孩子代表操作数; ??两者不同的是 在DAG图中代表公共子表达式的结点具有多个父结点; 在一棵抽象语法树中公共子表达式被表示为重复的子树; 例如赋值语句的语法树与DAG图:a:=b * - c+b * -c 后

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档