您好,欢迎访问三七文档
/*第三次上机-语法分析1目的:熟练掌握自上而下的语法分析方法,并能用程序实现。要求:1.使用的文法如下:ETEE+TE|εTFTT*FT|εF(E)|id2.对于任意给定的输入串(词法记号流)进行语法分析,递归下降方法和非递归预测分析方法可以任选其一来实现。3.要有一定的错误处理功能即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。可以参考书上介绍的同步记号集合来处理。可能的出错情况:idid*id,id**id,(id+id,+id*+id……4.输入串以#结尾,输出推导过程中使用到的产生式。例如:输入:id+id*id#输出:ETE'TFT'FidE+TE'TFT'……如果输入串有错误,则在输出中要体现是跳过输入串的某些记号了,还是弹栈,弹出某个非终结符或者是终结符了,同时给出相应的出错提示信息。比如:idid*id对应的出错信息是:输入串跳过记号id,用户多输入了一个id;id**id对应的出错信息是:弹栈,弹出非终结符F,用户少输入了一个id(id+id对应的出错信息是:弹栈,弹出终结符),用户少输入了一个右括号(或者说,括号不匹配)有余力的同学可进一步考虑如下扩展:1.将递归下降方法和非递归预测分析方法都实现2.在语法分析的过程中调用前两次上机的结果,即利用词法分析器来返回一个记号给语法分析器。3.编写First和Follow函数,实现其求解过程。*/#includestdio.h#includedos.h#includestdlib.h#includestring.hchara[50],b[50];charch;intn1,i1=0,flag=1,n=5,signal=0;inttotal=0;/*步骤计数器*/intE();intT();intE1();/*E'*/intT1();/*T'*/intF();voidinput();voidinput1();voidmain()/*递归分析*/{intf,j=0;printf(请输入字符串(长度50,以#号结束)\n);do{scanf(%c,&ch);a[j]=ch;j++;}while(ch!='#');n1=j;ch=b[0]=a[0];printf(步骤\t文法\t\t分析串\t\t分析字符\t剩余串\n);f=E();if(f==0)return;if(ch=='#')printf(accept\n);else{printf(!!!!error\n);return;}printf(\n);}intE(){intf,t;printf(%d\tE--TE'\t\t,total);total++;flag=1;input();input1();if(i1==0){while(ch=='+'||ch=='*'){if(ch=='+')//+i{b[i1]=ch;printf(%d\t?????\t\t,total);total++;flag=0;input();input1();printf(串首部多输入了一个+!error\n);ch=a[++i1];}if(ch=='*')//*i{b[i1]=ch;printf(%d\t?????\t\t,total);total++;flag=0;input();input1();printf(串首部多输入了一个*!error\n);ch=a[++i1];}}}f=T();if(f==0)return(0);t=E1();if(t==0)return(0);elsereturn(1);}intT(){intf,t;printf(%d\tT--FT'\t\t,total);total++;flag=1;input();input1();f=F();if(f==0)return(0);t=T1();if(t==0)return(0);elsereturn(1);}intE1(){intf,t;if(ch=='+'){b[i1]=ch;printf(%d\tE'--+TE'\t,total);total++;flag=0;input();input1();ch=a[++i1];if(ch=='+')//i++i{b[i1]=ch;printf(%d\t?????\t\t,total);total++;flag=0;input();input1();printf(少输入了一个i!error\n);ch=a[++i1];}if(ch=='*')//i+*i{b[i1]=ch;printf(%d\t?????\t\t,total);total++;flag=0;input();input1();printf(少输入了一个i!error\n);ch=a[++i1];}f=T();if(f==0)return(0);t=E1();if(t==0)return(0);elsereturn(1);}printf(%d\tE'--ε\t\t,total);total++;flag=1;input();input1();return(1);}intT1(){intf,t;if(ch=='*'){b[i1]=ch;printf(%d\tT'--*FT'\t,total);total++;flag=0;input();input1();ch=a[++i1];if(ch=='*')//i**i{b[i1]=ch;printf(%d\t?????\t\t,total);total++;flag=0;input();input1();printf(少输入了一个i!error\n);ch=a[++i1];}if(ch=='+')//i*+i{b[i1]=ch;printf(%d\t?????\t\t,total);total++;flag=0;input();input1();printf(少输入了一个i!error\n);ch=a[++i1];}f=F();if(f==0)return(0);t=T1();if(t==0)return(0);elsereturn(1);}printf(%d\tT'--ε\t\t,total);total++;flag=1;a[i1]=ch;input();input1();return(1);}intF(){intf;if(ch=='('){b[i1]=ch;printf(%d\tF--(E)\t\t,total);total++;flag=0;signal=1;input();input1();ch=a[++i1];f=E();if(f==0)return(0);if(ch==')'){b[i1]=ch;printf(%d\tF--(E)\t\t,total);total++;flag=0;input();input1();ch=a[++i1];signal=0;}else{printf(缺少右括号!error\n);//return(0);//考虑容忍没有右)的情况}}elseif(ch=='i'){b[i1]=ch;printf(%d\tF--i\t\t,total);total++;flag=0;input();input1();ch=a[++i1];if(ch==')'&&!signal){b[i1]=ch;printf(%d\t?????\t\t,total);total++;flag=0;input();input1();printf(缺少左括号!error\n);ch=a[++i1];}if(ch=='i'){b[i1]=ch;printf(%d\t?????\t\t,total);total++;flag=0;input();input1();printf(多输入了一个i!error\n);ch=a[++i1];}}else{printf(error\n);//return(0);}return(1);}voidinput(){intj=0;for(;j=i1-flag;j++)printf(%c,b[j]);/*输出分析串*/printf(\t\t);printf(%c\t\t,ch);/*输出分析字符*/}voidinput1(){intj;for(j=i1+1-flag;jn1;j++)printf(%c,a[j]);/*输出剩余字符*/printf(\n);}
本文标题:语法分析代码
链接地址:https://www.777doc.com/doc-2029554 .html