实验三 语义分析.docx
- 文档编号:8041756
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:12
- 大小:40.42KB
实验三 语义分析.docx
《实验三 语义分析.docx》由会员分享,可在线阅读,更多相关《实验三 语义分析.docx(12页珍藏版)》请在冰豆网上搜索。
实验三语义分析
实验三语义分析
一、实验目的
通过语法制导或翻译模式生成中间代码。
二、实验内容
在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出。
三、实验环境VC++6.0
四、实验要求
要求学生用与实验二相同的语言,编制语义分析程序。
五、运行结果
正确结果:
输入字符串为:
begina:
=4*2+5;x=(a+b)/(c+2);end#
出错:
输入字符串为:
begina:
=5*6+2;x:
=(a+b)/(c+d)/5;#
六、源程序实现
//语义分析
//main.c
//@authorlangx
#include"stdio.h"//定义I/O库所用的某些宏和变量
#include"string.h"//定义字符串库函数
#include"conio.h"//提供有关屏幕窗口操作函数
#include"ctype.h"//分类函数
#defineLEN6
charprog[80]={'\0'},
token[80]={'\0'};//存放构成单词符号的字符串
charch;
intsyn,//存放单词字符的种别码
n,
sum,//存放整数型单词
m,p;//p是缓冲区prog的指针,m是token的指针
char*rwtab[LEN]={"begin","if","then","while","do","end"};
intkk,q;
struct
{
charresult1[8];
charag11[8];
charop1[8];
charag21[8];
}quad[20];
char*factor();
char*expression_r();
intyucu();
char*term();
intstatement();
intlrparser();
char*newtemp();
scaner();
emit(char*result,char*ag1,char*op,char*ag2);
intlrparser()
{
intschain=0;
kk=0;
if(syn==1)
{
scaner();
schain=yucu();
if(syn==6)
{
scaner();
if((syn==0)&&(kk==0))printf("Success!
\n");
}
else
{
if(kk!
=1)printf("shortof'end'!
\n");
kk=1;
getch();
exit(0);
}
}
else
{
printf("shortof'begin'!
\n");
kk=1;
getch();
exit(0);
}
return(schain);
}
intyucu()
{
intschain=0;
schain=statement();
while(syn==26)
{
scaner();
schain=statement();
}
return(schain);
}
intstatement()
{
chartt[8],eplace[8];
intschain=0;
if(syn==10)
{
strcpy(tt,token);
scaner();
if(syn==18)
{
scaner();
strcpy(eplace,expression_r());
emit(tt,eplace,"","");
schain=0;
}
else
{
printf("shortofsign':
='!
\n");
kk=1;
getch();
exit(0);
}
return(schain);
}
}
char*expression_r()
{
char*tp,*ep2,*eplace,*tt;
tp=(char*)malloc(12);
ep2=(char*)malloc(12);
eplace=(char*)malloc(12);
tt=(char*)malloc(12);
strcpy(eplace,term());
while((syn==13)||(syn==14))
{
if(syn==13)strcpy(tt,"+");
elsestrcpy(tt,"-");
scaner();
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return(eplace);
}
char*term()
{
char*tp,*ep2,*eplace,*tt;
tp=(char*)malloc(12);
ep2=(char*)malloc(12);
eplace=(char*)malloc(12);
tt=(char*)malloc(12);
strcpy(eplace,factor());
while((syn==15)||(syn==16))
{
if(syn==15)strcpy(tt,"*");
elsestrcpy(tt,"/");
scaner();
strcpy(ep2,factor());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return(eplace);
}
char*factor()
{
char*fplace;
fplace=(char*)malloc(12);
strcpy(fplace,"");
if(syn==10)
{
strcpy(fplace,token);
scaner();
}
elseif(syn==11)
{
itoa(sum,fplace,10);
scaner();
}
elseif(syn==27)
{
scaner();
fplace=expression_r();
if(syn==28)scaner();
else
{
printf("erroron')'!
\n");
kk=1;
getch();
exit(0);
}
}
else
{
printf("erroron'('!
\n");
kk=1;
getch();
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')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]='\0';
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
elseif((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
elseswitch(ch)
{
case'<':
m=0;
ch=prog[p++];
if(ch=='>')
{
syn=21;
}
elseif(ch=='=')
{
syn=22;
}
else
{
syn=20;
p--;
}
break;
case'>':
m=0;
ch=prog[p++];
if(ch=='=')
{
syn=24;
}
else
{
syn=23;
p--;
}
break;
case':
':
m=0;
ch=prog[p++];
if(ch=='=')
{
syn=18;
}
else
{
syn=17;
p--;
}
break;
case'+':
syn=13;
break;
case'-':
syn=14;
break;
case'*':
syn=15;
break;
case'/':
syn=16;
break;
case'(':
syn=27;
break;
case')':
syn=28;
break;
case'=':
syn=25;
break;
case';':
syn=26;
break;
case'#':
syn=0;
break;
default:
syn=-1;
break;
}
}
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++;
}
main()
{
intj;
printf("\nThesignificanceofthefigures:
\n"
"1.figures1to6saidKeyword\n"
"2.figures10and11saidOtherindicators\n"
"3.figures13to28saidOperators\n");
q=p=kk=0;
printf("\npleaseinputstring:
(endwith'#')\n");
do
{
scanf("%c",&ch);
prog[p++]=ch;
}
while(ch!
='#');
p=0;
scaner();
lrparser();
if(q>19)printf("tolongsentense!
\n");
elsefor(j=0;j getch(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 语义分析 实验 语义 分析