编译原理实验二语法分析器LL1实现精选文档格式.docx
- 文档编号:22095480
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:21
- 大小:158.53KB
编译原理实验二语法分析器LL1实现精选文档格式.docx
《编译原理实验二语法分析器LL1实现精选文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验二语法分析器LL1实现精选文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
//运算符
charbound[2]={'
('
)'
//界符
structToken
{
intcode;
charch[10];
//Token定义
structTokentokenlist[50];
//Token数组
structTokentokentemp;
//临时Token变量
structStack//分析栈定义
char*base;
char*top;
intstacksize;
⑶分析表及流程图
⑷关键函数:
intIsLetter(charch)//判断ch是否为字母
intIsDigit(charch)//判断ch是否为数字
intIskey(char*string)//判断是否为关键字
intIsbound(charch)//判断是否为界符
intIsboundnum(charch)//给出界符所在token值
intinit(STack*s)//栈初始化
intpop(STack*s,char*ch)//弹栈操作
intpush(STack*s,charch)//压栈操作
voidLL1();
//分析函数
源程序代码:
(加入注释)
#include<
stdio.h>
string.h>
ctype.h>
windows.h>
#include<
stdlib.h>
typedefstructStackSTack;
(*s).base=(char*)malloc(100*sizeof(char));
if(!
(*s).base)
exit(0);
(*s).top=(*s).base;
(*s).stacksize=100;
printf("
初始化栈\n"
);
return0;
}
if((*s).top==(*s).base)
{
弹栈失败\n"
}
(*s).top--;
*ch=*((*s).top);
%c"
*ch);
return1;
if((*s).top-(*s).base>
=(*s).stacksize)
(*s).base=(char*)realloc((*s).base,((*s).stacksize+10)*sizeof(char));
(*s).top=(*s).base+(*s).stacksize;
(*s).stacksize+=10;
*(*s).top=ch;
*(*s).top++;
inti;
for(i=0;
i<
=45;
i++)
if((ch>
='
a'
&
ch<
z'
)||(ch>
A'
Z'
))
intIsDigit(charch)//判断ch是否为数字
inti;
=10;
if(ch>
0'
9'
)
2;
if(ch==bound[i])
returni+1;
intIsoperate(charch)//判断是否为运算符
4;
if(ch==operate[i])
returni+3;
intmain()
FILE*fp;
intq=0,m=0;
charsour[200]="
"
请将源文件置于以下位置并按以下方式命名:
F:
\\2.txt\n"
if((fp=fopen("
\\2.txt"
"
r"
))==NULL)
文件未找到!
\n"
else{
while(!
feof(fp)){
if(isspace(ch=fgetc(fp)));
sour[q]=ch;
q++;
}
intp=0;
输入句子为:
for(p;
p<
=q;
p++)
sour[p]);
intstate=0,nowlen=0;
BOOLEANOK=TRUE,ERR=FALSE;
inti,flagpoint=0;
q;
if(sour[i]=='
#'
tokenlist[m].code=='
switch(state)
case0:
ch=sour[i];
if(Isbound(ch))
if(ERR)
无法识别\n"
ERR=FALSE;
OK=TRUE;
elseif(!
OK)
<
10,%s>
标识符\n"
nowword);
tokentemp.code=10;
tokentemp.ch[10]=nowword[10];
tokenlist[m]=tokentemp;
m++;
state=4;
elseif(IsDigit(ch))
if(OK)
memset(nowword,0,strlen(nowword));
nowlen=0;
nowword[nowlen]=ch;
nowlen++;
state=3;
OK=FALSE;
break;
}else
nowword[nowlen]=ch;
elseif(IsLetter(ch))
elseif(Isoperate(ch))
tokenlist[m]=tokentemp;
%d,%c>
运算符\n"
Isoperate(ch),ch);
tokentemp.code=Isoperate(ch);
tokentemp.ch[10]=ch;
case3:
if(IsLetter(ch))
错误\n"
state=0;
if(IsDigit(ch=sour[i]))
elseif(sour[i]=='
.'
flagpoint==0)
flagpoint=1;
else
20,%s>
数字\n"
i--;
tokentemp.code=20;
case4:
界符\n"
Isbound(ch),ch);
tokentemp.code=Isbound(ch);
tokenlist值为%d\n"
m);
intt=0;
tokenlist[m+1].code='
r'
for(t;
t<
m;
t++)
tokenlist%d值为%d\n"
t,tokenlist[t].code);
LL1();
if(op+1==m)
OK!
!
WRONG!
voidLL1()
STacks;
init(&
s);
push(&
s,'
E'
charch;
intflag=1;
do
pop(&
s,&
ch);
输出栈顶为%c\n"
ch);
输出栈顶为%d\n"
当前p值为%d\n"
op);
if((ch=='
)||(ch=='
)||(ch==10)||(ch==20))
if(tokenlist[op].code==1||tokenlist[op].code==20||tokenlist[op].code==10||tokenlist[op].code==2||tokenlist[op].code==3||tokenlist[op].code==4||tokenlist[op].code==5||tokenlist[op].code==6)
op++;
else
elseif(ch=='
if(tokenlist[op].code==0)
flag=0;
printf("
@@@@@@@@@"
进入E\n"
if(tokenlist[op].code==10||tokenlist[op].code==20||tokenlist[op].code==1)
push(&
R'
将R压入栈\n"
T'
进入R\n"
if(tokenlist[op].code==3||tokenlist[op].code==4)
将T压入栈\n"
if(tokenlist[op].code==2||tokenlist[op].code==0)
进入T\n"
Y'
F'
进入Y\n"
if(tokenlist[op].code==5||tokenlist[op].code==6)
elseif(tokenlist[op].code==3||tokenlist[op].code==2||tokenlist[op].code==0||tokenlist[op].code==4)
进入F\n"
if(tokenlist[op].code==10||tokenlist[op].code==20)
s,10);
if(tokenlist[op].code==1)
}while(flag);
程序运行结果:
(截屏)
输入:
((Aa+Bb)*(88.2/3))#
注:
如需运行请将文件放置F盘,并命名为:
2.txt
输出:
思考问题回答:
LL
(1)分析法的主要问题就是要正确的将文法化为LL
(1)文法。
在程序实现时将分析表的动作逐一实现即可。
最新文件仅供参考已改成word文本。
方便更改
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 语法 分析器 LL1 实现 精选