《2022年递归下降分析法 .pdf》由会员分享,可在线阅读,更多相关《2022年递归下降分析法 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译原理课程实验报告班级学号:姓名:实验名称 :递归下降分析法一、实验目的:根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。二、实验要求:对下列文法,用递归下降分析法对任意输入的符号串进行分析:(1)E-TG (2)G-+TG|TG (3)G-(4)T-FS (5)S-*FS|/FS (6)S-(7)F-(E) (8)F-i 输出的格式如下:(1)递归下降分析程序,编制人:姓名,学号,班级(2)输入一以 #结束的符号串 (包括+*/()i#):在此位置输入符号串例如:i+i*i# (3)输出结果: i+i*i# 为合法符号串
2、备注:输入一符号串如i+i*#, 要求输出为“非法的符号串” 。注意:1.表达式中允许使用运算符(+-*/) 、分割符(括号)、字符 i,结束符 #;2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);三、实验过程:程序设计:1.模块设计: 将程序分成合理的多个模块 (函数) ,每个模块做具体的同一事情。2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。程序编写:1.定义部分:定义常量、变量、数据结构。2.初始化:从文件将输入符号串输入到字符缓冲区中。3.利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。四、实验结果名师资料总结 -
3、 - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - (1)程序流程图主函数 main( )流程图E( )过程流程图T( )过程流程图开始输出分析栈内容和当前动作将分析栈的T 换成 FS 是 FS return 1 return 0 YN开始输入待处理的字符串得到字符串的长度将开始符E 放入堆栈得到第一个字符token 递归下降分析输出信息结束开始输出分析栈内容和当前动作将分析栈的E 换成 EG 是 TG return 1 return 0 YN名
4、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - G( )过程流程图F( )过程流程图开始token 是+ token 是- 输出分析栈信息输出分析栈信息输出分析栈信息匹配 + 匹配 - 返回return 1 return 0 YYN N YN开始token 是( token 是 i 输出错误输出分析栈信息将分析栈最后一个元素换成 E 输出分析栈信息匹配 i 匹配 ( 进行 E 过程匹配 ) NNYY将分析栈的G 换成 TG 是
5、TG 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - S( )过程流程图(2)运行结果示例程序:#include #include #include #include char a50 ,b50,d500,e10; char ch; int n1,i1=0,flag=1,n=5; int E(); int E1(); int T(); int G(); int S(); int F();void input(); void i
6、nput1(); void output(); void main() /*递归分析 */ 开始输出分析栈信息token 是* token 是/ 将栈顶元素弹出匹配 * 匹配 / 将堆栈栈顶元素换成 FS F 过程S 过程结束名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - int f,p,j=0; char x; d0=E; d1=; d2=; d3=T; d4=G; d5=#; printf( 递归下降分析程序,编制人:_,
7、_,_n); printf( 输入一以 #结束的符号串 (包括+ - * / ( ) i #, 且长度小于 50):); do scanf(%c,&ch); aj=ch; j+; while(ch!=#); n1=j; ch=b0=a0; printf( 文法t 分析串 ttt 分析字符 tt 剩余串 n); f=E1(); if(f=0) return ; if (ch=#) printf(acceptn); p=0; x=dp; while(ap!=#) printf(%c,ap+); printf( 为合法字符 !n); else / printf(errorn); j=0; while
8、(aj!=#) printf(%c,aj+); printf( 非法字符 !n); printf( 回车返回 n); getchar();getchar(); return; printf(n); printf( 回车返回 n); getchar(); getchar(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - int E1() int f,t; printf(E-TGt); flag=1; input(); inp
9、ut1(); f=T(); if (f=0) return(0); t=G(); if (t=0) return(0); else return(1); int E() int f,t; printf(E-TGt); e0=E;e1=;e2=;e3=T;e4=G;e5=#; 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(T-FSt); e0=T;e1=;e2=;e3=F;e4=S;
10、e5=#; output(); flag=1; input(); input1(); f=F(); if (f=0) return(0); t=S(); if (t=0) return(0); else return(1); int G() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - int f; if(ch=+) bi1=ch; printf(G-+TGt); e0=G;e1=;e2=;e3=+;e4=T;e5=G;e6
11、=#; output(); flag=0; input();input1(); ch=a+i1; f=T(); if (f=0) return(0); f=G(); if(f=0) return 0; else return 1; else if(ch=-) bi1=ch; printf(G-TGt); e0=G;e1=;e2=;e3=-;e4=T;e5=G;e6=#; output(); flag=0; input();input1(); ch=a+i1; f=T(); if (f=0) return(0); f=G(); if(f=0) return 0; else return 1; e
12、lse printf(G-t); e0=G;e1=;e2=;e3=;e4=#; output(); flag=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - input();input1(); return(1); int S() int f,t; if(ch=*) bi1=ch; printf(S-*FSt); e0=S;e1=;e2=;e3=*;e4=F;e5=S;e6=#; output(); flag=0; in
13、put();input1(); ch=a+i1; f=F(); if (f=0) return(0); t=S(); if (t=0) return(0); else return(1); else if(ch=/) bi1=ch; printf(S-/FSt); e0=S;e1=;e2=;e3=/;e4=F;e5=S;e6=#; 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); else 名师资料总结 - - -精
14、品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - printf(S-t); e0=S;e1=;e2=;e3=;e4=#; output(); flag=1; ai1=ch; input();input1(); return(1); int F() int f;int j; if(ch=() bi1=ch; printf(F-(E)t); e0=F;e1=;e2=;e3=(;e4=E;e5=);e6=#; output(); flag=0; input()
15、;input1(); ch=a+i1; f=E(); if (f=0) return(0); if(ch=) bi1=ch; printf(F-(E)t); flag=0;input();input1(); ch=a+i1; else printf(errorn); j=0; while(aj!=#) printf(%c,aj+); printf( 非法字符 !n); return(0); else if(ch=i) bi1=ch; printf(F-it); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
16、 - - - - - 第 9 页,共 11 页 - - - - - - - - - e0=F;e1=;e2=;e3=i;e4=#; output(); flag=0;input();input1(); ch=a+i1; else printf(errorn); j=0; while(aj!=#) printf(%c,aj+); printf( 非法字符 !n); return(0); return(1); void input() int j=0; for (;j=i1-flag;j+) printf(%c,bj); /*输出分析串 */ printf(ttt); printf(%cttt,c
17、h); /*输出分析字符 */ 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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 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=#; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -
限制150内