编译原理课程设计JAVA语法分析器.docx
- 文档编号:3498900
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:37
- 大小:353.41KB
编译原理课程设计JAVA语法分析器.docx
《编译原理课程设计JAVA语法分析器.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计JAVA语法分析器.docx(37页珍藏版)》请在冰豆网上搜索。
编译原理课程设计JAVA语法分析器
福建农林大学计算机与信息学院
计算机类
课程设计报告
课程名称:
编译原理
课程设计题目:
语法分析器
姓名:
系:
计算机
专业:
计算机科学与技术
年级:
2009级
学号:
指导教师:
职称:
2010~2011学年第一学期
福建农林大学计算机与信息学院计算机类
课程设计结果评定
评语:
成绩:
指导教师签字:
任务下达日期:
评定日期:
1正则表达式
1.1正则表达式
(a|b)*(aa|bb)(a|b)*(注:
该正规式为示例,可更改)
1.2确定化(化简)后的状态转换图
1.3分析程序代码
#include
#include
using namespace std;
const int Max=20;
typedef struct ArcNode{
int adjvex;//该弧所指向的顶点的位置
char info; //权
struct ArcNode *nextarc;//指向下一条弧的指针
}ArcNode;
typedef struct VNode{
char data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode;
class Nfa
{
public:
Nfa(); //构造函数,初始化nfa
int FindAdj(char c); //返回c状态的在邻接表中的序号
void AlpAdd(char c); //向字母表集合中添加表中没有的新元素c
void InitVisit(); //初始化Visited集合
void e_closure(int index); //求单一状态c的e-闭包
void e_closure(int a[]); //重载的状态集合的e-闭包
void move(int I,char a); //单一状态I的a弧转换
void move(int I[],char a); //重载的状态集合的a弧转换
void Nfa:
:
Visit_I(int *Temp);
//Visited转换为集合
void Insert(int I[],int a); //向状态集合中添加新元素
int TAdd(int I[]); //状态矩阵T中加入新状态集合
void Resault(int i);
void Nfa_Dfa();
private:
int K; //状态数
int T[Max][Max]; //状态子集矩阵
VNode AdjList[Max]; //nfa,邻接表的数据结构存储
VNode Dfa[Max]; //dfa
bool Visited[Max]; //存e-闭包结果
char Alp[Max]; //字母表,0号单元用于存放个数
};
Nfa:
:
Nfa()
{
K=Alp[0]=0;
char c;
string line;
ArcNode *p;
while(cin>>c&&c!
='#')
{
AdjList[K].data=c;
AdjList[K].firstarc=new ArcNode;
AdjList[K].firstarc->nextarc=NULL;
K++;
}
getline(cin,line);
while(getline(cin,line)&&line!
="#")
{
int index=FindAdj(line[0]);
if(index!
=-1)
{
p=AdjList[index].firstarc;
while(p->nextarc)
p=p->nextarc;
p->nextarc=new ArcNode;
p->nextarc->nextarc=NULL;
p->nextarc->adjvex=FindAdj(line[4]);
p->nextarc->info=line[2];
AlpAdd(p->nextarc->info);
}
}
cout<<"------------------------------"< cout<<"Initialization completely."< cout<<"K={"; for(int i=0;i cout< cout< cout<<"∑={"; for(int i=1;i<(int)Alp[0];i++) cout< cout< for(int i=0;i { p=AdjList[i].firstarc; p=p->nextarc; while(p) { cout<<"f("< p=p->nextarc; } if(i cout< } cout<<"------------------------------"< for(int i=0;i T[i][0]=0; } int Nfa: : FindAdj(char c) { for(int i=0;i if(c==AdjList[i].data) return i; //返回序号 return -1; //没有查找到则返回-1 } void Nfa: : AlpAdd(char c) { if(c=='*') return; for(int i=1;i<=(int)Alp[0];i++) if(c==Alp[i]) return; //集合中已含有 Alp[++Alp[0]]=c; } void Nfa: : e_closure(int index) { ArcNode *p; Visited[index]=true; p=AdjList[index].firstarc->nextarc; while(p) { if(! Visited[p->adjvex]&&p->info=='*') e_closure(p->adjvex); p=p->nextarc; } } void Nfa: : e_closure(int a[]) { InitVisit(); for(int i=1;i<=a[0];i++) e_closure(a[i]); } void Nfa: : InitVisit() { for(int i=0;i Visited[i]=false; } void Nfa: : move(int I,char a) { ArcNode *p; p=AdjList[I].firstarc->nextarc; while(p) { if(p->info==a) Visited[p->adjvex]=true; p=p->nextarc; } } void Nfa: : move(int I[],char a) { InitVisit(); for(int i=1;i<=I[0];i++) move(I[i],a); } void Nfa: : Insert(int I[],int index) { //I[0]表示元素个数; int flag=0; for(int i=1;i<=I[0];i++) { if(index==I[i]) //状态集合中已有index状态 return; else if(index>I[i]) flag=i; //标记待插入位置 } I[0]++;flag++; for(int i=I[0];i>flag;i--) I[i]=I[i-1]; I[flag]=index; } int Nfa: : TAdd(int I[]) {//T[0][0]当前集合的个数 int i=1; for(;i<=T[0][0];i++) { if(I[0]==T[i][0]) { int j=1; for(;j<=I[0];j++) if(I[j]! =T[i][j]) break; if(j==(I[0]+1)) //说明矩阵T中已有I集合,并返回位置 return i; } } T[0][0]++; for(i=0;i<=I[0];i++) T[T[0][0]][i]=I[i]; return -1; //说明矩阵T中没有I集合,插入并返回-1 } void Nfa: : Visit_I(int *Temp) { Temp[0]=0; for(int i=0;i if(Visited[i]) Temp[++Temp[0]]=i; } void Nfa: : Resault(int i) { int j,k; ArcNode *p; cout<<"Nfa To Dfa: "< for(j=0;j { cout<<(int)Dfa[j].data<<"={"; for(k=1;k cout< cout< if((j+1)%2==0) cout< } if((j+1)%2==0) cout< cout< cout<<"S={"; for(int j=0;j cout<<(int)Dfa[j].data<<","; cout<<(int)Dfa[i-1].data<<"}."< cout<<"∑={"; for(int j=1;j<(int)Alp[0];j++) cout< cout< for(int j=0;j { p=Dfa[j].firstarc; p=p->nextarc; while(p) { cout<<"D("<<(int)Dfa[j].data<<","< p=p->nextarc; } if(jnextarc) cout< } cout<<"Finished."< cout<<"------------------------------"< } void Nfa: : Nfa_Dfa() { int Temp[Max],i=0,j=1; ArcNode *p; InitVisit(); e_closure(0); //选择第一个状态K0 Visit_I(Temp); TAdd(Temp);//Dfa中加入第一个状态 i++;j++; //将选择的第一个状态的e-闭包加入C矩阵中//并标记 while(i! =j) { Dfa[i-1].data=i-1; Dfa[i-1].firstarc=new ArcNode; Dfa[i-1].firstarc->nextarc=NULL; for(int ii=1;ii<=Alp[0];ii++) { for(int jj=0;jj<=T[i][0];jj++) Temp[jj]=T[i][jj]; move(Temp,Alp[ii]); Visit_I(Temp); if(Temp[0]) { e_closure(Temp); Visit_I(Temp); int flag=TAdd(Temp); if(flag==-1) { j++; p=Dfa[i-1].firstarc; while(p->nextarc) {p=p->nextarc;} p->nextarc=new ArcNode; p->nextarc->adjvex=T[0][0]-1; p->nextarc->info=Alp[ii]; p->nextarc->nextarc=NULL; } else { p=Dfa[i-1].firstarc; while(p->nextarc) {p=p->nextarc;} p->nextarc=new ArcNode; p->nextarc->adjvex=flag-1; p->nextarc->info=Alp[ii]; p->nextarc->nextarc=NULL; } } } i++; } Resault(i-1); } int main() { Nfa nfa; nfa.Nfa_Dfa(); return 0; } 1.4程序运行截图 1.5小结 平时的学习需要通过实践来检验,通过这次实验我能发现自身存在的一些问题,并且加以改正,同时通过实验加强了自己的动手能力,并且增强了对于正则表达式的理解,并不只在于应试方面。 2LL (1)分析 2.1LL (1)文法 E→TE'(注: 该文法为示例,可更改) E'→+TE'|ε T→FT' T'→*FT'|ε F→(E)|i 2.2LL (1)预测分析表 i + * ( ) # E E→TE' E→TE' E' E'→+TE' E'→ε E'→ε T T→FT' T→FT' T' T'→ε T'→*FT' T'→ε T'→ε F F→i F→(E) 2.3分析程序代码 输入文法: E→E+T|T T→T*F|F F→i|(E) 代码: (1)计算非终结符的First集: voidfirst(edgeni,edge*n,intx)//ni为一个产生式,n为整个文法 {inti,j; for(j=0;j {if(ni.getlf()==n[j].getlf()) { if(NODE.find(n[j].getro()) {for(i=0;i if(n[i].getlf()==n[j].getro()) first(n[i],n,x); } elsen[x].newfirst(n[j].getro());//终结符的情况 } } } (2)计算非终结符的Follow集: voidfollow(edgeni,edge*n,intx)//计算follow {inti,j,k,s; stringstr; for(i=0;i {s=NODE.find(ni.getrg()[i]); if(s if(i for(j=0;j if(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); } } } } (3)输出预测分析表的主要代码: voidoutgraph(edge*n,string(*yc)[50]) {inti,j,k; boolflag; for(i=0;i {if(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 JAVA 语法 分析器