1、c语言递归下降分析程序实验共13页、实验目的: 加深对语法分析器工作过程的理解;加强对递归下降法实现语法分析程序的掌 握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分 析程序对简单的程序段进行语法翻译。、实验内容: 在实验 1的基础上,用递归下降分析法编制语法分析程序,语法分析程序的实 现可以采用任何一种编程工具。三、实验要求:1.对语法规则有明确的定义;2.编写的分析程序能够进行正确的语法分析;3.*对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示, 保证顺利完成语法分析过程;4.实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的 工作过程,
2、说明错误处理的实现 *。四、实验学时: 4学时五、实验步骤:1.定义目标语言的语法规则;2.根据语法规则输入语句段,用递归下降分析的方法进行语法分析,直到结束;3.*对遇到的语法错误做出错误处理。六、实验内容:1.编程实现给定文法的递归下降分析程序。E T|E+TT F|T*FF(E)|i2.(参考课本P74)对文法先进行消除左递归。3.分析程序由一组递归过程组成,文法中每个非终结符对应一个过程几个全局 过程和变量:ADVANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号SYM,IP当前所指的输入符号ERROR,出错处理子程序每个非终结符有对应的子程序的定义,首先在分析过程中,
3、当需要从某个非终 结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。4.具体实现时:当遇到终结符,编写:if (当前读到的输入符号=i)读入下一个输入符号当遇到非终结符E时,编写语句:调用E()当遇到E-编写语句if (当前读到的输入符号不属于Follow (E)Error();(4)当某个非终结符的规则有多个候选式时,按 LL(1)文法的条件能唯一的选 择一个候选式进行推导。#in elude using n ames pace std;char a80;字符串的存入char sym;单个的判断字符int i=0;/字符串下标void E();/功能识别函数void E2();/功
4、能识别函数void T();/功能识别函数void T2();/功能识别函数void F();/功能识别函数void input(); / 输入函数void advance(); / 字符串小标进一函数5.代码实现:#include #include #include #include char a50 ,b50,d200,e10;char ch;int n1,i1=0,flag=1,n=5;int total=0;/* 步骤计数器 */ int E();int E1();int T();int F();void input();void input1();void output();void
5、 main()/*递归分析 */int f,p,j=0;char x;d0=E;d1=;d2=;d3=T;d4=G;d5=#;printf(请输入字符串(长度50,以#号结束)n);doscanf(%c,&ch);aj=ch;j+;while(ch!=#);n1=j;ch=b0=a0;printf(步骤吐文法t分析串tt分析字符t剩余串n);f=E1();if (f=0) return;if (ch=#)p=0;x=dp;/*输出推导while(x!=#) printf(%c,x);p=p+1;x=dp;式*/else printf(errorn);printf( 回车返回 n);getcha
6、r();getchar();return;printf(n);printf(回车返回 n);getchar();getchar();int f,t;printf(%dtE-TGt,total);total+;flag=1;input();input1();f=T();if (f=0) return(0);t=G();if (t=0) return(0);else return(1);int E()int f,t;printf(%dtE-TGt,total);total+;e0=E;e1=;e2=;e3=T;e4=G;e5=#;output();flag=1;input();input1();f
7、=T();if (f=0) return(0);t=G();if (t=0) return(0);else return(1);int T()int f,t;printf(%dtT-FSt,total);total+;e0=T;e1=;e2=;e3=F;e4=S;e5=#;output();flag=1;input();input1();f=F();if (f=0) return(0);t=S();if (t=0) return(0);else return(1);intG()if(ch=+) bi1=ch;e0=G;e1=;e2=;e3=+;e4=T;e5=G;e6=#;output();f
8、lag=0;input();input1();ch=a+i1;f=T();if (f=0) return(0);G();return(1);prin tf(%dtG-At,total);total+;e0=G;e1=;e2=;e3=A;e4=#;output();flag=1;input();input1();return(1);int S()if(ch=*) bi1=ch;printf(%dtS-*FSt,total);total+;e0=S;e1=;e2=;e3=*;e4=F;e5=S;e6=#;output();flag=0;input();input1();ch=a+i1;f=F();
9、if (f=0) return(0);t=S();if (t=0) return(0);else return(1);prin tf(%dtS-At,total);total+;e0=S;e1=;e2=;e3=A;e4=#;output();flag=1;ai1=ch;input();input1();return(1);int F()int f;if(ch=() bi1=ch;printf(%dtF-(E)t,total);total+;e0=F;e1=;e2=;e3=(;e4=E;e5=);e6=#;output();flag=0;input();input1();ch=a+i1;f=E(
10、);if (f=0) return(0);if(ch=) bi1=ch;printf(%dtF-(E)t,total);total+;flag=0;input();input1();ch=a+i1;else printf(errorn);return(0);else if(ch=i) bi1=ch;printf(%dtF-it,total);total+;e0=F;e1=;e2=;e3=i;e4=#;output();flag=0;input();input1();ch=a+i1;else printf(errorn);return(0);return(1);void input()int j
11、=0;for (;j=i1-flag;j+)printf(%c,bj);/*输出分析串 */printf(tt);printf(%ctt,ch);/*输出分析字符 */void input1()int j;for (j=i1+1-flag;j;dn+2=#;n=n+2;i=n;i=i-2;while(di!=&i!=0) i=i-1;i=i+1;while(di!=e0) i=i+1;q=i;m=q;k=q;while(dm!=) m=m-1;m=m+1;while(m!=q) dn=dm;m=m+1;n=n+1;dn=#;for(j=3;ej!=#;j+)dn=ej;n=n+1;k=k+1;while(dk!=) dn=dk;n=n+1;k=k+1;dn=#;system(pause);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1