欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

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

    • 资源ID:24092363       资源大小:178.50KB        全文页数:9页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    【精品文档】如有侵权,请联系网站删除,仅供学习与交流递归下降语法分析程序设计.精品文档.编译方法 实 验 报 告实验名称:简单的语法分析程序设计实验要求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:=T3-T4     (-,T3,T4,T5)x:=T5     (:=,T5,-,x)  【样例说明】程序除能够正确输出四元式外,当输入的表达式错误时,还应能检测出语法错误,给出相应错误提示。6. 设计3-5个赋值语句测试实例,检验程序能否输出正确的四元式;当输入错误的句子时,检验程序能够给出语法错误的相应提示信息。7. 报告内容包括:递归程序的调用过程,各子程序的流程图和总控流程图,详细设计,3-5个测试用例的程序运行截图及相关说明,有详细注释的程序代码清单等。目录1.语法分析递归下降分析算法51.1背景知识51.2消除左递归62.详细设计及流程图62.1 函数void V( ) / V -> a|b|c|d|e.|z62.2 函数void A( ) / A -> V:=E72.3 函数void E() /E -> TE'72.4函数void T( ) / T -> FT'82.5函数void E1( ) /E'-> +TE'|-TE'|null82.6函数void T1() / T'-> *FT'|/FT'|null93.测试用例及截图93.1测试用例1及截图93.2测试用例2及截图103.3测试用例3及截图11代码清单111.语法分析递归下降分析算法1.1背景知识无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。无回溯:对于任一非终结符号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(VNVT)* ,y不以U打头。 直接左递归的消除: UyU UxU| 直接左递归的一般形式:UUx1|Ux2|Uxm|y1|y2|yn; 其中:xi ,yi都不以U打头。 一般形式直接左递归的消除: Uy1U| y2U | ynUUx1U| x2U| | xmU| 回溯的消除的前提是文法不得含有左递归,可提左因子来消除回溯。1.2消除左递归根据实验中给出的文法,进行消除左递归及回溯,得到下列的式子A -> V:=EE -> TE'E'-> +TE'|-TE'|nullT -> FT'T'-> *FT'|/FT'|nullF -> V|(E)V -> a|b|c|d|e.|z2.详细设计及流程图根据消除左递归后的文法,可以编写相应的函数。2.1 函数void V( ) / V -> a|b|c|d|e.|zvoid V() / V -> a|b|c|d|e.|z函数设计主要用来识别小写字母的,如果是小写字母的话,放入字符表,不是的话,输出语法错误。函数比较简单,代码如下:if(islower(ssym)Tablelist_n0 = ssym; /把读取的小写字母存入符号表,便于分析是生成中间代码Tablelist_n1 = '0'list_n+;sym+;elseprintf("Operand Errors!n"); /运算对象错误SIGN=1;exit(0);2.2 函数void A( ) / A -> V:=Evoid 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函数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为随意编写用例。测试结果图6所示。 图6 测试用例3及结果截图代码清单#include<stdio.h>#include<stdlib.h>#include<string.h>#include <ctype.h>void A(); / A -> V:=Evoid E(); / E -> TE'void T(); / T -> FT'void 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为s50中当前读入符号的下标int list_n=0; /符号表的下标/*消除左递归及回溯A -> V:=EE -> TE'E'-> +TE'|-TE'|nullT -> FT'T'-> *FT'|/FT'|nullF -> V|(E)V -> a|b|c|d|e.|zint 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:=EV();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);elseprintf("The assignment Symbol spelling mistakes!n"); /赋值号拼写错误SIGN=1;exit(0);void V() / V -> a|b|c|d|e.|zif(islower(ssym)Tablelist_n0 = ssym; /把读取的小写字母存入符号表,便于分析是生成中间代码Tablelist_n1 = '0'list_n+;sym+;elseprintf("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'|nullint p;if(SIGN=0)if(ssym = '+'|ssym='-')p=sym; /用p记录出现'+'或'-'时sym的值sym+;T();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); /输出四元式elseprintf("%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+;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);/输出四元式elseprintf("%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();elseprintf("ERROR!n"); SIGN=1;exit(0);

    注意事项

    本文(递归下降语法分析程序设计.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开