6第六章 语义分析2.pdfVIP

  • 11
  • 0
  • 约7.22千字
  • 约 35页
  • 2018-10-19 发布于山东
  • 举报
第6章 语义分析和中间代码生成 主要内容 语义分析 中间代码生成 • 方案2:自底向上分析——LR分析法 解决步骤: (1)写出简单算术表达式的文法(为了简单起见 只考虑+、*符号运算) E’→E E→E+T|T, T→T*F|F, F→(E)|i (2 )画出对应的LR(0) DFA——采用SLR(1)分 析法 例:3+4*5 DFA图 (3 )构造规则的语义动作 根据后缀表示与前缀表示运算对象出现顺序的的一致性, 遇到运算对象通过栈保存。 规则归约时加入相应的含义。因此: 规则F→i,添加的语义动作为:i入栈 规则E→E+T,添加的语义动作为:+入栈 规则E→T*F,添加的语义动作为:*入栈 对应规则的语义函数为: 规则 语义函数 E’→.E ( ) E→E+T (Post[p]=‘+’;p=p+1) E→T ( ) T→T*F (Post[p]=‘*’;p=p+1) T→F ( ) F→(E) ( ) F→I (Post[p]=I;p=p+1) 分析翻译过程——生成后缀表示 例:3*4+5 用SLR(1)分析法进行语义分析翻译生成后缀表示 式的过程 LR(0) DFA图遍历 扩充的后缀表示 赋值语句: a=e的波兰表示为a e= a=b*(c+b)的波兰表示为a b c b+*= 数组: a[e]的波兰表示为e a SUBS 其中SUBS表示计算数组下标的运算 条件语句if (u ) S1 else S2 则对应的后缀表示为 u L1 BZ S1 L2 BR S2 ——BZ为双目运算符,表示当u不成立(为零) 时转向标号L1部分继续执行 ——L1表示语句S2开始执行的位置。 ——BR为一个单目运算符,表示无条件转向L2 部分继续执行 ——L2表示语句S1开始执行的位置。 例:if (m n )k=1 ;else m=0; 后缀表示为 m n 10 BZ k1= 20 BR 10: m0= 20: 循环语句 FOR循环、WHILE 循环、REPEAT UNTIL循环 可以根据其计算机的执行顺序分别转换为后缀表 示即可。 2. 四元组和三元组 2.1 四元组的表示方法 (OP , P1 , P2 , T) 其中OP为运算符,OP1、OP2 为运算对象,T为 计算结果的临时暂存变量。 注意:在按语法制导翻译实际产生的四元组中, OP用一个整数码表示,它除了标识运算符的种类 之外,还附带地表示其它一些语义特性。 P1、P2 、T表示一个指向符号表某一登记的入口 位置或者一个临时变量的整数码。 意味着在产生中间代码的过程中,也相应地进行 查找符号表的工作——与符号表打交道。 例:对于表达式 a*(b+c)对应的四元组为: ( + , b , c , T1) (*, a , T1, T2) 一个问题:如何将一个中缀表达式表示成四元组 (1)手动方法 (2 )语法分析加语义动作的方法 • 2.2三元组的表示方法 (OP , P1 , P2 ) 其中OP为运算符,P1、P2 为运算对象。用元组 编号来代表结果保存的位置。 表达式a*(b+c)对应的三元组为: (1) ( + , b , c ) (2 ) (*, a , (1)) 问题:如何将一个中缀表达式表示成三元组。 (1)手动方法 (2 )语法分析加语义动作的方法 • 2.3 四元组的扩充表示 赋值语句a=e,先将e表示为四元组,再将= 运算转换为四 元组。 如a=b+c,则四元组表示为: (+, b ,

文档评论(0)

1亿VIP精品文档

相关文档