2022年递归下降分析实验报告 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年递归下降分析实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年递归下降分析实验报告 .pdf(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 实习二递归下降分析一、实验目的:根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。二、实验预习提示1、递归下降分析法的功能词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。2、递归下降分析法的前提改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法,3、递归下降分析法实验设计思想及算法为 G的每个非终结符号U构造一个递归过程 , 不妨命名为 U。U的产生式的右边指出这个过程的代码结构:(1) 若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。(2) 若是非终结符号,则
2、调用与此非终结符对应的过程。当A 的右部有多个产生式时 ,可用选择结构实现。具体为:(1)对于每个非终结符号U-u1|u2|,|un处理的方法如下:U( ) ch=当前符号 ; if(ch可能是 u1 字的开头 ) 处理 u1 的程序部分 ; else if(ch可能是 u2 字的开头 ) 处理 u2 的程序部分 ; ,else error() (2)对于每个右部 u1-x1x2,xn的处理架构如下:处理 x1的程序;处理 x2的程序;,处理 xn的程序;(3)如果右部为空,则不处理。(4)对于右部中的每个符号xi 如果 xi 为终结符号:if(xi= = 当前的符号 ) NextChar()
3、; /% NextChar为前进一个字符函数。 %/ return; else 出错处理名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 22 页 - - - - - - - - - 2 如果 xi 为非终结符号,直接调用相应的过程xi() 三、实验要求程序输入 / 输出示例:对下列文法,用递归下降分析法对任意输入的符号串进行分析:(1)E-TG (2)G-+TG|TG|(3)T-FS (4)S-*FS|/FS| (5)F-(E)|i 输出的格式如下:(1) 输入一以 #结
4、束的符号串 ( 包括+*/ ()i#) :在此位置输入符号串例如:i+i*i# (2) 输出结果: i+i*i#为合法符号串备注:输入一符号串如i+i*#,要求输出为“非法的符号串” 。注意: 1. 表达式中允许使用运算符(+-*/ ) 、分割符(括号)、字符 I ,结束符 #;2. 如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);3. 学有余力的同学, 可以详细的输出推导的过程, 即详细列出每一步使用的产生式。四、 实验内容4.1 功能描述这个程序是一个递归下降分析程序,能够判定输入的一个字符串是否属于给定的文法。如果不是,则会给出一定的出错信息,并且列出每一步使用的产生式。4
5、.2 全局变量及其定义char a50;/-存储输入的字符串char ch; /-暂时存储输入的字符char d200;/-记录当前堆栈中的产生式int n1;/-输入字符串的长度char token;/-当前待分析字符4.3 模块设计int E();/-E过程,对应产生式E-TG int T();/-T过程,对应产生式T-FS int G();/-G过程,对应产生式G-+TG|-TG|int S();/-S过程,对应产生式S-*FS|/FS| int F();/-F过程,对应产生式F-(E)|i void output();/-输出已分析字符串和当前字符void input1();/-输出剩
6、余字符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 22 页 - - - - - - - - - 3 4.4 程序流程图图 1 主函数 main()流程图图 2 E 函数()流程图图 3 T 函数()流程图结束输出分析信息进行递归下降分析得到第一个字符将开始符放入堆栈获取字符串长度开始输入要处理的字符串Y N 开始输出分析栈内容和当前动作将分析栈的E 换为 TG TG return 1 return 0 结束N 结束Y return 1 return 0 FS 将分析栈
7、的T 换为 FS 开始输出分析栈内容和当前动作名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 22 页 - - - - - - - - - 4 图 4 G 函数()流程图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 22 页 - - - - - - - - - 5 图 5 F 函数()流程图图 6 S 函数()流程图五、核心代码清单:函数功能描述:
8、根据文法E-TG,先从主函数开始调入第一个非终结符函数执行,并且显示调用产生式,根据程序的状态,调用非终结符函数T()或 G () ,进行递归向下分析。int E() int f,t; printf(E-TGt); e0=E; e1=; e2=; e3=T; e4=G; e5=#; output(); flag=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 22 页 - - - - - - - - - 6 input(); input1(); f=T(); if
9、(f=0) return(0); t=G(); if (t=0) return(0); else return(1); 函数功能描述: 根据文法 G-+TG| TG|,如果当前字符变量ch 为“ +” ,则显示调用产生式,首先判断是算式递归向下分析是否结束,若没有结束则继续依次嵌套调用非终结符函数T()和 G() ;如果当前字符变量ch 为“- ” ,则显示调用产生式,从文件文档中读取下一个字符,让字符指针变量指向下一个字符,继续依次嵌套调用非终结符函数T()和G () ;如果当前字符变量ch 既不为“ +” 也不为“ - ” ,非终结符 G 指向为空,函数只用于显示指向为空,找不到可以和文件
10、中字符匹配的非终结符。int T() int f,t; printf(T-FSt); 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); 函数功能描述: 根据文法 T-FS,先显示算式匹配所用的显示调用的产生式,然后依次嵌套调用非终结符函数F()和 S() ,进行递归向下分析。int G() int f; if(ch=+) bi1=ch; 名师资料总结 - - -精品
11、资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 22 页 - - - - - - - - - 7 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); G(); return(1); if(ch=-) bi1=ch; printf(G-+TGt); e0=G; e1=; e2=; e3=+; e4=
12、T; e5=G; e6=#; output(); flag=0; input(); input1(); ch=a+i1; f=T(); if (f=0) return(0); G(); return(1); printf(G-t); e0=G; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 22 页 - - - - - - - - - 8 e1=; e2=; e3=; e4=#; output(); flag=1; input(); input1(); return(1
13、); 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; input(); input1(); ch=a+i1; f=F(); if (f=0) return(0); t=S(); if (t=0) return(0); else return(1); if(ch=/) bi1=ch; printf(S-*FSt); e0=S; e1=; e2=; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
14、 - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 22 页 - - - - - - - - - 9 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); printf(S-t); e0=S; e1=; e2=; e3=; e4=#; output(); flag=1; ai1=ch; input(); input1(); return
15、(1); printf(S-t); e0=S; e1=; e2=; e3=; e4=#; output(); flag=1; ai1=ch; input(); input1(); return(1); 函数功能描述:根据文法S-*FS|/FS| ,如果当前字符变量ch 为“ *” ,则显示调用产生式,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 22 页 - - - - - - - - - 10 从文件文档中读取下一个字符,让字符指针变量指向下一个字符,依次嵌套调用非终
16、结符函数F ()和递归调用自身S () ;如果当前字符变量ch 为“/ ” ,则显示调用产生式,从文件文档中读取下一个字符, 让字符指针变量指向下一个字符,依次嵌套调用非终结符函数F ()和递归调用自身S () ;如果当前字符变量ch 既不为“ * ” 也不为“ / ” ,G 中找不到可以匹配的算式则非终结符G 指向为空。int F() int f; if(ch=() bi1=ch; printf(F-(E)t); e0=F; e1=; e2=; e3=(; e4=E; e5=); e6=#; output(); flag=0; input(); input1(); ch=a+i1; f=E(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年递归下降分析实验报告 2022 递归 下降 分析 实验 报告
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内