您的当前位置:首页正文

编译原理实验二 预测分析法

2023-01-06 来源:意榕旅游网


实验二 预测分析法

一、实验项目名称 预测分析法 二、实验目的

根据某一LL(1)文法编制调试预测分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析法的理解。

三、实验环境

Win8系统,VC++6.0软件,C语言开发工具 四、实验内容

本次实验的LL(1)文法为表达式文法: E→E+T | T T→T*F | F F→i | (E)

编写识别表达式文法的合法句子的预测分析程序,对输入的任意符号串,给出分析过程及分析结果。分析过程要求输出步骤、分析栈、剩余输入串和所用产生式。如果该符号串不是表达式文法的合法句子,要给出尽量详细的错误提示。

五、实验步骤

首先将终结符和非终结符以及预测分析表计算出来,并保存到数组中 然后对输入的字符进行分析,将一个个终结符进行分配 在分配的过程中输出每一步步骤 对错误处,显示步骤数和错误字符 六、源程序清单、测试数据、结果

源程序:

#include #include #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

while(x.top!=x.base) { pop(x,a); cout<void fenxi(sqstack &fen) { string str; int i=0,row=1,j; char ch1,ch2; // ch1=gettop(fen); while(1) { if(gettop(fen)==shu[i]&&gettop(fen)!='#') { cout<if(biao[find1(gettop(fen))][find2(shu[i])]==\"\") { cout<<\"第\"<break; } else if(biao[find1(gettop(fen))][find2(shu[i])]==\"@\") { cout<\"; for(j=0;j\";

5

for(j=0;j=0) { push(fen,str.at(j)); j--; } cout<void main() { cout<<\"这里是预测分析法程序测试!!!\"<>a; shu[i]=a; i++; } cout<<\"对输入串:\"<运行结果截图:

测试一:

测试二:

7

测试三:(错误测试)

七、实验小结和思考

预测分析法相对于RL法简单很多,而且预测分析表已经得到。直接按照书上一步步编程就好。试验中遇到几个问题:1.首次在C语言中使用string引用,不知道如何输出。

2.栈输出时,顺序是倒的。3.实验调试成功后莫名其妙地出现几行空白

这些问题,第一个通过网络了解了string类型的使用得到了解决,第二个问题自己编个函数也行,就是第三个问题,我找了半天没有发现那里有多余的换行输出符,我预测可能是我调试的时候多加了一个(由于我的C语言版本使用debug断点调试会出现错误,我使用的是最原始的调试),不过也无伤大雅。

9

因篇幅问题不能全部显示,请点此查看更多更全内容