最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

实验原理LL1分析法

来源:动视网 责编:小OO 时间:2025-10-01 02:07:00
文档

实验原理LL1分析法

实验报告实验名称LL1分析法专业计算机科学与技术课程名称编译原理指导老师赵智超班级计算机一班姓名学号12103140102评分实验地点1C26217实验日期2014-04-30一、实验目的1.掌握LL(1)分析法的基本原理;2.掌握LL(1)分析表的构造方法;3.掌握LL(1)驱动程序的构造方法。二、实验原理根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序分析法的功能是利用LL(1)控制程序根据显示栈
推荐度:
导读实验报告实验名称LL1分析法专业计算机科学与技术课程名称编译原理指导老师赵智超班级计算机一班姓名学号12103140102评分实验地点1C26217实验日期2014-04-30一、实验目的1.掌握LL(1)分析法的基本原理;2.掌握LL(1)分析表的构造方法;3.掌握LL(1)驱动程序的构造方法。二、实验原理根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序分析法的功能是利用LL(1)控制程序根据显示栈
实 验 报 告

实验名称LL1分析法

专 业

计算机科学与技术
课程名称编译原理指导老师赵智超班 级

计算机一班
姓    名

学    号

12103140102评 分

实验地点1C26217实验日期2014-04-30
一、实验目的

1.掌握LL(1)分析法的基本原理; 2.掌握LL(1)分析表的构造方法; 3.掌握LL(1)驱动程序的构造方法。

二、实验原理

根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程

三、实验过程及步骤(程序源代码、算法说明及调试过程)

#include  #include  using namespace std;

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;iif(first.find(w[i])>first.length()) first+=w[i]; }

