文档介绍::..实验4-5 预测分析表方法一、 实验目的理解预测分析表方法的实现原理。二、 实验内养:编写一通用的预测法分析程序,要求有一定的错误处理能力,出错后能够使程序继续运行下去,直到分析过程结束。可通过不同的文法(通过数裾表现)进行测试。二、:构造终结符数组:charVt[10][5]={“id”,”+”};构造非终错符数纟11:charVn[10]={ };构造follow集数组:char*follow[10][10]={ }(可将follow集与预测分析表合并存放)数据构造示例(使用的预测分析表构造方法1):/**/charVN[1O][5]={〃E〃,〃E’",〃T〃,〃T’〃,〃I:〃};//非终结符表int length_vn=5;//非终結符的个数charVT[15][5]={"id: ;//终结符表int length^vt=6;//终结符的个数charFa[15][10]={〃TE’",、+TE’〃,〃〃,〃FT’〃,"*FT’ "(E)〃,"id"};//产生式表:E->TE’ l:E’->+TE’2:E’->空//3:T->ET, 4:T,->*I'T, 5:T’->空6:E->(E) 7:E->idint analysis_table[10][ll]={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开始编号,正规式的编号即为该正规式在数组屮对应的下标。构造正规式数组:charP[10][10]={“E-〉TE’”,”E’-〉+TE”’, };(正规式可只存储右半部分,如E-〉TE’可存储为TE’,正规式中的符号可替换,如可将E’改为M)构造预测分析表:intanalyze_table[10][10]={ } //数组元素值存放正规式的编号,-1表示出错(2)预测分析表的构造方法2可使用三维数组Charanalyze_table[10][10][10]={ }或Char*analyze_table[10][10][10]={ }:(1)查非终结符表得到非终结符的序号iwl(2)查终结符表得到终结符的序号no2(3)根据nol和no2查正规式表得到对应正规式的序号no3=analyze_table[nol][no2],如果no3=-l表示出错。(4)根掘no3查找对应的正规式;P[no3](5)(抛弃某些符号,继续向下分析)(1)栈顶为非终结符A,串屮当前单词属于FOLLOW(A),则从栈屮弹出A(此时可认为输入串中缺少A表示的结构),继续分析。 错误编号为1(2)栈顶为非终结符A,串中当前单词不属于FOLLOW(A),则可使串指针下移一个位置(认为输入串中当前单词多余),继续分析。 错误编号为2(3)栈顶为终结符,且不等于串中当前单同,则从栈中弹出此终结符(认为输入串中缺少当前单词)或者将串指针下移一个位置(认为串屮当前单词多余)。在程序屮可选择上述两种观点屮的一种进行处理。 错误编号3因此error()函数的编写方式可按如下方式处理Error(interrornum){If(errornum==l) Elseif(crromum=2) Else //或者可用choosecase语句处理}:将“#”和文法开始符依次压入栈中;把第一个输入符号读入a;do{把栈顶符号弹出并放入x屮;if(xEVT){if(x==a)将下一输入符号读入a;elseerror(3);}elseif(M[x,a]=“x-*yly2...yk”){按逆序依次把yk、yk-1、…、yl压入栈巾;输出“x-*yly2...yk”;}elseifaefollow(x)crror(l);elseerror(2);}while(x!=T),编写程序。测试数裾:->TE,F?->+TF/|-TF/|eT->FT,T’->*FT’ 1/FT’|%FT’eF-*(E)Iid|num给定一符合该文法的句子,如id+id*id#,运行预测分析程序,给出分析过程