最新版实验4-5--预测分析表方法.docxVIP

  • 25
  • 0
  • 约7.86千字
  • 约 11页
  • 2021-02-21 发布于天津
  • 举报
精品资料 精品资料 可编辑修改 可编辑修改 一、实验名称 预测分析表方法的实现 二、实验目的 理解预测分析表方法的实现原理。 三、实验内容 编写一通用的预测法分析程序, 要求有一定的错误处理能力, 出错后能够使程序继续运 行下去,直到分析过程结束。可通过不同的文法(通过数据表现)进行测试。 四、实验内容提示 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 }; // 产生式表 :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 集合,用于错误处理 ( 1 ) 预测分析表的构造方法 1 给文法的正规式编号:存放在字符数组中,从 0 开始编号,正规式的编号即为该正规式 在数组中对应的下标。 构造正规式数组: 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][10]={ } 2 .针对预测分析表构造方法 1 的查找方法提示: 1) 查非终结符表得到非终结符的序 号 no1 2) 查终结符表得到终结符的序号 no2 3) 根 据 no1 和 no2 查 正规式表得到 对应正规式的序号 no3=analyze_table[no1][no2] ,如果 no3=-1 表示出错。 4) 根据 no3 查找对应的正规式 P[no3] 5) 对正规式进行处理 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 t y1y2 …yk ”) { 按逆序依次把 yk 、 yk-1 、…、 y1 压入栈中 ; 输出“ xt y

文档评论(0)

1亿VIP精品文档

相关文档