void edge::newfollow(string w) { int i; for(i=0;iif(follow.find(w[i])>follow.length()&&w[i]!='@') follow+=w[i]; }

void edge::newselect(string w) { int i; for(i=0;iif(select.find(w[i])>select.length()&&w[i]!='@') select+=w[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(ni.getlf()==n[j].getlf())

{ if(NODE.find(n[j].getro()){ for(i=0;ielse  n[x].newfirst(n[j].getro()); } } }

void follow(edge ni,edge *n,int x)

{ int i,j,k,s; string str; for(i=0;i{ s=NODE.find(ni.getrg()[i]); if(s-1)

if(iif(n[j].getlf().find(ni.getrg()[i])==0)

{ if(NODE.find(ni.getrg()[i+1]){ for(k=0;k{  n[j].newfollow(n[k].getfirst());

if(n[k].getfirst().find("@")n[j].newfollow(ni.getfollow());  }  }

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()){  ni.newselect(ni.getro());  if(ni.getro()=="@") ni.newselect(ni.getfollow());}

else for(i=0;i{ for(j=0;j{  ni.newselect(n[j].getfirst());

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;ivoid outfu(int a,string c) { int i; for(i=0;ivoid outgraph(edge *n,string (*yc)[50]) { int i,j,k; bool flag;

for(i=0;i{ if(ENODE[i]!='@') { outfu(10," "); cout<outfu(10," "); cout<<"#"<for(i=0;ifor(k=0;kfor(j=0;j{ x=n[j].getselect().find(ENODE[k]);

if(x-1)

{ cout<<"->"<flag=0; }

x=n[j].getselect().find('#'); 

if(k==ENODE.length()-1&&x-1)

{ cout<<"->"<if(flag&&ENODE[k]!='@') outfu(11," "); } cout<int pipei(string &chuan,string &fenxi,string (*yc)[50],int &b)

{ char ch,a; int x,i,j,k; b++; cout<if(b>9) outfu(8," "); else outfu(9," ");

cout<outfu(10," "); a=chuan[0]; ch=fenxi[fenxi.length()-1]; x=ENODE.find(ch);

if(x-1) { if(ch==a) { fenxi.erase(fenxi.length()-1,1);

chuan.erase(0,1); cout<<"'"<if(pipei(chuan,fenxi,yc,b)) return 1; else return 0; } else return 0; }

else { if(ch=='#') { if(ch==a) { cout<<"分析成功"<else return 0; } else if(ch=='@') { fenxi.erase(fenxi.length()-1,1);

if(pipei(chuan,fenxi,yc,b)) return 1; else return 0; }

else {  i=NODE.find(ch); if(a=='#') { x=ENODE.find('@');

if(x-1) j=ENODE.length()-1; else j=ENODE.length(); }

else j=ENODE.find(a); if(yc[i][j].length()) { cout<"<fenxi.erase(fenxi.length()-1,1); for(k=yc[i][j].length()-1;k>-1;k--)

if(yc[i][j][k]!='@') fenxi+=yc[i][j][k];

if(pipei(chuan,fenxi,yc,b)) return 1;

else    return 0; }

else return 0;    } } }

void main()

{  edge *n;  string str,(*yc)[50];  int i,j,k;  bool flag=0;

cout<<"请输入上下文无关文法的总规则数:"<>SUM;

cout<<"请输入具体规则(格式:左部 右部,@为空):"<n=new edge[SUM]; for(i=0;ifor(j=0;jif(NODE.find(str[j])>NODE.length()&&ENODE.find(str[j])>ENODE.length())

ENODE+=str[j];  }

for(i=0;ifor(i=0;iif(n[i].getfirst().find("@"){    if(NODE.find(n[i].getro()){    for(k=1;k{      if(NODE.find(n[i].getrg()[k]){        for(j=0;j{    if(n[i].getrg()[k]==n[j].getlf()[0])

{  n[i].newfirst(n[j].getfirst());  break;}  }

if(n[j].getfirst().find("@")>n[j].getfirst().length())

{  n[i].delfirst();     break; } } } } }

for(k=0;k{  if(n[i].getlf()==n[0].getlf())  n[i].newfollow("#");  follow(n[i],n,i);     }

for(i=0;iif(n[j].getrg().find(n[i].getlf())==n[j].getrlen()-1)

n[i].newfollow(n[j].getfollow());}    }

for(i=0;ifor(i=0;i{  str.erase();   for(j=0;j{  if(!str.length())  str=n[j].getselect();

else { for(k=0;kif(str.find(n[j].getselect()[k]){  flag=1;  break;    }    }    }    }

cout<outfu(SUM," "); cout<<"First"; outfu(SUM," "); cout<<"Follow"<outfu(5+SUM,"-*-"); cout<for(i=0;i{for(j=0;jif(NODE[i]==n[j].getlf()[0])

{outfu(3," "); cout<outfu(SUM+4," ");  out(n[j].getfirst());

 outfu(SUM+4-2*n[j].getfirst().length()," ");

out(n[j].getfollow()); cout<outfu(5+SUM,"-*-");  cout<if(flag)

{cout<<"该文法不是LL(1)文法!"<else    { cout<<"该文法是LL(1)文法!"<cout<yc=new string[NODE.length()][50];

outgraph(n,yc); string chuan,fenxi,fchuan;

cout<cin>>chuan; fchuan=chuan;

fenxi="#";  fenxi+=NODE[0];  i=0;

cout<cout<<"步骤";  outfu(7," ");  cout<<"分析栈";

outfu(10," ");  cout<<"剩余输入串";  outfu(8," "); cout<<"推导所用产生式或匹配";

if(pipei(chuan,fenxi,yc,i))

cout<else       cout<

四、实验结果(含数据记录及分析等)

五、实验总结(含实验心得体会,收获与不足等)

    这次实验让我更加熟悉了LL(1)的工作流程以及LL(1)分析表的构造方法。以前课堂上搞不懂的算法流程通过实验都能得到进一步的了解。

文档

实验原理LL1分析法

实验报告实验名称LL1分析法专业计算机科学与技术课程名称编译原理指导老师赵智超班级计算机一班姓名学号12103140102评分实验地点1C26217实验日期2014-04-30一、实验目的1.掌握LL(1)分析法的基本原理;2.掌握LL(1)分析表的构造方法;3.掌握LL(1)驱动程序的构造方法。二、实验原理根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序分析法的功能是利用LL(1)控制程序根据显示栈
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top