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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

消除左递归编译原理实验.docx

1、消除左递归编译原理实验编译原理实验报告实验名称:了 实验时间:2015-05-27院 系: 班 级:12级计算机科学技术 学 号:201104080112_ 姓 名: 1、 实验目的:理解LL(1文法中消除左递归的原理2、 实验原理:1 直接左递归的消除消除产生式中的直接左递归是比较容易的。例如假设非终结符 p的规则为:P Pa / B其中,B是不以P开头的符号串。那么,我们可以把 P的规则改写为如下的非 直接左递归形式: P B PPa P / &这两条规则和原来的规则是等价的,即两种形式从 P推出的符号串是相同的。 设有简单表达式文法GE:E E+T/ TT T*F/ FF ( E) /

2、I经消除直接左递归后得到如下文法:E TEE +TE / &T FTT *FT / &F ( E) / I考虑更一般的情况,假定关于非终结符 P的规则为P Pa 1 / P a 2 / / P a n / B 1 / B 2 / / B m其中,a i (I = 1 , 2,,n)都不为,而每个B j (j = 1 , 2,,m都不以P开头,将上述规则改写为如下形式即可消除 P的直接左递归:P B 1 P / B 2 P / / B m P P a 1P / a 2 P / / a n P / 2 间接左递归的消除直接左递归见诸于表面,利用以上的方法可以很容易将其消除,即把直接左 递归改写成直

3、接右递归。然而文法表面上不存在左递归并不意味着该文法就不存 在左递归了。有些文法虽然表面上不存在左递归,但却隐藏着左递归。例如,设 有文法GS:S Qc/ cC Rb/ bR Sa/ a虽不具有左递归,但S、Q R都是左递归的,因为经过若干次推导有S : Qc : Rbc : SabcQ : Rb : Sab : QcabRr Sa : Qc圧 Rbca就显现出其左递归性了,这就是间接左递归文法。消除间接左递归的方法是,把间接左递归文法改写为直接左递归文法, 然后用消除直接左递归的方法改写文法。+如果一个文法不含有回路,即形如 P的推导,也不含有以为右部的产生式,那么就可以采用下述算法消除文法

4、的所有左递归。消除左递归算法:(1)把文法G的所有非终结符按任一顺序排列,例如,A, A,,A。(2)for (i = 1 ; i=n ; i+ )for (j = 1; j=i 1; j+ ) 把形如AA 丫的产生式改写成 A S 1丫 / S 2 丫 / S k y 其中A S 1 / S 2 / S k是关于的A全部规则; 消除A规则中的直接左递归;(3) 化简由( 2)所得到的文法,即去掉多余的规则。利用此算法可以将上述文法进行改写,来消除左递归。首先,令非终结符的排序为 R、Q S。对于R,不存在直接左递归。把 R代 入到Q中的相关规则中,贝U Q的规则变为Sab/ ab/ b 。代

5、换后的Q不含有直接左递归,将其代入S,S的规则变为S Sabc/ abc/ be/c。此时,S存在直接左递归。在消除了 S的直接左递归后,得到整个文法为:SabcS/ bcS/ cSS abcS/ &QSab/ ab/ bRSa/ a可以看到从文法开始符号 S出发,永远无法达到Q和R,所以关于Q和R的 规则是多余的,将其删除并化简,最后得到文法 GS为:SabcS/ bcS / cSS abcS/ &当然如果对文法非终结符排序的不同, 最后得到的文法在形式上可能不一样, 但它们都是等价的。例如,如果对上述非终结符排序选为 S、Q R,那么最后得 到的文法 GR为: R bcaR/ caR/ a

6、R R bcaR/ 容易证明上述两个文法是等价的。3、 实验内容: 分析见下图图(a)变量说明 屮门 W?5 0I _JX-匚iCs _qg一 图(b)直接左递归分析图弩刊f 二鴛七卜皿 打 亠一TTK “ 汇f戊寸宓匚谱 0 厂一住加 3辭一 化止山血尬亠一L_4制辿必 卩EiiLj二 B &foAj 二q a刃心_战 Y偃辽Q【AJI上匕 $芈竺生竺壬跟#也乂 一旳斷亟f 3 一一 I图(C)间接左递归分析图用 C 语言实现定义四个函数int direct(char PNN); / 直接左递归函数int indirect(char PNN); / 间接左递归函数void directRem

7、ove(char PNN); / 消除直接左递归函数void indirectRemove(char PNN); / 消除间接 左递归函数并在 main 函数中依次调用4、 代码实现#include stdafx.h#include#include #define N 20char PNN; / 规则集char QN; / 规则集 ,存放间接左递归消除后的部分规则/ 用来存放规则的初始/ 实际输入的规则的个char RNN;值int r;数int direct(char PNN); / 直接左递归函数int indirect(char PNN); / 间接 左递归函数void directRe

8、move(char PNN); / 消除直接左递归函数void indirectRemove(char PNN); / 消除间接左递归函数int direct(char PNN) / 定义直接左递归函数int flag=0;for(int i=0;i0)printf( 经 判 断 该 文 法 含 有 直 接 左 递 归!n);return 1; / 属于直接接左递归elsereturn 0; / 不属于直接左递归/ 定义间int indirect(char PNN) 接左递归函数int flag=0;for(int i=0;ir;i+)for(int k=1;k0)break;if(flag0

9、)printf( 经 判 断 该 文 法 含 有 间 接 左 递归!n);return 2; / 属于间接左递归elsereturn 0;/ 不属于间接左递归/ 定义消void directRemove(char PNN) 除直接左递归的函数int j=4;for(int i=0;ir;i+)if(Pi3=Pi0)Pi3=Pi2;Pi2=Pi1;Pi1=;while(Pij!=0) j+;Pij=Pi0;Pij+1=;条规则/ 包含空的一for(int k=0;k4;k+)Prk=Pik;Prk=*;elsej=3;while(Pij!=0)j+;Pij=Pi0;Pij+1=;printf(n

10、 消除 直接左 递 归后的文 法 为:n);printf(n);printf(* 代表 e )n);printf(n);for(int t=0;tr+1;t+)printf(%sn,Pt);void indirectRemove(char PNN) / 定义消除间接左递归的函数int flag,flag1=0,copy=r;Qe=Pe0; / 统计规则中不同的左部for(int i=1;ir;i+)flag=0;for(int k=0;k=e;k+)if(Pi0!=Qk)flag+;if(flag=(e+1)e+;Qe=Pi0;for(int j=0;je;j+)int number=0;/

11、统计/ 如for(int z=0;z1) copy+;果有相同左部则规则总数加一for(i=0;ir;i+)for(int k=1;kr;k+)if(Pi0=Pi+k3)&(flag1=0)for(int y=0;Pi+ky!=0;y+)Rgy=Pi+ky; / 把 原值保留flag1=1;int m=3;while(Pim!=0) / 统计替 换字符的个数为 m-1-2m+;int t=m-3;int n=4;while(Pi+kn!=0) / 统 计 被替换规则中非终结符的个数为 n-4Pi+ks+t-1=Pi+ks;for(int u=3;u=4;s-)Pcopy-1s+t-1=Pcop

12、y-1s;for(int u=3;u3+t;u+)Pcopy-1u=Piu;break;flag1=0;printf( 首次消除间接左递归后的直接左递 归文法为 :n);for(int t=0;tcopy;t+)printf(%sn,Pt);printf(n);for(i=0;icopy;i+)if(Pi0=Qe)if(Pi3=Pi0)Pi3=Pi2;Pi2=Pi1;Pi1=;while(Pij!=0)j+;Pij=Pi0;Pij+1=;条规则/ 包含空的for(int k=0;k4;k+)Pcopyk=Pik;Pcopyk=*;elsej=3;while(Pij!=0)j+;Pij=Pi0;Pij+1=;printf( 再次消除直接左递归后的文法 为:n);printf(n);printf(* 代表 e )n);printf(n);for(t=0;t连接,规则间用空格隔开 );printf(n);for(int k=0;kr;k+)scanf(%s,Pk);printf(n);printf( 即输入的文法规则为 :n);for(k=0;kSa S-b即输入的文法规则为二-SaS胃判斷该文法含有亶按左递归?”除直接左递归后的文祛为:”牡*E-bS*SJ-*Press any key to continue消除文法间接左递归实例1如下:消除文法间接左递归实例2如下:

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

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