资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1课课 程程 设设 计计 报报 告告课程名称课程名称编译原理实验项目实验项目设计与实现一个词法分析器实验实验仪器仪器PC 机北京信息科技大学信息管理学院(课程设计课程设计)实验报告)实验报告实验名称设计与实现一个词法分 析器实验地点3-603实验时间2010.11.221. 课程设计目的: 结合讲授内容,设计与实现一个简单词法编译器,通过设计编制调试一个具体的词法分析程序,加 深对词法分析程序的功能及实现方法的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解 为各类单词的词法分析方法。22.课程设计内容:设计与实现一个简单词法编译器。具体内容是产生一个二元式文本文件,扩展名为 dyd,可将 Pascal 或 C 程序(测试程序)分解成为一个一个的单词及类型,并查“单词符号与种别对照表”得出其种别,用 一数字表示。3.课程设计要求: (1)掌握和实现词法分析器的功能: 输入源程序,输出单词符号(二元式表示) 。输入输出(2)单词符号的分类: 关键字:是由程序语言定义的具有固定意义的标识符。if、int、for、while、do、return、break、 continue 等等,单词种别码为 1。 标识符:用来表示各种名字,如变量等,单词种别码为 10。 常数:常数的类型有整型,实型等无符号数,单词种别码为 11。 运算符:算术运算符,关系运算符,逻辑运算符+、-、*、/、=、=、 85CString m_operator23=“+“,“-“,“*“,“/“,“%“,“,“=“,“,“!=“,“=“,“/12个界限符,类别编号为:-97CString m_bound12=“,“,“,“,“;“,“,“,“.“,“(“,“)“,“:“,“,“;8.定义单词符号表(结构体) ;typedef struct WNodeCString word;CString type;CString typenum;WordInfo;typedef structWordInfo wordlistMaxSize;int Length;WordChart;9.定义 Cstring 类型变量,便于保存结果CString strsave;10. 编辑菜单项:新建菜单项“词法分析” ,下拉菜单 “初始化” 、 “开始分析”文件菜单添加菜单项“保 存分析结果” 。菜单项 ID 分别为 IDM_CLEAR、IDM_START、ID_FLIE_SAVE_RESULT511. 为 IDM_START 菜单项添加消息响应函数: void CLexicalView:OnStart() /*初始化 CMainFrame *pMain = (CMainFrame *)AfxGetApp()-m_pMainWnd; CEdit theEditCtrl.GetWindowText(pMain-m_str_buf,sizeof(pMain-m_str_buf); CString strbuf,strout1,strout2; strout2 = “; strbuf = pMain-m_str_buf; int i,k,j; char ch; WordChart w; /*第一轮扫描,取词*/ i=0;k=0; while (i:case :case :case :case :case |:case break; break; /*单一特殊符*/ case (:case ):case *:case ;:case :case :case :case :case:case #: case ,:case : w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; break; /*字符串*/ case “: w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; j = i+1; int tmp = strbuf.Find(ch,j);6while(j: if (strbuf.GetAt(i+1) = =)|(strbuf.GetAt(i+1) = ) w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i);w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i+1); i+; k+; else w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; break; case ) w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i);w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i+1); i+; k+; else w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; break; case =: if (strbuf.GetAt(i+1) = =) w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i);w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i+1); i+; k+; else w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; break; case !: if (strbuf.GetAt(i+1) = =) w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i);w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i+1); i+; k+; else w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; break; case |: if (strbuf.GetAt(i+1) = |) w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i);w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i+1); i+; k+; else 8w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; break; case w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),strbuf.GetAt(i+1); i+; k+; else w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; break; /*注释*/ case /: if (strbuf.GetAt(i+1) = *) i = strbuf.Find(“*/“,i)+1; else if (strbuf.GetAt(i+1) = /) i = strbuf.Find(“rn“,i)+1; else w.wordlistk.word.Insert(w.wordlistk.word.GetLength(),ch); k+; break; /*/ case r: case t: case n: case : break; default: break; i+; w.Length = k; /*第二轮扫描,判断类型*/ for (i=0;im_wndSpliter.GetPane(1,0); pRView -SetWindowText(strout2); 12. 为 IDM_CLEART 添加消息响应函数:10void CLexicalView:OnClear()/ TODO: Add your command handler code hereCMainFrame *pMain = (CMainFrame *)AfxGetApp()-m_pMainWnd;CResultOut *pRView = (CResultOut *)pMain-m_wndSpliter.GetPane(1,0);CLexicalDoc *pDoc = (CLexicalDoc *)GetDocument();pDoc-OnNewDocument();pRView -SetWindowText(NULL);SetWindowText(NULL);13. 为 ID_FLIE_SAVE_RESULT 添加消息响应函数:void CLexicalView:OnFlieSaveResult()/ TODO: Add your command handler code hereFILE *pFile;fopen_s(fwrite(strsave,1,strsave.GetLength(),pFile);fclose(pFile);MessageBox(“保存成功,文件名为:result.txt“);14. 编译运行。一、一、实验结果:实验结果:111.运行并打开文件(支持“.txt” “ .c” “.cpp”等文本类格式)122.开始分析133.保存分析结果以下是结果的 txt 文本格式14说明: 1.课程名称课程名称、课程设计目的课程设计目的、课程设计内容课程设计内容、课程设计要求课程设计要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供 学生使用; 2.实验条件实验条件由学生在实验或上机之前填写,教师应该在实验前检查并指导; 3.实验过程实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等; 4.实验总结实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等; 5.源程序、代码、具体语句等,若表格空间不足时可作为附录附录另外附页。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号