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