资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
课程设计报告课程设计报告 课程名称:编译原理 课程设计题目:语法分析器 姓名: 系:计算机 专业:计算机科学与技术 年级:2009 级 学号: 指导教师: 职称: 20102011 学年第一学期 评语: 成绩: 指导教师签字:任务下达日期: 评定日期: 目目录录 1 1正则表达式正则表达式 1 1.1正则表达式 1 1.2确定化(化简)后的状态转换图1 1.3分析程序代码 1 1.4程序运行截图 4 1.5 小结4 2 2LL(1)LL(1)分析分析5 2.1LL(1)文法5 2.2LL(1)预测分析表5 2.3分析程序代码 5 2.4程序运行截图 7 2.5小结 7 3 3算符优先分析算符优先分析 8 3.1算符优先文法 8 3.2算符优先关系表 8 3.3分析程序代码 8 3.4程序运行截图10 3.5小结11 4 4LRLR 分析分析 12 4.1LR 文法12 4.2LR 分析表12 4.3分析程序代码12 4.4程序运行截图 112 4.5小结114 参考文献:参考文献:114 1 1 1正则表达式正则表达式 1.1正则表达式正则表达式 (a|b)*(aa|bb)(a|b)*(注:该正规式为示例,可更改) 1.2确定化确定化(化简化简)后的状态转换图后的状态转换图 1.3分析程序代码分析程序代码 #include #include usingnamespacestd; constintMax=20; typedefstructArcNode intadjvex;/该弧所指向的顶点的位置 charinfo;/权 structArcNode*nextarc;/指向下一条弧的指针 ArcNode; typedefstructVNode chardata;/顶点信息 ArcNode*firstarc;/指向第一条依附该顶点的弧的指针 VNode; classNfa public: Nfa();/构造函数,初始化 nfa intFindAdj(charc);/返回 c 状态的在邻接表中的序号 voidAlpAdd(charc);/向字母表集合中添加表中没有的新元素 c voidInitVisit();/初始化 Visited 集合 voide_closure(intindex);/求单一状态 c 的 e-闭包 voide_closure(inta);/重载的状态集合的 e-闭包 voidmove(intI,chara);/单一状态 I 的 a 弧转换 voidmove(intI,chara);/重载的状态集合的 a 弧转换 voidNfa:Visit_I(int*Temp);/Visited 转换为集合 voidInsert(intI,inta);/向状态集合中添加新元素 intTAdd(intI);/状态矩阵 T 中加入新状态集合 voidResault(inti); ab C B AD a b a b ab 2 voidNfa_Dfa(); private: intK;/状态数 intTMaxMax;/状态子集矩阵 VNodeAdjListMax;/nfa,邻接表的数据结构存储 VNodeDfaMax;/dfa boolVisitedMax;/存 e-闭包结果 charAlpMax;/字母表,0 号单元用于存放个数 ; Nfa:Nfa() K=Alp0=0; charc; stringline; ArcNode*p; while(cinc AdjListK.firstarc=newArcNode; AdjListK.firstarc-nextarc=NULL; K+; getline(cin,line); while(getline(cin,line) if(index!=-1) p=AdjListindex.firstarc; while(p-nextarc) p=p-nextarc; p-nextarc=newArcNode; p-nextarc-nextarc=NULL; p-nextarc-adjvex=FindAdj(line4); p-nextarc-info=line2; AlpAdd(p-nextarc-info); coutnextarc; while(p) coutinfoadjvexnextarc; if(inextarc) #include int exch42=1,2,3,2,1,3,3,3; void judge(char *s) int cur = 0, i = 0; while(si) if(si-a 1 | si #include char data5610=“12“,“,“,“12“,“,“, “,“12+“,“,“,“-“,“-“, “34“,“,“,“34“,“,“, “,“-“,“34*“,“,“-“,“-“, “i“,“,“,“)0(“,“,“, ;/ 第一维 0-4 分别代表 EETTF ,第二维 0-5 代表 i+*()# -代表 int exch(char ch) switch(ch) 6 case i: return 0; case +: return 1; case *: return 2; case (: return 3; case ): return 4; case0 : return 5; /字符串结束标志代表#. default: return -1; void judge(char *s) int tot=0,i=0,cur,k=exch(s0); char sta100; sta+tot=0; while(tot0) cur = statot - 0; if(si = )/ 去空格 +tot,k=exch(s+i); else if(cur+0 = si)/ 推导出相同字符,出栈 k=exch(s+i); else if(k #include char com88=, , , , , , , , , , , , , , , , , , , , , , , ,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号