语法制导翻译与生成中间代码(附代码)Word文档格式.docx

上传人:wj 文档编号:5097390 上传时间:2023-05-04 格式:DOCX 页数:13 大小:122.71KB
下载 相关 举报
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第1页
第1页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第2页
第2页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第3页
第3页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第4页
第4页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第5页
第5页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第6页
第6页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第7页
第7页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第8页
第8页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第9页
第9页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第10页
第10页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第11页
第11页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第12页
第12页 / 共13页
语法制导翻译与生成中间代码(附代码)Word文档格式.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

语法制导翻译与生成中间代码(附代码)Word文档格式.docx

《语法制导翻译与生成中间代码(附代码)Word文档格式.docx》由会员分享,可在线阅读,更多相关《语法制导翻译与生成中间代码(附代码)Word文档格式.docx(13页珍藏版)》请在冰点文库上搜索。

语法制导翻译与生成中间代码(附代码)Word文档格式.docx

1.分析过程

主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递归过程,不断的递归调用,按序输出三地址语句。

在本例程序中选用expr及num作为运算数。

2.主要函数

stringlink()//字符串和数字的连接

stringelement()//获取表达式中的元素对象

stringexpression()//处理表达式

stringexpression_1()//处理表达式

stringbiaodashi()//处理表达式,转为三地址输出

stringbiaodashi_1()//递归---处理表达式,转为三地址输出

stringgetOperator()//判断并获取运算符

voidcondition(intL1,intL2)//输出if语句的条件的三地址代码

voidyuyifenxi_list()//生成并输出条件返回地址

voidyuyifenxi_list_1()//递归---生成并输出条件返回地址

voidyuyifenxi(intnext,int&

flag)//判断关键字,调用相应的产生式分析

voidreadfile()//文件读入

四、测试报告

1.第一组测试:

图1-1输入待翻译代码

图1-2中间代码生成

2.第二组测试:

图2-1输入待翻译代码

图2-2中间代码生成

3.第三组测试:

错误待翻译代码

图3-1输入待翻译代码

图3-2中间代码生成

五、实验总结

实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确有些差强人意,但毕竟还算有些收获了。

另外,通过三次实验下来,对于一个简易编译器的实现已经有了一个整体的构架了,相信在通过自己以后的深入学习,一定能写出属于自己的编译器。

六、附录代码

#include<

iostream>

algorithm>

#include<

conio.h>

usingnamespacestd;

intaddress=100;

//每条分析语句的地址

intLID=0;

//表示过程执行到相应位置的地址符号

inttID=0;

//用于替换表达式的标识符

intip=0;

stringshuru[666];

//存放从文件读入的字符串

intmaxsize;

//设置存放数组的长度

stringbiaodashi();

/*****字符串和数字的连接*****/

stringlink(stringa,intb)

{

stringt="

"

;

do

{

t+=b%10+'

0'

b/=10;

}

while(b);

reverse(t.begin(),t.end());

returna+t;

}

/*****获取表达式中的元素对象*****/

stringelement()

if(shuru[ip]=="

expr"

||shuru[ip]=="

num"

ip++;

returnshuru[ip-1];

elseif(shuru[ip]=="

("

stringresult=biaodashi();

if(shuru[ip]=="

)"

)ip++;

elseputs("

Lack)"

);

returnresult;

elseputs("

error"

return"

}

/*****处理表达式*****/

stringexpression_1(string&

op)

*"

/"

op=shuru[ip];

stringarg1=element();

stringop_1="

result=link("

t"

tID++);

stringarg2=expression_1(op_1);

if(op_1=="

)op_1="

="

if(arg2=="

)cout<

<

address++<

:

"

result<

="

arg1<

endl;

elsecout<

op_1<

arg2<

stringexpression()

stringop="

stringarg1=element();

stringarg2=expression_1(op);

if(op=="

op="

}

if(arg2=="

cout<

else

op<

returnresult;

/*****递归---处理表达式,转为三地址输出*****/

stringbiaodashi_1(string&

stringresult="

+"

-"

stringarg1=expression();

stringarg2=biaodashi_1(op_1);

result=link("

{

op_1="

}

cout<

else

/*****处理表达式,转为三地址输出*****/

stringbiaodashi()

stringarg1="

op="

){arg1=shuru[ip];

ip++;

arg1+=expression();

stringarg2=biaodashi_1(op);

stringresult=link("

/*****判断并获取运算符*****/

stringgetOperator()

>

||

shuru[ip]=="

puts("

/*****输出if语句的条件的三地址代码*****/

voidcondition(intL1,intL2)//L1,L2分别为if条件为true和false时候的跳转地址

stringarg1=biaodashi();

//获得表达式的运算符的左边内容

stringop=getOperator();

//获得表达式的运算符

stringarg2=biaodashi();

//获得表达式的运算符的右边内容

iftrue"

goto"

L"

L1<

iffalse"

L2<

/*****判断关键字,调用相应的产生式分析*****/

flag)

) //赋值语句转化为四元式

ip++;

stringarg1=biaodashi();

stringarg2="

if(arg2=="

expr="

if"

) //if的语义子程序

intL1=LID++;

intL2=LID++;

condition(L1,L2);

puts("

Lack("

return;

)ip++;

else{

printf("

L%d:

\n"

L1);

yuyifenxi(next,flag);

else"

printf("

L2);

yuyifenxi(next,flag);

while"

) //while的语义子程序

condition(L2,next);

gotoL%d\n"

flag=1;

/*****递归---生成并输出条件返回地址*****/

voidyuyifenxi_list_1()

intnext=LID++;

intflag=0;

if(flag)printf("

next);

yuyifenxi_list_1();

/*****生成并输出条件返回地址*****/

voidyuyifenxi_list()

intnext=LID++;

intflag=0;

yuyifenxi(next,flag);

if(flag)printf("

yuyifenxi_list_1();

voidModular()

yuyifenxi_list();

/*****文件读入*****/

voidreadfile() //将字符串输入到shuru中

maxsize=0;

while(cin>

shuru[maxsize])

maxsize++;

/*****主函数*****/

intmain()

freopen("

input.txt"

"

r"

stdin);

cout<

语义分析如下:

readfile();

Modular();

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2