第七章语法制导翻译和中间代码生成7.1语义处理概述7.2属性文法和语法制导翻译7.3中间代码生成(一些语句的翻译)7.4符号表源语言程序中间代码汇编代码词法分析语义分析语法分析中间代码生成代码生成在编译中的逻辑阶段前端处理后端处理语义处理7.1语义处理(语义分析和中间代码生成)源语言程序汇编代码词法分析语义分析语法分析代码生成前端处理后端处理语义处理语义处理语义处理语义处理的任务:•静态语义检查•静态语义:语法规则的良形式条件•静态语义检查:审查静态语义•动态语义处理•动态语义:程序单元执行的操作•动态语义处理:生成(中间/目标)代码语义处理语义处理的实现:•属性文法:描述语义规则。•语法制导翻译:在语法分析的同时,执行语义规则描述的动作:•检查静态语义•生成中间代码/目标代码语义处理语义处理的环境:符号表•为语义分析提供类型、作用域等信息。•为代码生成提供类型、作用域、存储类别、存储(相对)位置等信息。语义处理ifsym=callsymthenbegingetsym;ifsym<>identthenerror(14)elsebegini:=position(id);ifi=0thenerror(11)elsewithtable[i]doifkind=procedurthengen(cal,lev-level,adr)elseerror(15);getsymendendPL/0编译程序的语义处理(一)call语句的处理语义处理error11:标识符未说明;error12:赋值语句中,赋值号左部的标识符属性应为变量;error15:call后标识符的属性应为过程;error21:表达式内标识符属性不能为过程;error32:read语句括号中的标识符不是变量。…PL/0编译程序的语义处理(二)语义错误列表PL/0编译器的符号表consta=10;varb,c;procedurep;beginc:=b+a;end;beginread(b);whileb#0dobegincallp;write(2*c);read(b);endend.namekindvalleveladdresssizeaconstant10bvariable03cvariable04pprocedure03编译程序分析到第8行时符号表的内容consta=10;varb,c;procedurep;beginc:=b+a;end;beginread(b);whileb#0dobegincallp;write(2*c);read(b);endend.(0)jmp08转向主程序入口(1)jmp02转向过程p入口(2)int03过程p入口,为过程p开辟空间(3)lod13取变量b的值到栈顶(4)lit010取常数10到栈顶(5)opr02次栈顶与栈顶相加(6)sto14栈顶值送变量c中(7)opr00退栈并返回调用点(16)(8)int05主程序入口开辟5个栈空间(9)opr016从命令行读入值置于栈顶(10)sto03将栈顶值存入变量b中(11)lod03将变量b的值取至栈顶(12)lit00将常数值0进栈(13)opr09次栈顶与栈顶是否不等(14)jpc024等时转(24)(条件不...