语法分析器实验报告2.docx

上传人:b****1 文档编号:168889 上传时间:2022-10-05 格式:DOCX 页数:6 大小:24.46KB
下载 相关 举报
语法分析器实验报告2.docx_第1页
第1页 / 共6页
语法分析器实验报告2.docx_第2页
第2页 / 共6页
语法分析器实验报告2.docx_第3页
第3页 / 共6页
语法分析器实验报告2.docx_第4页
第4页 / 共6页
语法分析器实验报告2.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

语法分析器实验报告2.docx

《语法分析器实验报告2.docx》由会员分享,可在线阅读,更多相关《语法分析器实验报告2.docx(6页珍藏版)》请在冰豆网上搜索。

语法分析器实验报告2.docx

一、实验目的

设计、编制并调试一个语法分析程序,加深对语法分析原理的理解。

二实验要求

要求语法分析器的输入是单词串(含词的字符串形式、在源文件中的起止位置、词的类别),输出是源程序中各句子的单词起止编号、句子的语法树。

三实验内容

以下不同语法分析器中任选一个:

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)文法预测分析法设计和实现,增强了我的自学能力和独立思考能力,也让我对程序设计有了更大的兴趣,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对编译原理应用有了更深入的认识与掌握。

在完成这个程序后,真的很开心,也了使我解到编译原理的魅

力所在,激发了我要解决更多更难问题的决心【。

下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1