编译原理C++语法分析器36884.pdf
《编译原理C++语法分析器36884.pdf》由会员分享,可在线阅读,更多相关《编译原理C++语法分析器36884.pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课程设计报告 课程名称:编译原理 课程设计题目:语法分析器 姓 名:系:计算机 专 业:计算机科学与技术 年 级:2009 级 学 号:指导教师:职 称:20102011 学年第一学期 评语:成绩:指导教师签字:任务下达日期:评定日期:目 录 1 正则表达式 1 1.1 正则表达式 1 1.2 确定化(化简)后的状态转换图 1 1.3 分析程序代码 1 1.4 程序运行截图 4 1.5 小结 4 2 LL(1)分析 5 2.1 LL(1)文法 5 2.2 LL(1)预测分析表 5 2.3 分析程序代码 5 2.4 程序运行截图 7 2.5 小结 7 3 算符优先分析 8 3.1 算符优先文法
2、8 3.2 算符优先关系表 8 3.3 分析程序代码 8 3.4 程序运行截图 10 3.5 小结 11 4 LR 分析 12 4.1 LR 文法 12 4.2 LR 分析表 12 4.3 分析程序代码 12 4.4 程序运行截图 112 4.5 小结 114 参考文献:114 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 in
3、t 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
4、集合 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
5、Nfa_Dfa();private:int K;/状态数 int TMaxMax;/状态子集矩阵 VNode AdjListMax;/nfa,邻接表的数据结构存储 VNode DfaMax;/dfa bool VisitedMax;/存 e-闭包结果 char AlpMax;/字母表,0 号单元用于存放个数 ;Nfa:Nfa()K=Alp0=0;char c;string line;ArcNode*p;while(cinc&c!=#)AdjListK.data=c;AdjListK.firstarc=new ArcNode;AdjListK.firstarc-nextarc=NULL;K+;g
6、etline(cin,line);while(getline(cin,line)&line!=#)int index=FindAdj(line0);if(index!=-1)p=AdjListindex.firstarc;while(p-nextarc)p=p-nextarc;p-nextarc=new ArcNode;p-nextarc-nextarc=NULL;p-nextarc-adjvex=FindAdj(line4);p-nextarc-info=line2;AlpAdd(p-nextarc-info);cout-endl;coutInitialization completely.
7、endl;coutK=;for(int i=0;iK-1;i+)coutAdjListi.data,;coutAdjListK-1.data.endl;cout=;for(int i=1;i(int)Alp0;i+)coutAlpi,;coutAlpAlp0.endl;for(int i=0;inextarc;while(p)coutf(AdjListi.data,info)=adjvexnextarc;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
8、 1|si a)break;cur=exchcur si+-a;if(si=0&cur=3)printf(%s Right!nn,s);else printf(%s Wrong!nn,s);int main()char str100;while(1)printf(有限自动机,判断是否符合(a|b)*(aa|bb)(a|b)*n);printf(请输入字符串:);gets(str);judge(str);1.4 程序运行截图 1.5 小结 平时的学习需要通过实践来检验,通过这次实验我能发现自身存在的一些问题,并且加以改正,同时通过实验加强了自己的动手能力,并且增强了对于正则表达式的理解,并不只在
9、于应试方面。2 LL(1)分析 2.1 LL(1)文法 ETE (注:该文法为示例,可更改)E+TE|TFT T*FT|F(E)|i 2.2 LL(1)预测分析表 i+*()#E ETE ETE E E+TE E E T TFT TFT T T T*FT T T F Fi F(E)2.3 分析程序代码 输入文法:ETE (注:该文法为示例,可更改)E+TE|TFT T*FT|F(E)|i 代码:#include#include char data5610=12,12,12+,-,-,34,34,-,34*,-,-,i,)0(,;/第一维 0-4 分别代表 EETTF,第二维 0-5 代表 i+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 C+ 语法 分析器 36884
限制150内