c语言_递归下降分析程序实验

  • 格式:doc
  • 大小:39.50 KB
  • 文档页数:13

实验二 递归下降语法分析程序的设计与实现 一、实验目的: 加深对语法分析器工作过程的理解;加强对递归下降法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。

二、实验内容: 在实验1的基础上,用递归下降分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程工具。

三、实验要求: 1. 对语法规则有明确的定义; 2. 编写的分析程序能够进行正确的语法分析; 3. *对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;

4. 实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现*。

四、实验学时:4学时 五、实验步骤: 1. 定义目标语言的语法规则; 2. 根据语法规则输入语句段,用递归下降分析的方法进行语法分析,直到结束; 3. *对遇到的语法错误做出错误处理。 六、实验内容: 1.编程实现给定文法的递归下降分析程序。 E→T|E+T T→F|T*F F→(E)|i 2.(参考课本P74)对文法先进行消除左递归。 3.分析程序由一组递归过程组成,文法中每个非终结符对应一个过程几个全局过程和变量:

ADVANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号 SYM,IP当前所指的输入符号 ERROR,出错处理子程序 每个非终结符有对应的子程序的定义,首先在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。

4. 具体实现时: (1)当遇到终结符,编写: if(当前读到的输入符号=i) 读入下一个输入符号 (2)当遇到非终结符E时,编写语句: 调用E() (3)当遇到E--> 编写语句 if(当前读到的输入符号不属于Follow(E)) Error(); (4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一的选择一个候选式进行推导。

#include using namespace std; char a[80]; // 字符串的存入 char sym; // 单个的判断字符 int i=0; // 字符串下标 void E(); // 功能识别函数 void E2(); // 功能识别函数 void T(); // 功能识别函数 void T2(); // 功能识别函数 void F(); // 功能识别函数 void input(); // 输入函数 void advance(); // 字符串小标进一函数 。。。。。。。。 5. 代码实现: #include #include #include #include

char a[50] ,b[50],d[200],e[10]; char ch; int n1,i1=0,flag=1,n=5; int total=0;/*步骤计数器*/

int E(); int E1(); int T(); int G();/*E’*/ int S();/*T’*/ int F();

void input(); void input1(); void output();

void main() /*递归分析*/ { int f,p,j=0; char x; d[0]='E'; d[1]='='; d[2]='>'; d[3]='T'; d[4]='G'; d[5]='#'; 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剩余串\n"); f=E1(); if (f==0) return; if (ch=='#') { printf("accept\n"); p=0; x=d[p]; while(x!='#') { printf("%c",x);p=p+1;x=d[p]; /*输出推导式*/

} }else { printf("error\n"); printf("回车返回\n"); getchar(); getchar(); return; } printf("\n"); printf("回车返回\n"); getchar(); getchar();

}

int E1() { int f,t; printf("%d\tE-->TG\t",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("%d\tE-->TG\t",total);total++; e[0]='E';e[1]='=';e[2]='>';e[3]='T';e[4]='G';e[5]='#'; output(); flag=1; input(); input1(); f=T(); if (f==0) return(0); t=G(); if (t==0) return(0); else return(1); }

int T() { int f,t; printf("%d\tT-->FS\t",total);total++; e[0]='T';e[1]='=';e[2]='>';e[3]='F';e[4]='S';e[5]='#'; output(); flag=1; input(); input1(); f=F(); if (f==0) return(0); t=S(); if (t==0) return(0); else return(1); }

int G() { int f; if(ch=='+') { b[i1]=ch; printf("%d\tG-->+TG\t",total);total++;

e[0]='G';e[1]='=';e[2]='>';e[3]='+';e[4]='T';e[5]='G';e[6]='#';

output(); flag=0; input();input1(); ch=a[++i1]; f=T(); if (f==0) return(0); G(); return(1); } printf("%d\tG-->^\t",total);total++; e[0]='G';e[1]='=';e[2]='>';e[3]='^';e[4]='#'; output(); flag=1; input();input1(); return(1); }

int S() { int f,t; if(ch=='*') { b[i1]=ch;printf("%d\tS-->*FS\t",total);total++;

e[0]='S';e[1]='=';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#';

output(); flag=0; input();input1(); ch=a[++i1]; f=F(); if (f==0) return(0); t=S(); if (t==0) return(0); else return(1);} printf("%d\tS-->^\t",total);total++; e[0]='S';e[1]='=';e[2]='>';e[3]='^';e[4]='#'; output(); flag=1; a[i1]=ch; input();input1(); return(1); }

int F() { int f; if(ch=='(') { b[i1]=ch;printf("%d\tF-->(E)\t",total);total++;

e[0]='F';e[1]='=';e[2]='>';e[3]='(';e[4]='E';e[5]=')';e[6]='#';

output(); flag=0; input();input1(); ch=a[++i1]; f=E(); if (f==0) return(0); if(ch==')') { b[i1]=ch;printf("%d\tF-->(E)\t",total);total++; flag=0;input();input1(); ch=a[++i1]; } else { printf("error\n"); return(0); } } else if(ch=='i') { b[i1]=ch;printf("%d\tF-->i\t",total);total++;