第6章 语法制导翻译和中间代码生成精选.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 语法制导翻译和中间代码生成精选

第6章 语法制导翻译和中间代码生成 ㈠语法分析和语义分析的区别 ㈡语义分析主要工作 ①建立符号表和常数表。 ②诊察和报告源程序中的语义错误。 ③根据语言的语义产生中间代码(或机器指令),或直接解释执行。 6.1 语法制导翻译概述 ㈠语法制导翻译方法简介 为每一个产生式配一个语义子程序。在语法分析过程中,当一个产生式获得匹配或用于归约时,此产生式相应的语义子程序进入工作,完成既定的翻译任务。 6.1 语法制导翻译概述 ㈡实现方法(以SLR分析器为例) ①分析表不变 ②改造工作栈 状态栈 符号栈 单词值栈:用于保存单词的值(字符串形式)。 语义栈:用于记录分析过程中需保留的语义值。例,值(val)、地址(addr)、种属(cat)、类型(type)等。 ③修改总控程序 在移进时,除移进状态和单词的种别外,还需移进单词的值。 在用某个产生式进行归约时,除需执行归约动作外,还需调用相应语义子程序。 6.1 语法制导翻译概述 ㈢解释执行例 ①文法及语义子程序 ②SLR分析表 ③手工计算 7+9*5 6.2 符号表和常数表 ㈠符号表 ①引入符号表的意义 ②符号表的结构(略有修改) struct { void *addr; //标号或变量的地址 char id[5]; //标识符名 unsigned cat:4; //种属(4个二进制位) unsigned type:4; //类型(4个二进制位) } sym_table[NS]; //NS表示符号表长度 ③符号表的使用 ④符号表地址使用说明 6.2 符号表和常数表 ㈡常数表 ①常数表结构 unsigned short const_int_table[NI]; //NI表示整常数表长度 float const_real_table[NR]; //NR表示实常数表长度 ②常数表使用 ③常数表地址使用说明 6.3 中间代码 6.3.1 三元式 ㈠格式 OP ARG1 ARG2 运算符 第一运算量 第二运算量 ㈡优点 代码生成无需引进临时变量。 ㈢缺点 调整困难。 6.3 中间代码 6.3.2 四元式 ㈠格式 OP ARG1 ARG2 RESULT 运算符 第一运算量 第二运算量 运算结果 ㈡优点 调整方便。 ㈢缺点 在生成中间代码时引进大量临时变量。 ㈣临时变量的处理 ①将Ti作为标识符存入符号表 ②设置临时变量表 6.4 说明语句(简单变量)的翻译 ㈠文法及修改 语句→integer 标识符表 S→aV 语句→real 标识符表 S→cV 标识符表→标识符表,标识符 V→V,i 标识符表→标识符 V→i 6.4 说明语句(简单变量)的翻译 ㈡语义子程序 V→ai { fill_sym_table(wval,0,0); //填写符号表(标识符名,简单变量,整型) V.cat=0; //保存语义值(简单变量) V.type=0; //保存语义值(整型) } V→ci { fill_sym_table(wval,0,1); //填写符号表(标识符名,简单变量,整型) V.cat=0; //保存语义值(简单变量) V.type=1; //保存语义值(实型) } V→V(1),i { fill_sym_table(wval, V(1).cat, V(1).type); //继承V(1)的语义信息 V.cat= V(1).cat; V.type= V(1).type; } S→V {;} //空 ①语义变量.cat和.type ②fill_sym_table函数 6.5 整型算术表达式及赋值语句的翻译 ㈠文法 语句→标识符= 整型算术表达式 S→i=X 整型算术表达式→整型算术表达式+项 X→X+Y 整型算术表达式→项 X→Y 项→项*因子 Y→Y*Z 项→因子 Y→Z 因子→(整型算术表达式) Z→(X) 因子→-因子 Z→-Z 因子→标识符 Z→i 因子→无符号整常数 Z→x 6.5 整型算术表达式及赋值语句的翻译 ㈡语义子程序 S→i=X { gen_code (=,X.addr,0,sym_entry(wval)); //产生四元式。 } X→X(1)+Y { X.addr = get_tmpvar(0); //申请临时变量(整型) gen_code(+,X(1).addr, Y.add

文档评论(0)

tazhiq2 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档