语法制导翻译和中间代码生成1

语法制导翻译和中间代码生成1

ID:39707050

大小:314.82 KB

页数:28页

时间:2019-07-09

语法制导翻译和中间代码生成1_第1页
语法制导翻译和中间代码生成1_第2页
语法制导翻译和中间代码生成1_第3页
语法制导翻译和中间代码生成1_第4页
语法制导翻译和中间代码生成1_第5页
资源描述:

《语法制导翻译和中间代码生成1》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第6章语法制导翻译和中间代码生成㈠语法分析和语义分析的区别㈡语义分析主要工作①建立符号表和常数表。②诊察和报告源程序中的语义错误。③根据语言的语义产生中间代码(或机器指令),或直接解释执行。6.1语法制导翻译概述㈠语法制导翻译方法简介为每一个产生式配一个语义子程序。在语法分析过程中,当一个产生式获得匹配或用于归约时,此产生式相应的语义子程序进入工作,完成既定的翻译任务。6.1语法制导翻译概述㈡实现方法(以SLR分析器为例)①分析表不变②改造工作栈状态栈符号栈单词值栈:用于保存单词的值(字符串形式)。语义栈:用于记录分析过程中需保留的语义值。例,值(val)、地

2、址(addr)、种属(cat)、类型(type)等。③修改总控程序在移进时,除移进状态和单词的种别外,还需移进单词的值。在用某个产生式进行归约时,除需执行归约动作外,还需调用相应语义子程序。6.1语法制导翻译概述㈢解释执行例①文法及语义子程序②SLR分析表③手工计算7+9*56.2符号表和常数表㈠符号表①引入符号表的意义②符号表的结构(略有修改)struct{void*addr;//标号或变量的地址charid[5];//标识符名unsignedcat:4;//种属(4个二进制位)unsignedtype:4;//类型(4个二进制位)}sym_table[NS

3、];//NS表示符号表长度③符号表的使用④符号表地址使用说明6.2符号表和常数表㈡常数表①常数表结构unsignedshortconst_int_table[NI];//NI表示整常数表长度floatconst_real_table[NR];//NR表示实常数表长度②常数表使用③常数表地址使用说明6.3中间代码6.3.1三元式㈠格式OPARG1ARG2运算符第一运算量第二运算量㈡优点代码生成无需引进临时变量。㈢缺点调整困难。6.3中间代码6.3.2四元式㈠格式OPARG1ARG2RESULT运算符第一运算量第二运算量运算结果㈡优点调整方便。㈢缺点在生成中间代码

4、时引进大量临时变量。㈣临时变量的处理①将Ti作为标识符存入符号表②设置临时变量表6.4说明语句(简单变量)的翻译㈠文法及修改<语句>→integer<标识符表>S→aV<语句>→real<标识符表>S→cV<标识符表>→<标识符表>,标识符V→V,i<标识符表>→标识符V→i6.4说明语句(简单变量)的翻译㈡语义子程序V→ai{fill_sym_table(wval,0,0);//填写符号表(标识符名,简单变量,整型)V.cat=0;//保存语义值(简单变量)V.type=0;//保存语义值(整型)}V→ci{fill_sym_table(wval,0,1);

5、//填写符号表(标识符名,简单变量,整型)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<整型算术表达式>→<项

6、>X→Y<项>→<项>*<因子>Y→Y*Z<项>→<因子>Y→Z<因子>→(<整型算术表达式>)Z→(X)<因子>→-<因子>Z→-Z<因子>→标识符Z→i<因子>→无符号整常数Z→x6.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.addr,X.addr);//产生四元式}X→Y{X.addr=Y.addr;//传递语义值}Y→Y

7、(1)*Z{Y.addr=get_tmpvar(0);//申请临时变量(整型)gen_code(*,Y(1).addr,Z.addr,Y.addr);//产生四元式}Y→Z{Y.addr=Z.addr;//传递语义值}Z→(X){Z.addr=X.addr;//传递语义值}Z→-Z(1){Z.addr=get_tmpvar(0);//申请临时变量(整型)gen_code(-,Z(1).addr,0,Z.addr)//产生四元式}Z→i{Z.addr=sym_entry(wval);//wval表示单词的值}Z→x{Z.addr=const_int_entry(

8、atoi(wval));//wval表

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。