实验7-8预测分析表方法.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验7-8预测分析表方法

PAGE  PAGE 4 实验7-8 预测分析表方法 一、实验目的 理解预测分析表方法的实现原理。 二、实验内容: 编写一通用的预测法分析程序,要求有一定的错误处理能力,出错后能够使程序继续运行下去,直到分析过程结束。可通过不同的文法(通过数据表现)进行测试。 二、实验内容提示 1.算法数据构造: 构造终结符数组:char Vt[10][5]={“id”,”+”……}; 构造非终结符数组:char Vn[10]={ }; 构造follow集数组:char *follow[10][10]={ } (可将follow集与预测分析表合并存放) 数据构造示例(使用的预测分析表构造方法1): /*data1.h简单算术表达式数据*/ char VN[10][5]={E,E,T,T,F}; //非终结符表 int length_vn=5; //非终结符的个数 char VT[15][5]={id,+,*,(,),#}; //终结符表 int length_vt=6; //终结符的个数 char Fa[15][10]={TE,+TE,,FT,*FT,,(E),id}; //产生式表:0:E-TE 1:E-+TE 2:E-空 // 3:T-FT 4:T-*FT 5:T-空 6:F-(E) 7:F-id int analysis_table[10][11]={0,-1,-1,0,-2,-2,0,0,0,0,0, -1,1,-1,-1,2,2,0,0,0,0,0, 3,-2,-1,3,-2,-2,0,0,0,0,0, -1,5, 4,-1,5, 5,0,0,0,0,0, 7,-2,-2,6,-2,-2,0,0,0,0,0}; //预测分析表,-1表示出错,-2表示该行终结符的follow集合,用于错误处理,正数表示产生式在数组Fa中的编号,0表示多余的列。 预测分析表的构造方法1 给文法的正规式编号:存放在字符数组中,从0开始编号,正规式的编号即为该正规式在数组中对应的下标。如上述Fa数组表示存储产生式。 构造正规式数组:char P[10][10]={“E-TE’”,”E’-+TE’”,……..}; (正规式可只存储右半部分,如E-TE’可存储为TE’ ,正规式中的符号可替换,如可将E’改为M ) 构造预测分析表:int analyze_table[10][10]={ } //数组元素值存放正规式的编号,-1表示出错 (2)预测分析表的构造方法2 可使用三维数组 Char analyze_table[10][10][10]={ } 或 Char *analyze_table[10][10]={ } 2.针对预测分析表构造方法1的查预测分析表的方法提示: 查非终结符表得到非终结符的序号no1 查终结符表得到终结符的序号no2 根据no1和no2查预测分析表得到对应正规式的序号no3=analyze_table[no1][no2] ,如果no3=-1 表示出错。 根据no3查找对应的正规式Fa[no3] 对正规式进行处理 3.错误处理机制 紧急方式的错误恢复方法(抛弃某些符号,继续向下分析) (1)栈顶为非终结符A,串中当前单词属于FOLLOW(A),则从栈中弹出A(此时可认为输入串中缺少A表示的结构),继续分析。 错误编号为1 (2)栈顶为非终结符A,串中当前单词不属于FOLLOW(A),则可使串指针下移一个位置(认为输入串中当前单词多余),继续分析。错误编号为2 (3)栈顶为终结符,且不等于串中当前单词,则从栈中弹出此终结符(认为输入串中缺少当前单词)或者将串指针下移一个位置(认为串中当前单词多余)。在程序中可选择上述两种 观点中的一种进行处理。错误编号3 因此error()函数的编写方式可按如下方式处理 Error(int errornum) { If(errornum==1)……………… Else if(errornum==2)…………… Else ……………….. //或者可用choose case语句处理 } 4.增加了错误处理的预测分析程序预测分析程序的算法: 将“#”和文法开始符依次压入栈中; 把第一个输入符号读入a; do{ 把栈顶符号弹出并放入x中; if(x∈VT) { if(x==a) 将下一输入符号读入a; else error(3); } else if(M[x,a]=“x→y1y2…yk”) { 按逆序依次把yk、yk?1、…、y1压入栈中; 输出

您可能关注的文档

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档