编译原理实践9—语义分析与代码生成.pptVIP

  • 8
  • 0
  • 约3.64千字
  • 约 23页
  • 2018-04-13 发布于湖北
  • 举报

编译原理实践9—语义分析与代码生成.ppt

编译原理实践9—语义分析与代码生成

编译原理实践 --语义分析与代码生成 table数组和enter过程的扩充 命令代码生成过程gen 表达式、项、因子及关系式的翻译 语句的翻译 生成PL/0目标代码程序 1. table数组和enter过程的扩充 lod l,a 将l,a形成的栈地址变量值置入栈顶 sto l,a 将栈顶值保存到l,a形成的栈地址变量 l level级别之差 变量所处的程序段静态级别与 变量被说明时的静态级别之差 a offset cal l,a 调用子程序 l level级别之差 call语句所处的程序段静态级别与 调用过程被说明时的静态级别之差 a 被调用代码程序段的起始地址 必须将variable和procedure的level保存在合适的地方 改变符号表,增加相应的字段(P144图11-1) object = (constant,variable,prozedure); table: array [0..txmax] of record name: alfa; case kind: object of constant: (val: integer); variable,prozedure: (level,adr,size:integer); end; 常量:val 变量:静态级别,位移地址 Procedure:程序地址,静态级别,预留存储单元 procedure enter(k:objekt); begin (*enter object into table*) tx:=tx+1; with table[tx] do begin name:=id; kind:=k; case k of constant:begin if numamax then begin error(31); num:=0 end; val:=num end; variable:begin level:=lev; adr:=dx; dx:=dx+1; end; prozedure: level:=lev end end end(*enter*); 2.命令代码生成过程gen 每调用一次过程gen,在程序存储器里产生一条代码指令 procedure gen(x:fct;y,z:integer); begin if cxcxmax then begin write( program too long); halt end; with code[cx] do begin f:=x; l:=y; a:=z end; cx:=cx+1 end(* gen *); 3.表达式、项、因子及关系式的翻译 表达式的翻译 中缀表达式与后缀表达式 后缀表达式:操作符总是跟随在它操作数的后边 后缀表达式翻译规则 T(“+”term)=T(term) T(“-”term)= T(term) “-” T(term1”+”term2)= T(term1) T(term2) “+” T(term1”-”term2)= T(term1) T(term2) “-” T(term1”*”term2)= T(term1) T(term2) “*” T(term1”/”term2)= T(term1) T(term2) “/” T(“(”expression”)”)=T(expression) Example (x+y)/(z-w) 后缀表达式 xy+zw-/ Lod x Lod y Opr 0,2 Lod z Lod w Opr 0,3 Opr 0,5 Another example T(x-6*(z+w)(x+y)/(12-w)) expression过程的扩充 term过程的扩充 factor过程的扩充 condition过程的扩充 4.语句的翻译 赋值语句的翻译处理 T(Ident”:=”expression) T(expression) Sto lev-level, adr if语句的翻译处理 T(“if” condition “then” statement) T(condition) Jpc, L1 T(statement) L1: … while语句的翻译处理 T(“while” condition “do” statement) L1: T(condition) Jpc, L2 T(statement) jmp L1

文档评论(0)

1亿VIP精品文档

相关文档