- 26
- 0
- 约9.72千字
- 约 57页
- 2019-05-06 发布于广东
- 举报
第11章 语义分析和中间代码生成 一、语义分析概述 1. 语义分析的任务 语义检查:一致性检查(类型是否一致);越界检查(数组维数是否正确)。 语义处理:对说明语句,将信息登记在符号表中;对执行语句,生成中间代码。 2. 语义分析和语法分析的关系 语法分析只能判断一个句子是否合法,不能给出句子的含义。句子的含义是通过语义分析体现出来的。 例:一个计算程序对表达式“i+j”的分析过程。 表达式文法G(E) : E → E + E | E – E | E * E | E / EE → iE → j 仅执行语法分析 结合了语义分析的语法分析 1) 语义值 赋予每个文法符号X以各种不同的值,这些值称为语义值。 语义值的表示形式为:X.XXX 如:S.VALUE、i.VALUE、i.TYPE 例:结合了语义分析的LR分析法。 … X?AB Y?CD Z?XY … 2) 语义动作和语义子程序 每当用一个产生式进行匹配或规约时,需要执行相应的动作对语义值进行操作,这些动作称为语义动作。 语义动作由语义子程序完成,每个产生式对应一个语义子程序。 语义子程序 (1) E → E1 + E1 { E.VAL := E1.VAL + E1.VAL } (2) E → i { E.VAL := i.VAL } (3) E → j { E.VAL := j.VAL } 语义分析与语法分析同步进行,一旦语法分析认为“i+j”合法,它的值也就被语义子程序计算出来了(例如前面计算程序的例子)。 3) 语法制导翻译 语义子程序不仅要计算语义值,还需要将源语句翻译成等价的中间代码语句。随着语法分析的进行,中间代码也逐步生成。当语法分析完成时,也就获得了与源程序等价的中间代码程序。 在语法分析的过程中,根据每个产生式所对应的语义子程序进行翻译(生成中间代码)的方法称为语法制导翻译。 3. 中间代码 四元式 ( OP, ARG1, ARG2, RESULT ) OP — 运算符 ARG1 — 第1运算量 ARG2 — 第2运算量 RESULT — 结果 规定: (1) 如果OP是一元运算符,则ARG2可以省略。 (2) 如果OP是算术运算符或逻辑运算符,则RESULT必须是临时变量,用于存放临时运算结果。 例:语句 a: = - b * ( c + d ) 对应的中间代码为 (1) (@, b, _, T1) /* @表示取负值 */ (2) (+, c, d, T2) (3) (*, T1, T2, T3) (4) (:=, T3, _, a) 注意:四元式的出现顺序和表达式的计算顺序(即语法分析时规约的顺序)是一致的。 翻译的结果(中间代码及相关表格) 4. 翻译中用到和函数和变量 (1) entry(i) 语义函数,对符号 i 查符号表,如果存在,返回符号 i 在符号表中的位置。 (2) newtemp() 语义函数,产生一个新临时变量,并返回该临时变量的整数编码(即:T1、T2、…、Tn) 。 (3) E.PLACE 语义变量,表示非终结符E对应的变量在符号表中的位置(普通变量),或整数编码(临时变量)。 (4) gen (OP, ARG1, ARG2, RESULT) 语义函数,生成一个新的四元式,添加到四元式序列的结尾。(注:用ip指针指向四元式表的结尾,则每次调用gen(…)时,将该四元式添加到 ip 指向的位置,然后 ip:=ip+1,指向新的结尾。) 二、赋值语句的翻译 A → i := E { gen( := , E.PLACE , _ , entry(i) ) } E → i { E. PLACE := entry(i) } E → - E1 { E.PLACE := newtemp(); gen (@, E1.PLACE, _, E.PLACE) } E →(E1) { E.PLACE := E1. PLACE } E→E1 + E2 { E.PLACE := newtemp(); gen (+, E1.PLACE, E2.PLACE, E.PLACE) } … 例子:a:=-b*(c+d)的语法分析 例子:a:=-b*(c+d)的翻译 4. E1 → i E1.PLACE = entry(i) = b 5. E2 → - E1 E2.PLACE = newtemp() = T1 gen ( @, b , _ , T1) 9. E3 → i E3.PLACE = entry(i) = c 12. E4 → i E4.PLACE = entr
原创力文档

文档评论(0)