中间代码生成实验报告Word格式文档下载.docx
- 文档编号:18928543
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:19
- 大小:19.46KB
中间代码生成实验报告Word格式文档下载.docx
《中间代码生成实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《中间代码生成实验报告Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
首先对测试程序进行语法分析,识别出正确的句子,当识别出正确的句子时,就对当前句子进行语义分析,而语法不正确的句子不进行语义分析。
=6+6*6-Error(4):
ExceptIDorNUM
;
Error
(2):
Syntaxerror
ifsl>
89+56*67thenf:
success!
!
(1)[*,56,67,T1]
(2)[+,89,T1,T2]
(3)[j>
sl,T2,(4)]
(4)[*,7,7,T3]
(5)[+,T3,4,T4]
(6)[:
=,T4,-,f]
(7)[*,6,6,T5]
(8)[+,6,T5,T6]
(9)[%,6,4,T7]
(10)[-,T6,T7,T8]
(11)[+,T8,8,T9]
(12)[:
=,T9,-,ff]
ifsl+78*76>
89*56+67thenwhilea-7>
(13)[*,78,76,T10]
(14)[+,sl,T10,T11]
(15)[*,89,56,T12]
(16)[+,T12,67,T13]
(17)[j>
T11,T13,(18)]
(18)[-,a,7,T14]
(19)[*,45,45,T15]
(20)[+,98,T15,T16]
(21)[j>
T14,T16,(22)]
(22)[*,7,7,T17]
(23)[+,T17,4,T18]
(24)[:
=,T18,-,f]
(25)[j,_,_,(18)]
.Error
(2):
Syntaxerror
五、实验小结
终于完成了编译原理的三次实验,这几次实验使我们更彻底地巩固了编译原理。
从詷法分析到语法分析直到这次的中间代码都是看似简单的基础知识,却花了不少时间对课本多次反复研究、请教学习,进行深层次地探讨才找出编程时出现的种种问题。
还有很多程序方面很细节的问题,很容易被突略,却往往又是关键。
总地来说,虽然实验做得很辛苦,但真的可以从实验当中学习到很多,认识到很多。
并对编译理解也透彻了许多,比较清晰地掌握了编译程序的原理和方法。
附录:
#include<
string.h>
#include<
stdio.h>
stdlib.h>
#definereser20
char*charstring="
abcdefghijklmnopqrstuvwxyz"
char*numstring="
0123456789"
char*strstring="
abcdefghijklmnopqrstuvwxyz0123456789"
charreserve[reser][10];
charidshed[40][10],opshed[40][10];
chartoken[15],id[15],sym[15];
charline[80],tempp[240];
charch,ch1,temp,tem;
chartx[10];
chartn[4],signt1[20],signt2[20],ju[20];
intcc,ii,k,num,kind,t,e4=0,e3=0,judge=1,row1=0;
intstartc,idsh=0,opsh=0,tt=1,nn=1,signwh,over=0,adds=0,whs=0,pp=0;
intli=0;
charfilename[15];
FILE*fp;
voidgetch(){
if(li==0){
if(cc==ii){
cc=1;
ii=0;
if(row1==1)fseek(fp,-1,1);
/*读行首字符将指针退回一格,若是整个文本的开头,则不需要*/
line[0]=fgetc(fp);
row1=1;
while(((temp=fgetc(fp))!
='
\n'
)&
&
(temp!
=EOF))
{line[cc]=temp;
cc++;
tempp[pp]=temp;
pp++;
}
line[cc]='
'
/*将缓冲带后加上一个空字符,以便行和行之间号区分*/
cc++;
tempp[pp]='
pp++;
while(((temp=fgetc(fp))=='
=EOF));
/*跳过空行*/
line[cc]='
\0'
}
tem=line[ii];
ii++;
ch=tem;
else{
ch=tempp[pp];
}
voidgetnbc(){
getch();
while(ch=='
)
if(ch=='
{'
{
do
{getch();
while(ch=='
}'
);
getnbc();
voidretract(){
ii--;
voidret(){
pp--;
intjchar(charch){/*判断ch是不是字母*/
if(strchr(charstring,ch)==0)
return0;
elsereturn1;
intjnum(charch){/*判断ch是不是数字*/
if(strchr(numstring,ch)==0)
intjstr(charch){/*判断ch是不是字母或数字*/
if(strchr(strstring,ch)==0)
voidadvance()
kind=0;
if(jchar(ch)==1)
k=0;
do{
if(k<
15)
{token[k]=ch;
k++;
getch();
while(jstr(ch)==1);
if(li==0)
retract();
elseret();
token[k]='
/*截去token中的无用字符*/
strcpy(id,token);
for(t=0;
t<
=20;
t++)
{if(strcmp(reserve[t],id)==0)
break;
if(t<
=20)kind=t;
elsekind=21;
strcpy(sym,id);
else
if(jnum(ch)==1)
do{
if(k<
15){
token[k]=ch;
while(jstr(ch)==1);
kind=22;
strcpy(sym,token);
if(ch=='
.'
)kind=26;
sym[k]='
}while(k!
=15);
sym[0]=ch;
sym[1]='
voiderror(intn){
judge=0;
/*出错退出,将judge=0*/
switch(n){
case0:
{printf("
Error(0):
Expect'
:
'
\n"
case1:
Error
(1):
case2:
Error
(2):
Syntaxerror\n"
break;
case3:
Error(3):
ExceptOperater\n"
case4:
Error(4):
ExceptIDorNUM\n"
case5:
Error(5):
Except'
case6:
Error(6):
<
or'
>
\n"
case7:
Error(7):
);
case8:
Error(8):
then'
case9:
Error(9):
ExceptConditionExpression\n"
case10:
Error(10):
do'
"
default:
;
voide(){
advance();
if((strcmp(sym,"
+"
)==0)||(strcmp(sym,"
-"
*"
%"
)==0))
{printf("
%s"
sym);
if((kind==21)||(kind==22)){/*kind为21,22分别表示的是标志符和数字*/
printf("
e();
else{e4=1;
error(4);
}}/*出错退出,e4=1*/
voidc(){
if((kind==21)||(kind==22)){
printf("
e();
if(e4==1);
/*e4的作用是判断程序从e()中是不是出错退出*/
else{
if(strcmp(sym,"
"
)==0){
advance();
if((kind==21)||(kind==22)){
}else{error(4);
}
else{
printf("
if(strcmp(sym,"
="
if((kind==21)||(kind==22)){
e();
}else{error(4);
}else{error(7);
}else{error(6);
}}}
else{e3=1;
error(9);
}/*出错退出,e3=1*/
voidstatement(){
if(judge==1)/*judge的作用为判断程序是不是出错退出,若是,则无需advance()*/
switch(kind){
case21:
{/*id*/
if(strcmp(sym,"
)==0)
if((kind==21)||(kind==22)){
if(e4==1);
else{
{printf("
judge=1;
startc=1;
elseerror(5);
e4=0;
/*将e4重新置为0,以免对下面程序有影响*/
elseerror(4);
}else{error
(1);
}else{error(0);
}
{printf("
%s"
/*if*/
c();
if(e4==1);
else{if(e3==1);
/*e3的作用是判断程序从c()中是不是出错退出*/
else{
then"
printf("
%s"
statement();
}else{error(8);
e3=0;
/*将e3重新置为0,以免对下面程序有影响*/
break;
case19:
{/*while*/
do"
}else{error(10);
error
(2);
}}
voidpushid(){
strcpy(idshed[idsh],sym);
idsh++;
voidpushop(){
strcpy(opshed[opsh],sym);
opsh++;
voidgen(charop[10],chara[10],charb[10]){
(%d)[%2s,%3s,%3s,T%d]\n"
nn,op,a,b,tt);
tt++;
nn++;
itoa(tt-1,tn,10);
strcpy(tx,"
T"
strcat(tx,tn);
voidec(){
pushop();
pushid();
if((strcmp(opshed[opsh-1],"
)==0)||(strcmp(opshed[opsh-1],"
gen(opshed[opsh-1],idshed[idsh-2],idshed[idsh-1]);
opsh--;
idsh=idsh-1;
strcpy(idshed[idsh-1],tx);
}else{
{adds=1;
if((strcmp(opshed[opsh-2],"
)==0)||(strcmp(opshed[opsh-2],"
{
gen(opshed[opsh-2],idshed[idsh-3],idshed[idsh-2]);
strcpy(idshed[idsh-2],tx);
}}
)==0)||(strcmp(sym,"
{
if(li==0)
ec();
voidcontent(){
intreu;
reu=nn;
switch(kind)
{case21:
{
pushid();
if(adds==1)
gen(opshed[opsh-1],idshed[idsh-2],idshed[idsh-1]);
adds=0;
(%d)[:
=,%s,-,%s]\n"
nn,tx,idshed[0]);
idsh=0;
opsh=0;
nn,idshed[1],idshed[0]);
if(adds==1)
adds=0;
strcpy(signt1,tx);
strcpy(signt1,idshed[0]);
strcpy(ju,"
j>
j<
advance();
idsh=0;
opsh=0;
if(adds==1)
strcpy(signt2,tx);
strcpy(signt2,idshed[0]);
(%d)[%s,%s,%s,(%d)]\n"
nn,ju,signt1,signt2,nn+1);
nn++;
if(kind==21)pushid();
content();
o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中间 代码 生成 实验 报告