消除文法的左递归实验.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理实验报告 实验名称 消除文法的左递归 实验时间 院系 班级 学号 姓名 叮叮小文库 叮叮小文库 PAGE PAGE # 试验目的 ?掌握和理解消除左递归(包括直接左递归和间接左递归)在构建 LL(1)文法的作用和目的 ?掌握消除左递归(包括直接左递归和间接左递归)的方法和步骤。 ?写出对于输入任意的上下文无关文法可以输出消除了左递归的等 价文法。 实验原理 ?直接左递归的消除 消除产生式中的直接左递归是比较容易的。例如假设非终结符 P的规则为 P— Pa/ B 其中,B是不以P开头的符号串。那么,我们可以把 P的规则改写为 如下的非直接左递归形式: P—尸’ P— P £ 考虑更一般的情况,假定关于非终结符 P的规则为 P— P a / P o2 / …/ P an / [31 / [32 / …/ pm 其中,a (I = 1, 2,…,n)都不为£而每个pj (j = 1, 2,…,m) 都不以P开头,将上述规则改写为如下形式即可消除 P的直接左递归: P— pl P/ 32 P/…/pm P P — 01P / a P/…/ an P/£ ?间接左递归的消除 直接左递归见诸于表面,利用以上的方法可以很容易将其消除, 即把直接左递归改写成直接右递归。然而文法表面上不存在左递归并 不意味着该文法就不存在左递归了。有些文法虽然表面上不存在左递 归,但却隐藏着左递归。 消除间接左递归的方法是,把间接左递归文法改写为直接左递归文 法,然后用消除直接左递归的方法改写文法。 ?消除左递归算法: 把文法G的所有非终结符按任一顺序排列,例如,A1 , A2,…, An。 for (i = 1; iv=n; i++) for (j = 1; j=i - 1; j++) { 把形如Ai f Aj 丫的产生式改写成 Ai f 81 y/ 2 丫/…/ ck 丫 其中Aj f 81 / 32 /…/8是关于的Aj全部规则; 消除Ai规则中的直接左递归; } 化简由(2)所得到的文法,即去掉多余的规则。 3..实验内容 ?利用消除左递归算法上机了实现对于输入任意的上下文无关文法 可以输出消除了左递归的等价文法。 4.实验心得 ?通过本次试验更加清晰的理解了消除左递归在构建 LL(1)文法的重 要作用,以及如何的消除文法中的左递归。在本次试验中原本想用 Pf Pal |Pa2 |…|Pa |B1 |超|…|师这种相同左部的产生式右部用或连 所以只有分开书接起来形式来消除左递归但是在实现上不是很容易, 写利用消除左递归的算法来实现. 所以只有分开书 5.实验代码与结果 源代码(C) #in cludestdio.h #in cludestri ng.h struct Node//定义产生式结构 { char left[20];〃产生式左部 char right[50];〃产生式右部 int flags; }P[30]; int count=O;〃产生式数量 void creat() { int i; printf(输入产生式数量:”); scan f(%d,count); for(i=0;ico un t;i++) { flushall(); printf(输入第%d条产生式的左部:,i+1); gets(P[i].left); flushall(); prin tf(\n ”); printf(输入第%d条产生式的右部:,i+1); gets(P[i].right); flushall(); prin tf(\n ”); P[i].flags=0; } printf( *******************************************************\n); printf(你输入的产生式是:\n); for(i=0;ico un t;i++) { prin tf(%s-%s\n,P[i].left,P[i].right); } } void Replace(char *ch1,char ch2[20]) { int i; char ch3[20]; strcpy(ch3,ch2); for(i=0;i(i nt)strle n( ch3);i++) ch3[i]=ch3[i+1]; strcat(ch1,ch3); } void Sort(char *ch1,char ch2[2]) { int i; for(i=0;i(i nt)strle n(ch1);i++) ch1[i]=ch1[i+1]; strcat(ch1,ch2); } void Analysis()//消除间接左递归 { int i,j,flags=0; char ch[50]; int num=co unt; for(

文档评论(0)

梦幻飞迷0411 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档