编译原理—递归下降分析
来源:互联网 发布:php文章分页 编辑:程序博客网 时间:2024/06/04 18:08
/*(1)E→TG(2)G→ATG(3)G→ε(4)T→FH(5)H→MFH(6)H→ε(7)F→i(8)A→+(9)A→-(10)M→*(11)M→/*/#include <iostream>#include <fstream>#include <dos.h>#include <cstring>#include <stdlib.h>using namespace std;char a[100], b[100], d[500], e[10];char ch;int n1,i1=0,flag=1,n=5;int E1();int E();int G();int T();int H();int F();int A();int M();void input();void input1();void output();//================================================int main() /*递归分析*/{ int p; char x; d[0]='E'; d[1]='='; d[2]=' '; d[3]='T'; d[4]='G'; d[5]='#'; //从文件中读入除换行符之外的字符 ifstream infile("data.txt",ios::in); if(!infile) { cerr<<"open error!"<<endl; exit(1); } char c='c',f[50]= {""}; int i=0,k=0,l=0; while(infile.peek()!=EOF) { infile.get(c); if(c!='\n') { f[i]=c; i++; } } //给操作数组a赋初值,依次进行操作 do { a[k]=f[l]; if(f[l]=='#') { cout<<"从文件读入字符串(长度<50,以#号结束)\n"; for(int j=0; a[j]!='\0'; j++) cout << a[j]; n1=i; ch=b[0]=a[0]; cout<<"\n文法\t分析串\t\t分析字符\t剩余串\n"; E1(); if (ch=='#') { cout<<"accept"<<endl; p=0; x=d[p]; while(x!='#') { cout<<x; p=p+1; x=d[p]; /*输出推导式*/ } } else { cout<<"error"<<endl; cout<<"回车返回"<<endl; return (0); } cout<<endl; cout<<"继续>>>>\n"<<endl; memset(a,'\0',sizeof(a)); memset(b,'\0',sizeof(b)); memset(e,'\0',sizeof(e)); i1=0,flag=1,n=5; k=-1; } k++; l++; } while(f[l]!='\0'); infile.close(); return 0;}//================================================int E1(){ int f,t; cout<<"E->TG\t"; 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; cout<<"E->TG\t"; 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 G(){ int f,t,g; if(ch=='+'||ch=='-') { cout<<"G→ATG\t"; e[0]='G'; e[1]='='; e[2]=' '; e[3]='A'; e[4]='T'; e[5]='G'; e[6]='#'; output(); flag=1; input(); input1(); f=A(); if (f==1) { t=T(); if(t==0) { cout<<"error"<<endl; return (0); } g=G(); if (g==0) return(0); return(1); } } cout<<"G->^\t"; e[0]='G'; e[1]='='; e[2]=' '; e[3]='^'; e[4]='#'; output(); flag=1; input(); input1(); return(1);}//================================================int T(){ int f,t; printf("T->FH\t"); e[0]='T'; e[1]='='; e[2]=' '; e[3]='F'; e[4]='H'; e[5]='#'; output(); flag=1; input(); input1(); f=F(); if (f==0) return(0); t=H(); if (t==0) return(0); else return(1);}//================================================int H(){ int f,t,g; if(ch=='*'||ch=='/') { cout<<"H->MFH\t"; e[0]='H'; e[1]='='; e[2]=' '; e[3]='M'; e[4]='F'; e[5]='H'; e[6]='#'; output(); flag=1; input(); input1(); f=M(); if (f==1) { t=F(); if(t==0) { cout<<"error"<<endl; return (0); } g=H(); if (g==0) return(0); return(1); } } cout<<"H->^\t"; e[0]='H'; e[1]='='; e[2]=' '; e[3]='^'; e[4]='#'; output(); flag=1; a[i1]=ch; input(); input1(); return(1);}//================================================int F(){ if(ch=='i') { b[i1]=ch; cout<<"F->i\t"; e[0]='F'; e[1]='='; e[2]=' '; e[3]='i'; e[4]='#'; output(); flag=0; input(); input1(); ch=a[++i1]; } else { cout<<"error\n"; return(0); } return(1);}//================================================int A(){ if(ch=='+') { b[i1]=ch; cout<<"A->+\t"; e[0]='A'; e[1]='='; e[2]=' '; e[3]='+'; e[4]='#'; output(); flag=0; input(); input1(); ch=a[++i1]; } else if(ch=='-') { b[i1]=ch; cout<<"A->-\t"; e[0]='A'; e[1]='='; e[2]=' '; e[3]='-'; e[4]='#'; output(); flag=0; input(); input1(); ch=a[++i1]; } else { cout<<"error\n"; return(0); } return(1);}//================================================int M(){ if(ch=='*') { b[i1]=ch; cout<<"M->*\t"; e[0]='M'; e[1]='='; e[2]=' '; e[3]='*'; e[4]='#'; output(); flag=0; input(); input1(); ch=a[++i1]; } else if(ch=='/') { b[i1]=ch; cout<<"M->/\t"; e[0]='M'; e[1]='='; e[2]=' '; e[3]='/'; e[4]='#'; output(); flag=0; input(); input1(); ch=a[++i1]; } else { cout<<"error\n"; return(0); } return(1);}//================================================void input(){ for (int j=0; j<=i1-flag; j++) cout<<b[j]; /*输出分析串*/ cout<<"\t\t"; cout<<ch<<"\t\t"; /*输出分析字符*/}//================================================void input1(){ for (int j=i1+1-flag; j<n1; j++) cout<<a[j]; /*输出剩余字符*/ cout<<endl;}//================================================void output() /*推导式计算*/{ int m,k,j,q; int i=0; m=0; k=0; q=0; i=n; d[n]='='; 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[n]=d[m]; m=m+1; n=n+1; } d[n]='#'; for(j=3; e[j]!='#'; j++) { d[n]=e[j]; n=n+1; } k=k+1; while(d[k]!='=') { d[n]=d[k]; n=n+1; k=k+1; } d[n]='#';}
运行结果:
学习心得:
通过这次实验,真的学到了不少东西。有些看似很好敲的代码,真正实现起来是非常的麻烦,也许是自己的专业水平还有些差距。
不管怎么说,经过千辛万苦终于还是写出来了,自己是最棒的!
0 0
- 编译原理—递归下降分析
- 编译原理实验3——递归下降分析
- 编译原理(递归下降分析程序)
- 递归下降分析法(编译原理)
- 编译原理实验2-递归下降分析法
- 编译原理实验2-递归下降分析–表达式求值
- 编译原理练习 递归下降
- 编译原理-递归下降分析器
- 【编译原理】自顶向下的语法分析之递归下降分析法
- 编译原理学习笔记05——(识别孙悟空72变之魔鬼特训—递归下降分析程序构造)——2014_1_20
- 编译原理实验三——语法分析(递归下降法)
- 编译原理--递归下降语法分析源代码(C Language)
- 编译原理 实验3 递归下降语法分析程序设计
- 递归下降法的语法分析器-3-编译原理
- 递归下降法的语法分析器-3.1-编译原理
- 编译原理-递归下降语法分析器(Java)
- 递归下降分析程序
- 递归下降分析法
- cvWriteFrame 写入一帧到一个视频文件中
- Java中Runnable和Thread的区别
- 消息推送业务逻辑处理 “MessageUI”
- C++之getch(),getche(),getchar()的区别
- LeetCode-345.Reverse Vowels of a String
- 编译原理—递归下降分析
- 希尔排序
- CMake与Make
- HTML5简介
- 反虚拟机设置
- 查找配置文件的工具类
- redis系列--set操作
- 结网读书笔记
- 第七章 TCP/IP协议及应用