编译原理实验三Word下载.docx
- 文档编号:22713313
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:12
- 大小:70.47KB
编译原理实验三Word下载.docx
《编译原理实验三Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验三Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
stdio.h"
string.h"
stdlib.h"
charprog[100],token[8],ch;
char*rwtab[6]={"
begin"
"
if"
then"
while"
do"
end"
};
intsyn,p,m,n,sum,q;
intkk;
struct{charresult1[8];
charag11[8];
charop1[8];
charag21[8];
}quad[20];
char*factor();
char*expression();
intyucu();
char*term();
intstatement();
intlrparser();
char*newtemp();
scaner();
emit(char*result,char*ag1,char*op,char*ag2);
main()
{intj;
q=p=kk=0;
printf("
\npleaseinputastring(endwith'
#'
):
"
);
do
{scanf("
%c"
&
ch);
prog[p++]=ch;
}while(ch!
='
p=0;
lrparser();
if(q>
19)printf("
tolongsentense!
\n"
elsefor(j=0;
j<
q;
j++)printf("
%s=%s%s%s\n\n"
quad[j].result1,quad[j].ag11,quad[j].op1,quad[j].ag21);
//getch();
}
intlrparser()
{intschain=0;
kk=0;
if(syn==1)
{scaner();
//读下一个单词符号
schain=yucu();
//调用语句串分析函数进行分析
if(syn==6)
{scaner();
if((syn==0)&
&
(kk==0))printf("
Success!
//输出(“success”)
else{if(kk!
=1)printf("
shortof'
end'
!
//输出‘缺end’错误
kk=1;
//getch();
exit(0);
}
else{printf("
begin'
//输出’begin’错误
return(schain);
intyucu()
schain=statement();
//调用语句分析函数进行分析
while(syn==26)
schain=statement();
return(schain);
intstatement()
{chartt[8],eplace[8];
intschain=0;
if(syn==10)
{strcpy(tt,token);
scaner();
if(syn==18)
//读下一个单词符号
strcpy(eplace,expression());
emit(tt,eplace,"
"
schain=0;
shortofsign'
:
//输出’缺少赋值号’的错误
char*expression()
{char*tp,*ep2,*eplace,*tt;
tp=(char*)malloc(12);
//分配空间
ep2=(char*)malloc(12);
eplace=(char*)malloc(12);
tt=(char*)malloc(12);
strcpy(eplace,term());
//调用term分析产生表达式计算的第一项eplace
while((syn==13)||(syn==14))
{if(syn==13)strcpy(tt,"
+"
//操作符tt=‘+’或者‘—’
elsestrcpy(tt,"
-"
strcpy(ep2,term());
//调用term分析产生表达式计算的第二项ep2
strcpy(tp,newtemp());
//调用newtemp产生临时变量tp存储计算结果
emit(tp,eplace,tt,ep2);
//生成四元式送入四元式表
strcpy(eplace,tp);
return(eplace);
char*term()//仿照函数expression编写
strcpy(eplace,factor());
while((syn==15)||(syn==16))
{if(syn==15)strcpy(tt,"
*"
/"
strcpy(ep2,factor());
char*factor()
{char*fplace;
fplace=(char*)malloc(12);
strcpy(fplace,"
if(syn==10)
{strcpy(fplace,token);
elseif(syn==11)
{itoa(sum,fplace,10);
elseif(syn==27)
fplace=expression();
//调用expression分析返回表达式的值
if(syn==28)scaner();
erroron'
)'
else{printf("
('
kk=1;
exit(0);
return(fplace);
char*newtemp()
{char*p;
charm[8];
p=(char*)malloc(8);
kk++;
itoa(kk,m,10);
strcpy(p+1,m);
p[0]='
t'
;
return(p);
scaner()
{sum=0;
for(m=0;
m<
8;
m++)token[m++]=NULL;
m=0;
ch=prog[p++];
while(ch=='
'
)ch=prog[p++];
if(((ch<
z'
)&
(ch>
a'
))||((ch<
Z'
A'
)))
{while(((ch<
))||((ch>
0'
(ch<
9'
{token[m++]=ch;
p--;
syn=10;
token[m++]='
\0'
for(n=0;
n<
6;
n++)
if(strcmp(token,rwtab[n])==0)
{syn=n+1;
break;
elseif((ch>
))
{while((ch>
{sum=sum*10+ch-'
p--;
syn=11;
elseswitch(ch)
{case'
<
'
m=0;
if(ch=='
>
)
{syn=21;
elseif(ch=='
{syn=22;
else
{syn=20;
case'
{syn=24;
{syn=23;
{syn=18;
{syn=17;
}
+'
syn=13;
-'
syn=14;
*'
syn=15;
break;
/'
syn=16;
syn=27;
syn=28;
syn=25;
syn=26;
syn=0;
default:
syn=-1;
emit(char*result,char*ag1,char*op,char*ag2)
{
strcpy(quad[q].result1,result);
strcpy(quad[q].ag11,ag1);
strcpy(quad[q].op1,op);
strcpy(quad[q].ag21,ag2);
q++;
五、实验结果分析
输入:
begina:
=2+3*4;
x:
=(a+b)/cend#
beginx:
=2+d;
end#(错误案例,结果显示---缺少赋值号错误)
x:
=4+2;
d:
=2+4/3end#(错误案例,结果显示---缺少begin错误)
六、实验心得体会及问题反馈
说明:
打印时正文采用5号宋体,英文为TimesNewRoman,A4纸,页边距均为20mm,行间距采用18磅。
文中标题采用宋体加粗。
参考程序参见附录C。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验