实验名称 | LL1分析法 | 专 业 | 计算机科学与技术 | ||
课程名称 | 编译原理 | 指导老师 | 赵智超 | 班 级 | 计算机一班 |
姓 名 | 学 号 | 12103140102 | 评 分 | ||
实验地点 | 1C26217 | 实验日期 | 2014-04-30 | ||
一、实验目的 1.掌握LL(1)分析法的基本原理; 2.掌握LL(1)分析表的构造方法; 3.掌握LL(1)驱动程序的构造方法。 | |||||
二、实验原理 根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程 | |||||
三、实验过程及步骤(程序源代码、算法说明及调试过程) #include edge::edge() {cin>>left>>right; rlen=right.length(); if(NODE.find(left)>NODE.length()) NODE+=left;} string edge::getlf() {return left;} string edge::getrg() { return right; } string edge::getfirst() { return first; } string edge::getfollow() { return follow; } string edge::getselect() { return select; } string edge::getro() { string str; str+=right[0]; return str; } int edge::getrlen() { return right.length();} void edge::newfirst(string w) { int i; for(i=0;i void edge::newfollow(string w) { int i; for(i=0;i void edge::newselect(string w) { int i; for(i=0;i void edge::delfirst() { int i=first.find('@'); first.erase(i,1); } int SUM; string NODE,ENODE; void first(edge ni,edge *n,int x) { int i,j; for(j=0;j { if(NODE.find(n[j].getro()) void follow(edge ni,edge *n,int x) { int i,j,k,s; string str; for(i=0;i if(i { if(NODE.find(ni.getrg()[i+1]) if(n[k].getfirst().find("@") else { str.erase(); str+=ni.getrg()[i+1]; n[j].newfollow(str);} } } } void select(edge &ni,edge *n){ int i,j; if(ENODE.find(ni.getro()) else for(i=0;i if(n[j].getfirst().find('@')>n[j].getfirst().length()) return; } } } void out(string p) { int i; if(p.length()==0) return; cout<<"{"; for(i=0;i for(i=0;i if(x { cout<<"->"< x=n[j].getselect().find('#'); if(k==ENODE.length()-1&&x { cout<<"->"< { char ch,a; int x,i,j,k; b++; cout< | |||||
四、实验结果(含数据记录及分析等) | |||||
五、实验总结(含实验心得体会,收获与不足等) 这次实验让我更加熟悉了LL(1)的工作流程以及LL(1)分析表的构造方法。以前课堂上搞不懂的算法流程通过实验都能得到进一步的了解。 |