编译原理实验报告.docx

上传人:b****6 文档编号:8829105 上传时间:2023-02-02 格式:DOCX 页数:9 大小:27.64KB
下载 相关 举报
编译原理实验报告.docx_第1页
第1页 / 共9页
编译原理实验报告.docx_第2页
第2页 / 共9页
编译原理实验报告.docx_第3页
第3页 / 共9页
编译原理实验报告.docx_第4页
第4页 / 共9页
编译原理实验报告.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

编译原理实验报告.docx

《编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告.docx(9页珍藏版)》请在冰豆网上搜索。

编译原理实验报告.docx

编译原理实验报告

计算机工程系实验报告

成绩:

课程名称:

编译原理

实验项目名称:

算符优先文法及FIRSTVT集

指导教师

(签名):

班级:

姓名:

学号:

一、实验目的

掌握算符优先文法FIRSTVT集的求法

二、实验内容

求以下文法所有非终结符的FIRSTVT集:

L->E

E->E+T

E->T

T->T*F

T->F

F->(E)

F->digit

三、实验要求

a) 文法可以在程序中指定,也可以在程序运行时从键盘输入;

b) digit表示终结符;

c) 在屏幕上输出最终结果

编码:

#include

#include

usingnamespacestd;

#defineMAX100structSTACK

{

intleft;

intright;

};

intsearch(chart,char*str,intnum)

{

inti;

for(i=0;i

{

if(t==str[i])

returni;

}

return-1;

}

intmain()

{

charwenfa[MAX][MAX];//00个长度为100的产生式

charstr[MAX];

charzhongjiefu[MAX];

charfeizhongjiefu[MAX];

chartemp[MAX];

inti,j,k;

intflag1=0,flag2=0,flag3=0;

boolF[MAX][MAX];

STACKS[MAX];

inttop=-1;

memset(F,false,sizeof(F));

cout<<"请输入产生式,最后以end结束"<

while(cin>>str&&strcmp(str,"end"))//只要str不等end,返回值就不为0;

strcmp(constchar*s1,constchar*s2);说明:

当s1s2时,返回值>0

{

strcpy(wenfa[flag1++],str);

}//------------求出不重复的非终结符集和终结符集------------

for(i=0;i

{

if(i==0)

{

feizhongjiefu[flag2++]=wenfa[i][0];//存法产生式的非终结符

}

else

{

for(j=0;j

{

if(wenfa[i][0]==feizhongjiefu[j])

{

break;

}

}

if(j==flag2)

{

feizhongjiefu[flag2++]=wenfa[i][0];

}

}

}

for(i=0;i

{

intcount=0;

for(j=3;j

{

temp[count++]=wenfa[i][j];

}

temp[count]='\0';

if(strcmp(temp,"digit")==0)

{

if(i==0)

{

zhongjiefu[flag3++]='';

}

else

{

for(j=0;j

{

if(zhongjiefu[j]=='')

{

break;

}

}

if(j==flag3)

{

zhongjiefu[flag3++]='';

}

}

}

else

{

for(j=3;j

{

if(j==3&&(wenfa[i][j]>'Z'||wenfa[i][j]<'A')&&flag3==0)

{

zhongjiefu[flag3++]=wenfa[i][j];

}

else

{

for(k=0;k

{

if(wenfa[i][j]==zhongjiefu[k])

{

break;

}

}

if(k==flag3&&(wenfa[i][j]>'Z'||wenfa[i][j]<'A'))

{

zhongjiefu[flag3++]=wenfa[i][j];

}

}

}

}

}

 

//开始

inta,b;

for(i=0;i

{

if(wenfa[i][3]>'Z'||wenfa[i][3]<'A')

{

intcount=0;

for(j=3;j

{

temp[count++]=wenfa[i][j];

}

temp[count]='\0';

if(strcmp(temp,"digit")==0)

{

a=search(wenfa[i][0],feizhongjiefu,flag2);

b=search('',zhongjiefu,flag3);

F[a][b]=true;

top++;

S[top].left=a;

S[top].right=b;

}

else

{

a=search(wenfa[i][0],feizhongjiefu,flag2);

b=search(wenfa[i][3],zhongjiefu,flag3);

F[a][b]=true;

top++;

 

  S[top].left=a;

   S[top].right=b;      

  } 

 }

  else

  {

intcount=0;

for(j=4;j

{

temp[count++]=wenfa[i][j];

}

temp[count]='\0';

if(strcmp(temp,""))//避免后续所指单词没有内容。

{

if(strcmp(temp,"digit")==0)

{

a=search(wenfa[i][0],feizhongjiefu,flag2);

b=search('',zhongjiefu,flag3);

F[a][b]=true;

top++;

S[top].left=a;

S[top].right=b;

}

else

if(wenfa[i][4]>'Z'||wenfa[i][4]<'A')

{

a=search(wenfa[i][0],feizhongjiefu,flag2);

b=search(wenfa[i][4],zhongjiefu,flag3);

F[a][b]=true;

top++;

S[top].left=a;

S[top].right=b;

}

}

}

}

while(top!

=-1)

{

charB,a;

intt1;

B=feizhongjiefu[S[top].left];

a=zhongjiefu[S[top].right];

t1=S[top].right;

for(i=0;i

{

intt;

t=search(wenfa[i][0],feizhongjiefu,flag2);

if(wenfa[i][3]==B&&B!

=wenfa[i][0]&&F[t][t1]==false)

{F[t][t1]=true;

S[top].left=t;

S[top].right=t1;

top++;

}

}

top--;

}

for(i=0;i

{

cout<<"FIRSTVT("<

for(j=0;j

{

if(F[i][j]==true)

{

if(zhongjiefu[j]=='')

{

cout<<"digit,";

}

else

{

cout<

}

}

}

if(zhongjiefu[j]=='')

cout<<"digit";

else

cout<

cout<<"}"<

}

return0;

}

 

四、实验结果与分析

五、实验总结

通过本次实验设计掌握了算符优先文法FIRSTVT集的求法,加深了我对编译原理这门课程的了解,锻炼了我的动手能力。

在本次设计中,我不仅掌握了课本上所学的,而且学会了很多课外的知识。

在本次课程设计实现过程中遇到了很多问题,这些都需要努力地查阅各种资料寻找信息。

这个设计完成之后不仅学到了不少知识,而且提高了获取信息并合理应用的能力。

在本次课程设计中,我将这段时间以来课堂内外一点点逐渐积累的编译原理编程技能综合应用到一个较为完整的编译测试中,夯实了测试语法是否正确的技能,同时为今后做出更加复杂、更加大型、更加综合的语法测试奠定了坚实的基础。

冰冻三尺,非一日之寒。

在今后的学习和生活中,我将继续以一种虚心和坚持的态度,不断学习新的知识和技能来充实自己,进一步提高自己的专业技能与修养。

 

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

当前位置:首页 > 求职职场 > 面试

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

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