编译原理语义分析实验报告——免费!Word文档下载推荐.doc
- 文档编号:13090887
- 上传时间:2022-10-04
- 格式:DOC
- 页数:11
- 大小:78KB
编译原理语义分析实验报告——免费!Word文档下载推荐.doc
《编译原理语义分析实验报告——免费!Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《编译原理语义分析实验报告——免费!Word文档下载推荐.doc(11页珍藏版)》请在冰豆网上搜索。
return(p);
}
2、函数lrparser在原来语法分析的基础上插入相应的语义动作:
将输入串翻译成四元式序列。
在实验中我们只对表达式、赋值语句进行翻译。
四、源程序代码:
#include<
stdio.h>
string.h>
iostream.h>
stdlib.h>
{
charresult[12];
charag1[12];
charop[12];
charag2[12];
}quad;
charprog[80],token[12];
charch;
intsyn,p,m=0,n,sum=0,kk;
//p是缓冲区prog的指针,m是token的指针
char*rwtab[6]={"
begin"
"
if"
then"
while"
do"
end"
};
voidscaner();
char*factor(void);
char*term(void);
char*expression(void);
intyucu();
voidemit(char*result,char*ag1,char*op,char*ag2);
char*newtemp();
intstatement();
intk=0;
voidemit(char*result,char*ag1,char*op,char*ag2)
strcpy(quad.result,result);
strcpy(quad.ag1,ag1);
strcpy(quad.op,op);
strcpy(quad.ag2,ag2);
cout<
<
quad.result<
"
="
quad.ag1<
quad.op<
quad.ag2<
endl;
char*newtemp()
char*p;
charm[12];
p=(char*)malloc(12);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]='
t'
;
return(p);
voidscaner()
for(n=0;
n<
8;
n++)token[n]=NULL;
ch=prog[p++];
while(ch=='
'
)
{
ch=prog[p];
p++;
}
if((ch>
='
a'
&
ch<
z'
)||(ch>
A'
Z'
))
m=0;
while((ch>
0'
9'
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='
\0'
p--;
syn=10;
for(n=0;
6;
n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
elseif((ch>
sum=0;
while((ch>
sum=sum*10+ch-'
ch=prog[p++];
syn=11;
if(sum>
32767)
syn=-1;
elseswitch(ch)
case'
'
:
m=0;
token[m++]=ch;
if(ch=='
>
syn=21;
token[m++]=ch;
elseif(ch=='
syn=22;
else
syn=23;
break;
syn=24;
syn=20;
syn=18;
syn=17;
*'
syn=13;
token[0]=ch;
break;
/'
syn=14;
+'
syn=15;
-'
syn=16;
syn=25;
syn=26;
('
syn=27;
)'
syn=28;
#'
syn=0;
default:
syn=-1;
intlrparser()
{//cout<
调用lrparser"
intschain=0;
kk=0;
if(syn==1)
{
scaner();
schain=yucu();
if(syn==6)
{
scaner();
if(syn==0&
(kk==0))
cout<
success!
else
if(kk!
=1)
cout<
缺end!
kk=1;
else
{cout<
缺begin!
return(schain);
intyucu()
{// cout<
调用yucu"
schain=statement();
while(syn==26)
schain=statement();
intstatement()
调用statement"
char*eplace,*tt;
eplace=(char*)malloc(12);
tt=(char*)malloc(12);
intschain=0;
switch(syn)
case10:
strcpy(tt,token);
if(syn==18)
strcpy(eplace,expression());
emit(tt,eplace,"
);
schain=0;
else
cout<
缺少赋值符!
kk=1;
return(schain);
break;
return(schain);
char*expression(void)
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==15)||(syn==16))
if(syn==15)strcpy(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(void)
调用term"
tt=(char*)malloc(12);
strcpy(eplace,factor());
while((syn==13)||(syn==14))
if(syn==13)strcpy(tt,"
*"
/"
strcpy(ep2,factor());
//调用factor分析产生表达式计算的第二项ep2
strcpy(e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语义 分析 实验 报告 免费