实验二 预测分析法
一、实验项目名称 预测分析法 二、实验目的
根据某一LL(1)文法编制调试预测分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析法的理解。
三、实验环境
Win8系统,VC++6.0软件,C语言开发工具 四、实验内容
本次实验的LL(1)文法为表达式文法: E→E+T | T T→T*F | F F→i | (E)
编写识别表达式文法的合法句子的预测分析程序,对输入的任意符号串,给出分析过程及分析结果。分析过程要求输出步骤、分析栈、剩余输入串和所用产生式。如果该符号串不是表达式文法的合法句子,要给出尽量详细的错误提示。
五、实验步骤
首先将终结符和非终结符以及预测分析表计算出来,并保存到数组中 然后对输入的字符进行分析,将一个个终结符进行分配 在分配的过程中输出每一步步骤 对错误处,显示步骤数和错误字符 六、源程序清单、测试数据、结果
源程序:
#include using namespace std; char zhong[6]={'i','+','*','(',')','#'}; char fzhong[5]={'E','R','T','Y','F'}; char shu[20]; 1 //R代表E' Y代表T' string biao[5][6]={ {\"TR\ {\"\ //@代表空 {\"FY\ {\"\ {\"i\}; #define N 20; typedef char type; typedef struct { type *base; type *top; int stacksize; }sqstack; void initstack(sqstack &s) { s.base=new type[2]; if(!s.base) cout<<\"错误\"; s.top=s.base; s.stacksize=N; } void push(sqstack &s,type e) { if(s.top-s.base==s.stacksize) cout<<\"栈满\"; *s.top++=e; } void pop(sqstack &s,type &e) { if(s.top==s.base) cout<<\"栈空\"; e=*--s.top; } type gettop(sqstack s) { if(s.top==s.base) cout<<\"栈空\"; return *(s.top-1); } int find1(char x) { for(int i=0;i<5;i++) { if(x==fzhong[i]) { break; } } return i; } int find2(char x) { for(int i=0;i<6;i++) { if(x==zhong[i]) { break; } } return i; } void showstack(sqstack fen) { char a; sqstack x; initstack(x); while(fen.top!=fen.base) { pop(fen,a); push(x,a); } 3