• 赋值
• (ASSIG, id1, n, id2) --- 把id1的值赋值给id2(长度为n)
• I/O 操作
• (READI, _ , _ , id)
--- 输入整数到id
• (READF, _ , _ , id)
--- 输入实数到id
• (WRITE, _ , _ , id)
--- 把id的值输出
中间代码生成在编译器中的作用
词法分析 语法分析 语义分析
分析
目标代码生成 中间代码优化
中间代码生成
合成
中间代码生成
• 中间代码生成是将源程序翻译成等价中间表示的过程 • 中间代码生成 不是编译程序的必经阶段
• 生成中间代码的目的有二:
• 增强语言的可移植性 • 进行中间代码级别的优化
• 中间代码生成方法:
-带括号表达式的后缀式生成
• 注意: 任何运算符的优先级都大于 ‘(’;
• (1)初始化: S1和S2为空; (2) 读token: tk=ReadOne();
• (3) Switch tk of
•
(i) #: if (S1为空) exit;
•
else while (S1不为空)
/*产生剩余运算符的后缀表示*/
• 临时变量的层数为-1,偏移为编号,mode = dir或indir
为便于阅读, 课件和书中用对应的变量名, 函 数名或者标号, 值等代替相应的FORM结构
作业
• 请写出下列表达式的后缀式表示.
• (a * (b-d) + d) * a + (c-e)/d • (a+b) *(c+d) – (a+b+c)
• 源程序级别优化取决于用户对算法的取舍 • 编译程序可进行中间代码和目标代码上的优化