ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:444.99KB ,
资源ID:28027197      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28027197.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(递归下降语法分析程序设计.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

递归下降语法分析程序设计.docx

1、递归下降语法分析程序设计编译方法 实 验 报 告实验名称:简单的语法分析程序设计实验要求1. 功能:对简单的赋值语句进行语法分析随机输入赋值语句,输出所输入的赋值语句与相应的四元式2. 采用递归下降分析程序完成(自上而下的分析)3. 确定各个子程序的功能并画出流程图4. 文法如下:5. 编码、调试通过采用标准输入输出方式。输入输出的样例如下:【样例输入】x:=a+b*c/d-(e+f)【样例输出】(说明,语句和四元式之间用5个空格隔开)T1:=b*c (*,b,c,T1)T2:=T1/d (/,T1,d,T2)T3:=a+T2 (+,a,T2,T3)T4:=e+f (+,e,f,T4)T5:=

2、T3-T4 (-,T3,T4,T5)x:=T5 (:=,T5,-,x)【样例说明】程序除能够正确输出四元式外,当输入的表达式错误时,还应能检测出语法错误,给出相应错误提示。6. 设计3-5个赋值语句测试实例,检验程序能否输出正确的四元式;当输入错误的句子时,检验程序能够给出语法错误的相应提示信息。7. 报告内容包括:递归程序的调用过程,各子程序的流程图和总控流程图,详细设计,3-5个测试用例的程序运行截图及相关说明,有详细注释的程序代码清单等。1.语法分析递归下降分析算法1.1背景知识无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。无

3、回溯:对于任一非终结符号U的产生式右部x1|x2|xn,其对应的字的首终结符号两两不相交。如果一个文法不含回路,也不含以为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以为右部的产生式)。文法的左递归消除算法: 1、将文法G的所有非终结符排序为U1 ,U2 , ,Un; 2、For(i=1;i+;in) for j1 to i-1 把产生式UiUj替换成Ui1| 2|m; 其中:Uj 1| 2 | |m 消除Ui产生式中的直接左递归; 3.化简改写之后的文法,删除多余产生式。文法的直接左递归消除公式: 直接左递归形式:UUx|y; 其中:x,y(V

4、NVT)* ,y不以U打头。 直接左递归的消除: UyU UxU| 直接左递归的一般形式:UUx1|Ux2|Uxm|y1|y2|yn; 其中:xi ,yi都不以U打头。 一般形式直接左递归的消除: Uy1U| y2U | ynUUx1U| x2U| | xmU| 回溯的消除的前提是文法不得含有左递归,可提左因子来消除回溯。1.2消除左递归根据实验中给出的文法,进行消除左递归及回溯,得到下列的式子A - V:=EE - TEE- +TE|-TE|nullT - FTT- *FT|/FT|nullF - V|(E)V - a|b|c|d|e.|z2.详细设计及流程图 根据消除左递归后的文法,可以编

