1217实验四 递归下降语法分析程序设计
2015-12-31 18:07
357 查看
#include <stdio.h> #include<dos.h> #include<stdlib.h> #include<string.h> 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(); int S(); 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++; e[0]='F';e[1]='=';e[2]='>';e[3]='i';e[4]='#'; output(); flag=0;input();input1(); ch=a[++i1]; } else {printf("error\n");return(0);} return(1); } void input() { int j=0; for (;j<=i1-flag;j++) printf("%c",b[j]); printf("\t\t"); printf("%c\t\t",ch); } void input1() { int j; for (j=i1+1-flag;j<n1;j++) printf("%c",a[j]); printf("\n"); } void output(){ int m,k,j,q; int i=0; m=0;k=0;q=0; i=n; d ='=';d[n+1]='>';d[n+2]='#';n=n+2;i=n; i=i-2; while(d[i]!='>'&&i!=0) i=i-1; i=i+1; while(d[i]!=e[0]) i=i+1; q=i; m=q;k=q; while(d[m]!='>') m=m-1; m=m+1; while(m!=q) { d =d[m];m=m+1;n=n+1; } d ='#'; for(j=3;e[j]!='#';j++){ d =e[j]; n=n+1; } k=k+1; while(d[k]!='=') { d =d[k];n=n+1;k=k+1; } d ='#'; system("pause"); }
相关文章推荐
- 左手Twitter右手Square,杰克 · 多西都在想什么
- TweenMax 一
- Linux 命令之fuser
- 第一课 OpenGL
- SAS进阶《深入解析SAS》之SAS数据挖掘的一般流程
- SAS进阶《深入解析SAS》之SAS数据挖掘的一般流程
- gcc内联汇编
- 高并发web应用性能提升实践
- java 定时器的几种实现方式以及 配置参数的说明
- Android添加phonegap--文件上传插件教程
- Angularjs自定义指令之复制指令
- 完全卸载oracle11g
- ubuntu 下舒畅的使用libreoffice
- 利用Github pages 创建自己的私人博客
- 高斯滤波器平滑图像代码
- 属性参数的区别
- 红尘缘深,前尘缘浅
- Thread的join()方法和Object的wait(),notify(),notifyAll()方法
- Libc堆管理机制及漏洞利用技术 (一)
- 第一个JWPlayer应用