语法分析器实验报告2.docx
《语法分析器实验报告2.docx》由会员分享,可在线阅读,更多相关《语法分析器实验报告2.docx(6页珍藏版)》请在冰豆网上搜索。
一、实验目的
设计、编制并调试一个语法分析程序,加深对语法分析原理的理解。
二实验要求
要求语法分析器的输入是单词串(含词的字符串形式、在源文件中的起止位置、词的类别),输出是源程序中各句子的单词起止编号、句子的语法树。
三实验内容
以下不同语法分析器中任选一个:
1.递归下降分析器。
可分解为:
文法输入及解析、消除左递归、提取左公共因子、产生式匹配。
2.LL
(1)分析器。
可分解为:
文法输入及解析、分析表构造(含SELECT集求解)、主控程序、语法树展示。
3.算符优先文法分析器。
可分解为:
文法输入及解析、分析表构造、主控程序、语法树展示。
4.LR
(1)分析器。
可分解为:
文法输入及解析、分析表构造(含项目及项目簇集求解)、主控程序、语法树展示。
四、实验步骤给定的文法G[E]
E->TE’
E’->+TE’|ε
T->FT’
T’->*FT’|ε
F->(E)|i
采用递归下降分析法编写语法分析程序及LL
(1)语法分析法编写语法分析程序。
实验代码:
#include#include#include#defineN100
intseekProd(intstackTop,intinputstrTop);
//charinputstr[10]="i*i+i#";charinputstr[20];
charstack[10]="";
typedefstructproduction{charleftChar;
charrightChars[4];charallChars[8];
}Prod;
Prodproductions[8];voidinit();
intstackPush(int*top,Prodprod);
intmatching(int*top,char*inputstr);intmain()
{
intlen;//输入串的长度intstackTop=1;
intinputstrTop=0;inti;
char*z="#";
intindex=0;
init();//产生式初始化
stack[0]='#';stack[stackTop]='E';printf("请输入字符串:
");gets(inputstr);
len=strlen(inputstr);inputstr[len]='#';while(stackTop>=0)
{
// printf("%d,%d\n",stackTop,inputstrTop);printf("第%2d步:
",++index);
printf("当前栈:
%-8s",stack);
printf("输入字符串:
%8s",inputstr);
//根据栈定元素和字符串首字母
if(matching(&stackTop,inputstr)){printf("\n");
}else{
i=seekProd(stackTop,inputstrTop);stackPush(&stackTop,productions[i]);/压/栈
printf("进行下一步所用的产生式:
%s\n",productions[i].allChars);
}
}
if(stackTop+1==0)
{
printf("分析成功!
\n");
}
return0;
}
6
精品文档交流
//搜索分析表
intseekProd(intstackTop,intinputstrTop)
{
// printf("stack[stackTop]=%c\n",stack[stackTop]);if(stack[stackTop]=='E'){
if(inputstr[inputstrTop]=='i')
{
return0;
}elseif(inputstr[inputstrTop]=='('){return0;
}else{
return-1;
}
}elseif(stack[stackTop]=='X'){if(inputstr[inputstrTop]=='+')
{
return1;
}elseif(inputstr[inputstrTop]==')'){return2;
}elseif(inputstr[inputstrTop]=='#'){return2;
}else{
return-1;
}
}elseif(stack[stackTop]=='T'){if(inputstr[inputstrTop]=='i')
{
return3;
}elseif(inputstr[inputstrTop]=='('){return3;
}else{
return-1;
}
}elseif(stack[stackTop]=='Y'){if(inputstr[inputstrTop]=='+')
{
return5;
}elseif(inputstr[inputstrTop]=='*'){return4;
}elseif(inputstr[inputstrTop]==')'){
return5;
}elseif(inputstr[inputstrTop]=='#'){return5;
}else{
return-1;
}
}elseif(stack[stackTop]=='F'){if(inputstr[inputstrTop]=='i'){
return7;
}elseif(inputstr[inputstrTop]=='('){return6;
}else{
return-1;
}
}else{
printf("错误!
");
}
return-1;
}
voidinit()
{
productions[0].leftChar='E';strcpy(productions[0].rightChars,"TX");strcpy(productions[0].allChars,"E->TX");
productions[1].leftChar='X';strcpy(productions[1].rightChars,"+TX");strcpy(productions[1].allChars,"E->+TX");
productions[2].leftChar='X';strcpy(productions[2].rightChars,"ε");
strcpy(productions[2].allChars,"X->ε");productions[3].leftChar='T';strcpy(productions[3].rightChars,"FY");
strcpy(productions[3].allChars,"T->FY");
productions[4].leftChar='Y';strcpy(productions[4].rightChars,"*FY");strcpy(productions[4].allChars,"Y->*FY");
productions[5].leftChar='Y';strcpy(productions[5].rightChars,"ε");strcpy(productions[5].allChars,"Y->ε");
productions[6].leftChar='F';strcpy(productions[6].rightChars,"(E)");strcpy(productions[6].allChars
"F->(E)");
productions[7].leftChar='F';strcpy(productions[7].rightChars,"i");strcpy(productions[7].allChars,"F->i");
}
intstackPush(int*top,Prodprod)
{
intlen;inti;
char*c="ε";len=strlen(prod.rightChars);if(!
strcmp(prod.rightChars,c))
{
stack[(*top)]='\0';
}else{
for(i=len-1;i>=0;i--)
{
stack[(*top)++]=prod.rightChars[i];
}
}
--(*top);return0;
}
intmatching(int*top,char*inputstr)
{
intlen;inti;
if(stack[(*top)]==inputstr[0])
{
stack[(*top)--]='\0';len=strlen(inputstr);for(i=0;i{
inputstr[i]=inputstr[i+1];
}
inputstr[i]='\0';return1;
}else
{
return0;
}
}
实验截图:
五、实验总结
通过这次的实验,我深入了解了语法分析器和LL
(1)文法预测分析法设计和实现,增强了我的自学能力和独立思考能力,也让我对程序设计有了更大的兴趣,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对编译原理应用有了更深入的认识与掌握。
在完成这个程序后,真的很开心,也了使我解到编译原理的魅
力所在,激发了我要解决更多更难问题的决心【。
下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】