1、实验二求文法中每个非终结符的FIRSTVT集实验二 算符优先文法及FIRSTVT集1实验目的:掌握算符优先文法FIRSTVT集的求法2实验内容:求以下文法所有非终结符的FIRSTVT集 L EE E+TE TT T*FT FF (E)F digit3实验要求:a)文法可以在程序中指定,也可以在程序运行时从键盘输入;b)digit表示终结符;c)在屏幕上输出最终结果;编码:#include#includeusing namespace std;#define MAX 100struct STACK int left; int right;int search(char t,char *str,i
2、nt num) int i; for(i=0;inum;i+) if(t=stri) return i; return -1;int main() char wenfaMAXMAX;/00个长度为100的产生式 char strMAX; char zhongjiefuMAX; char feizhongjiefuMAX; char tempMAX; int i,j,k; int flag1=0,flag2=0,flag3=0; bool FMAXMAX; STACK SMAX; int top=-1; memset(F,false,sizeof(F); cout请输入产生式,最后以end结束s
3、tr&strcmp(str,end)/只要str不等end,返回值就不为0;strcmp(const char *s1,const char * s2); 说明:当s1s2时,返回值s2时,返回值0 strcpy(wenfaflag1+,str); /-求出不重复的非终结符集和终结符集- for(i=0;iflag1;i+)/取非终结符; if(i=0) feizhongjiefuflag2+=wenfai0;/存法产生式的非终结符 else for(j=0;jflag2;j+) if(wenfai0=feizhongjiefuj) break; if(j=flag2) feizhongjie
4、fuflag2+=wenfai0; for(i=0;iflag1;i+)/取终结符 int count=0; for(j=3;jstrlen(wenfai);j+) tempcount+=wenfaij; tempcount=0; if(strcmp(temp,digit)=0) if(i=0) zhongjiefuflag3+= ; else for(j=0;jflag3;j+) if(zhongjiefuj= ) break; if(j=flag3) zhongjiefuflag3+= ; else for(j=3;jZ|wenfaijA)&flag3=0) zhongjiefuflag3
5、+=wenfaij; else for(k=0;kZ|wenfaijA) zhongjiefuflag3+=wenfaij; /开始 int a,b; for(i=0;iZ|wenfai3A) int count=0; for(j=3;jstrlen(wenfai);j+) tempcount+=wenfaij; tempcount=0; if(strcmp(temp,digit)=0) a=search(wenfai0,feizhongjiefu,flag2); b=search( ,zhongjiefu,flag3); Fab=true; top+; Stop.left=a; Stop.r
6、ight=b; else a=search(wenfai0,feizhongjiefu,flag2); b=search(wenfai3,zhongjiefu,flag3); Fab=true; top+; Stop.left=a; Stop.right=b; else int count=0; for(j=4;jZ|wenfai4A) a=search(wenfai0,feizhongjiefu,flag2); b=search(wenfai4,zhongjiefu,flag3); Fab=true; top+; Stop.left=a; Stop.right=b; while(top!=-
7、1) char B,a; int t1; B=feizhongjiefuStop.left; a=zhongjiefuStop.right; t1=Stop.right; for(i=0;iflag1;i+) int t; t=search(wenfai0,feizhongjiefu,flag2); if(wenfai3=B&B!=wenfai0&Ftt1=false) Ftt1=true; Stop.left=t; Stop.right=t1; top+; top-; for(i=0;iflag2;i+) coutFIRSTVT(feizhongjiefui)=; for(j=0;jflag3-1;j+) if(Fij=true) if(zhongjiefuj= ) coutdigit,; else coutzhongjiefuj,; if(zhongjiefuj= ) coutdigit; else coutzhongjiefuj; coutendlendlendl; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1