版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、华北水利水电学院 编译原理 实验报告一、实验目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解,深刻理解词法分析的整个过程,提高词法分析方法的实践能力。二、实验要求(1)从源程序文件中读取有效字符和并将其转换成二元组机内表示形式输出。(2)掌握词法分析的实现方法。(3)实验要求独立完成,不允许有抄袭现象。(4)实验完成后,要上交实验报告(包括源程序清单)。三、实验内容、主程序设计考虑:主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。主程序的工作部分建议设计成便于调试的循环结构
2、。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。)词法分析过程考虑该过程取名为 lexical,它根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词类,产生类号。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组 id 中,将常数存入数组中 ci 中,并记录其在表中的位置。3)功能要求输出源程序对应的二元组;对错误单词能够报错,并提示出错误所在行;常量和变量要求存在符号表中;注:所有识别出的单词都用二元组表示。第一个表示单词的种类。关键字的 t=1;标识
3、符的 t=2;常数 t=3;运算符 t=4;界符 t=5。第二个为该单词在各自表中的指针或内部码值(常数表和标识符表是在编译过程中建立起来的。其 i 值是根据它们在源程序中出现的顺序确定的)。关键字和特殊符号表格如下:单词代码12345678910名字intcharfloatvoidconstifelsedowhilescanf单词代码11121314151617181920名字printfreturnmain+*/%=单词代码21222324252627282930名字=,=,=,+,+=,-,-=,=, /12 13 14 15 16 17 18 19 20 21 #,.; /22char
4、 bufferbuffersize=;int placebuffersize2;char ch;char strtoken100=;int pp=0;char *biaoshifu100;int biao=0;char *constt100;int con=0;bool cmydlg:oninitdialog()cdialog:oninitdialog();/ add about. menu item to system menu./ idm_aboutbox must be in the system command range.assert(idm_aboutbox & 0xfff0) =
5、 idm_aboutbox);assert(idm_aboutbox appendmenu(mf_separator);psysmenu-appendmenu(mf_string, idm_aboutbox, straboutmenu);/ set the icon for this dialog. the framework does this automatically/ when the applications main window is not a dialogseticon(m_hicon, true);/ set big iconseticon(m_hicon, false);
6、/ set small iconuint array3;for(int i=0;i3;i+)arrayi = 100+i;m_statusbar.create(this); /创建状态栏窗口m_statusbar.setindicators(array,sizeof(array)/sizeof(uint); /添加面板for(int n=0;n3;n+)m_statusbar.setpaneinfo(n,arrayn,0,290); /设置面板宽度/设置面板文本m_statusbar.setpanetext(0,狂风制作);m_statusbar.setpanetext(1, 欢迎大家使用);
7、m_statusbar.setpanetext(2, 有理想就有梦想);repositionbars(afx_idw_controlbar_first,afx_idw_controlbar_last,0);settimer(1,300,null); /设置定时器return true; / return true unless you set the focus to a controlvoid cmydlg:onsyscommand(uint nid, lparam lparam)if (nid & 0xfff0) = idm_aboutbox)caboutdlg dlgabout;dlga
8、bout.domodal();elsecdialog:onsyscommand(nid, lparam);/ if you add a minimize button to your dialog, you will need the code below/ to draw the icon. for mfc applications using the document/view model,/ this is automatically done for you by the framework.void cmydlg:onpaint() if (isiconic()cpaintdc dc
9、(this); / device context for paintingsendmessage(wm_iconerasebkgnd, (wparam) dc.getsafehdc(), 0);/ center icon in client rectangleint cxicon = getsystemmetrics(sm_cxicon);int cyicon = getsystemmetrics(sm_cyicon);crect rect;getclientrect(&rect);int x = (rect.width() - cxicon + 1) / 2;int y = (rect.he
10、ight() - cyicon + 1) / 2;/ draw the icondc.drawicon(x, y, m_hicon);elsecdialog:onpaint();/ the system calls this to obtain the cursor to display while the user drags/ the minimized window.hcursor cmydlg:onquerydragicon()return (hcursor) m_hicon;void cmydlg:onclickrichedit2(nmhdr* pnmhdr, lresult* pr
11、esult) / todo: add your control notification handler code here*presult = 0;char* cmydlg:print(int i)return ki;void cmydlg:onfenxi() / todo: add your control notification handler code here/cfile file(null,cfile:modecreate|cfile:modewrite); cstring strtext1=;cstring strtext2=;strtext1=dealwith(); m_ri
12、chedit2.setwindowtext(strtext1);void cmydlg:getchar()ch=bufferpp;pp+;void cmydlg:getbc()while (ch= |int(ch)=10)getchar();void cmydlg:concat()strcat(strtoken,&ch);int cmydlg:isletterordigit()if (a=ch&ch=z)|(a=ch&ch=z)return letter;else if(0=ch&ch=9) return digit;else return notld;int cmydlg:reserve()
13、for (int i=0;iksize;i+)if(strcmp(strtoken,ki)=0)return i+1;return 0;int cmydlg:reserve1()for(int i=0;issize;i+)if (strcmp(strtoken,si)=0) return i+1;if(int(strtoken0)=13)return -1;return 0;void cmydlg:retract()ch= ;pp-;int cmydlg:insertid(char *a)biaoshifubiao+=a;return biao;int cmydlg:insertconst(c
14、har *a)consttcon+=a;return con;cstring cmydlg:dealwith()cstring strtext=,str=;pp=0;int code,valuee;/code为单词种别标号 valuee为单词符号的属性值int place1=0;str +=单词符号 t单词类型t类型编码t行数,列数n;strtext +=str;while (ppbuffersize&bufferpp!=null)for (int j=0;j:while(-1=isletterordigit()&ch!= &ch!=null&int(ch)!=13) concat();get
15、char();if(int(ch)!=13)retract();break;case :while(-1=isletterordigit()&ch!= &ch!=null&int(ch)!=13) concat();getchar();if(int(ch)!=13)retract();break;case +:while(-1=isletterordigit()&ch!= &ch!=null&int(ch)!=13) concat();getchar();if(int(ch)!=13)retract();break;case -:while(-1=isletterordigit()&ch!=
16、&ch!=null&int(ch)!=13) concat();getchar();if(int(ch)!=13)retract();break;case =:while(-1=isletterordigit()&ch!= &ch!=null&int(ch)!=13) concat();getchar();if(int(ch)!=13)retract();break;default: concat();break;i=reserve1();if (i=0)str.format(%stterrortt%dtt(%d,%d)n,strtoken,100,placeplace10,placeplac
17、e11);else if(i!=-1)str.format(%stt算符tt%dtt(%d,%d)n,strtoken,i,placeplace10,placeplace11);strtext +=str;str =; return strtext;void cmydlg:onbuttonopen() / todo: add your control notification handler code here/ todo: add your control notification handler code herecfiledialog dlg(true,null,null,ofn_hid
18、ereadonly|ofn_overwriteprompt,all files(*.*)|*.*| |,afxgetmainwnd();/cmyapp aa;cstring strpath,strtext=;if(dlg.domodal() = idok)strpath=dlg.getpathname();cfile file(strpath,cfile:moderead);char read1000;char c; /定义变量 c记录当前从文件中读入的一个字符int row=1; /记录文件的行数int line=1; /记录文件的列数int j=0;file.read(read,1000)
19、;for(int i=0;ifile.getlength();i+)strtext += readi;c =readi;if (c=n)/回车换行列数变为1,行数加1line =1;row +=1;if (int(c)!=13|char(c)!=0)bufferi=c;placej0=row;placej1=line;j+;if (int(c)!=0)line +=1;file.close();m_richedit1.setwindowtext(strtext);/char* temp;/temp=print(1);/strtext2 +=lll;/strtext2 +=temp;/*for(
20、 i=0;i21;i+)temp=print(i);strtext2 +=temp;strtext2 +=t;if(i+1)%5=0)strtext2 +=n;*/messagebox(temp,sadf,mb_ok);/*m_richedit1.setwindowtext(strtext); i=0; char ch; ch=strtext0;while(i100) ch=strtexti+;strtext2 +=ch;strtext2 +=n#;m_richedit2.setwindowtext(strtext2);*/updatedata(false);void cmydlg:onbut
21、tonsave() / todo: add your control notification handler code herecfiledialog dlg(false,null,null,ofn_hidereadonly|ofn_overwriteprompt,all files(*.*)|*.*| |,afxgetmainwnd();cstring strpath,strtext=;char write1000;if(dlg.domodal()=idok)strpath=dlg.getpathname();if(strpath.right(4)!=.txt)strpath+=.txt;
22、cfile file(_t(strpath),cfile:modecreate|cfile:modewrite);m_richedit2.getwindowtext(strtext);strcpy(write,strtext);file.write(write,strtext.getlength();file.close();void cmydlg:ontimer(uint nidevent) / todo: add your message handler code here and/or call defaultcstring stext,sleft,sright;int len;stext = m_statusbar.getpanetext(2); /获得状态栏第3个面板的显示字符len = stext.getlen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度旅游地图印刷及分销合同
- 2024年度智能手机研发与生产合作合同
- 2024年度城市轨道交通建设保险合同
- 运载工具用导航仪器随载计算机市场需求与消费特点分析
- 化妆用唇彩市场发展现状调查及供需格局分析预测报告
- 2024年度二手农机跨境电商合作合同
- 公文包皮具市场发展现状调查及供需格局分析预测报告
- 2024年度培训学校租场地合同范本:包含租赁期限、租金及违约金
- 2024年度技术转让合同:人工智能技术授权协议
- 2024年度制造业搬运外包合同
- spa连锁(芳疗精油养生馆)实施方案
- 幼儿园晨检记录表模板
- 食品安全总监职责、食品安全员守则
- 公文格式(政府发文与政府发文)
- 2023水轮发电机组润滑油系统运行维护导则
- 性格测试(考拉孔雀老虎猫头鹰)
- 化工设备图纸
- 中医技能考核评分表
- 校园及周边安全隐患排查记录表
- 质量管理体系IATF16949推行计划表
- 低值易耗品领用单
评论
0/150
提交评论