编译原理实验报告LL(1)分析法

更新时间:2023-10-19 17:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课 程 编译原理 实验名称 实验二 LL(1)分析法

实验目的

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

一.实验内容及要求

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

对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG (3)G->ε (4)T->FS (5)S->*FS (6)S->ε (7)F->(E) (8)F->i 程序输入一以#结束的符号串(包括+*()i#),如:i+i*i#。输出过程如下:

步骤 分析栈 剩余输入串 所用产生式 1 E i+i*i# E->TG ... ... ... ...

二.实验过程及结果

代码如下:

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

void edge::newfollow(string w) {

int i; for(i=0;ifollow.length()&&w[i]!='@') follow+=w[i]; }

void edge::newselect(string w) { int i; for(i=0;iselect.length()&&w[i]!='@') select+=w[i]; }

void edge::delfirst() { int i=first.find('@'); first.erase(i,1); }

int SUM;

string NODE,ENODE;

//计算first

void first(edge ni,edge *n,int x) { int i,j; for(j=0;j

//计算follow

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

{ int i,j,k,s; string str; for(i=0;i-1) //是非终结符 if(i

//计算select

void select(edge &ni,edge *n) { int i,j; if(ENODE.find(ni.getro())

for(j=0;jn[j].getfirst().length()) return; } } }

//输出集合

void out(string p) { int i; if(p.length()==0) return; cout<<\ for(i=0;i

//连续输出符号

void outfu(int a,string c) { int i; for(i=0;i

//输出预测分析表

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

本文来源:https://www.bwwdw.com/article/61wf.html

Top