5、写相应的函数。2.1 函数void V( ) / V - a|b|c|d|e.|z void V() / V - a|b|c|d|e.|z函数设计主要用来识别小写字母的,如果是小写字母的话,放入字符表,不是的话,输出语法错误。函数比较简单,代码如下: if(islower(ssym) Tablelist_n0 = ssym; /把读取的小写字母存入符号表,便于分析是生成中间代码 Tablelist_n1 = 0; list_n+; sym+; else printf(Operand Errors!n); /运算对象错误 SIGN=1; exit(0); 2.2 函数void A( ) / A

6、- V:=E void A() / A - V:=E 函数主要用来实现赋值的操作,流程图如图1所示。 图1 A( ) 函数流程图2.3 函数void E() /E - TE函数E()里面主要递归调用函数T( )和E( )。当没有出现语法错误时就可正常的运行。函数比较简单,代码如下: if(SIGN=0) T(); E1(); 2.4函数void T( ) / T - FT函数T( )里面主要递归调用函数F ( )和T( )。当没有出现语法错误时就可正常的运行。函数比较简单,代码如下: if(SIGN=0) F(); T1(); 2.5函数void E1( ) /E- +TE|-TE|null

7、函数void E1() /E- +TE|-TE|null,主要用来实现加减法的语义分析。流程图如图2所示。 图2 E1 ( ) 函数流程图2.6函数void T1() / T- *FT|/FT|null函数void T1() / T- *FT|/FT|null,主要用来实现乘除法的语义分析。流程图如图3所示。 图3 T1 ( ) 函数流程图3.测试用例及截图3.1测试用例1及截图 用例1为实验要求上的的用例。测试结果图4所示。 图4 测试用例1及结果截图3.2测试用例2及截图 用例2为出现大写字母,出现报错。测试结果图5所示。 图5 测试用例2及结果截图3.3测试用例3及截图 用例3为随意编写

8、用例。测试结果图6所示。 图6 测试用例3及结果截图代码清单#include#include#include#include void A(); / A - V:=Evoid E(); / E - TEvoid T(); / T - FTvoid E1(); / E- +TE|-TE|nullvoid T1(); / T- *FT|/FT|nullvoid F(); / F - V|(E)void V(); / V - a|b|c|d|e.|zchar s50,n=1; /s50用于存放输入的赋值表达式char Table503; /产生中间代码所需的符号表int SIGN,sym; /sym

9、为s50中当前读入符号的下标int list_n=0; /符号表的下标/*消除左递归及回溯A - V:=EE - TEE- +TE|-TE|nullT - FTT- *FT|/FT|nullF - V|(E)V - a|b|c|d|e.|z*/int main() SIGN = 0; /SIGN用于指示赋值表达式是否出现错误 sym=0; scanf(%s,&s); if( s0 = 0) /没有输入的情况直接退出 return 0; A(); if(ssym!=0&SIGN=0) printf(ERROR!n); exit(0); return 0;void A() / A - V:=E V

10、(); if(ssym=:&ssym+1=) /判断赋值号是否有拼写错误 sym+=2; E(); printf(%s:=%s,Tablelist_n-2,Tablelist_n-1); printf( (:=,%s,-,%s)n,Tablelist_n-1,Tablelist_n-2); else printf(The assignment Symbol spelling mistakes!n); /赋值号拼写错误 SIGN=1; exit(0); void V() / V - a|b|c|d|e.|z if(islower(ssym) Tablelist_n0 = ssym; /把读取的小

11、写字母存入符号表,便于分析是生成中间代码 Tablelist_n1 = 0; list_n+; sym+; else printf(Operand Errors!n); /运算对象错误 SIGN=1; exit(0); void E() /E - TE if(SIGN=0) T(); E1(); void T() / T - FT if(SIGN=0) F(); T1(); void E1() /E- +TE|-TE|null int p; if(SIGN=0) if(ssym = +|ssym=-) p=sym; /用p记录出现+或-时sym的值 sym+; T(); char ch3; c

12、h0 = T; ch1 = n; ch2 = 0; if(sp = +) printf(%s:=%s+%s,ch,Tablelist_n-2,Tablelist_n-1); /输出三地址代码 printf( (+,%s,%s,%s)n, Tablelist_n-2,Tablelist_n-1,ch); /输出四元式 else printf(%s:=%s-%s,ch,Tablelist_n-2,Tablelist_n-1); /输出三地址代码 printf( (-,%s,%s,%s)n, Tablelist_n-2,Tablelist_n-1,ch); /输出四元式 strcpy(Tableli

13、st_n-2,ch); /将当前结果归结式放在符号表中 list_n-; n+; E1(); void T1() / T- *FT|/FT|null int p; if(SIGN=0) if(ssym = *|ssym=/) p=sym; sym+; F(); char ch3; ch0 = T; ch1 = n; ch2 = 0; if(sp = *) printf(%s:=%s*%s,ch,Tablelist_n-2,Tablelist_n-1); /输出三地址代码 printf( (*,%s,%s,%s)n, Tablelist_n-2,Tablelist_n-1,ch);/输出四元式

14、else printf(%s:=%s/%s,ch,Tablelist_n-2,Tablelist_n-1); /输出三地址代码 printf( (/,%s,%s,%s)n, Tablelist_n-2,Tablelist_n-1,ch);/输出四元式 strcpy(Tablelist_n-2,ch); /将当前结果归结式放在符号表中 list_n-; n+; T1(); void F() /F - V|(E) if(SIGN=0) if(ssym=() sym+; E(); if(ssym=) sym+; else printf(ERROR!n); SIGN=1; exit(0); else if(islower(ssym) /判断ssym是否是小写字母 V(); else printf(ERROR!n); SIGN=1; exit(0);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1