




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验题目:词法分析设计我幸苦写的程序,老师竟然认为我可能是抄的。女生就写不出来吗!不能忍啊!既然如此,我就将它放上网吧!(其他两个实验报告,我也会放上网的。请不用客气的下载吧)Edited by Magic Yang完成日期:2013-5-22一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。二、实验内容用VC+/VB/JAVA语言实现对C语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;同时进行标识符登记符号表的管理。以下是实现词法分析设计的主要工作:(1)从源程序文件中读入字符。(2)统计行数和列数用于错误单词的定位。(3)删除空格类字符,包括回车、制表符空格。(4)按拼写单词,并用(内码,属性)二元式表示。(属性值token的机内表示)(5)如果发现错误则报告出错(6)根据需要是否填写标识符表供以后各阶段使用。三、数据结构及生成的算法描述事先已经构造好的表k数组-关键字表1,每个数组元素存放一个关键字s 数组-分界符表 2m数组-算术运算符表 3r数组-关系运算符表4事先定义的表及变量ci数组-常数表5id数组-标识符表6pint-搜索指示器strtoken-存放构成单词符号的字符串row-行数line-列数ch-存放最新读入源程序字符instring-存放输入源程序用到的方法boolean isdigit(char c)-判断字符c是否是数字boolean isletter(char c)-判断字符c是否是字母boolean isline(char c)-判断字符c是否是下划线boolean remove()-用于在判断关系运算符时,判断是否是要再读一个字符void getbc()-检查空白直到读入字符非空白void getchar()-读入下一个字符void retract()-读入前一个字符void words()-识别字符串void num()-识别数字串void show(int i,String s,char a)-各种输出处理void change_r_l()-改变行列数void handle()-输入串处理int reserve(String s)-判断字符串s是否是保留字int reseverid(String s)-判断识别的标志符s是否已经在id表中int reseverci(String s)-判断识别的数字串s是否已经在ci表中int in_s(char c)-判断字符c是否在分界符表中int in_m(char c)-判断字符c是否在算术运算符表中int in_k(char b)-判断字符b是否在关系运算符中void readstr()-从命令行读入源程序void readtext()-从文本中读入源程序4、 算法流程图生成关键字表k和符号表s,m,rreadstr()从命令行读入源程序readtext()从文本中读入源程序handle()输入串处理getchar()得到当前首字符pint没有越界是getbc()-检查空白直到读入字符非空白结束否isletter(ch)isdigit(ch)是是words()识别字符串in_s(c)c是否在分界符表中num()识别数字串是否否数字串不空reserve(s)s是否是保留字in_m(c)c是否在算术运算符表中是否否是是reseverid(s)s是否已经在id表中in_k(b)b是否在关系运算符表中reseverci(s)s是否已经在ci表中是否否是否show(1,s,)输出保留字是将s加入id表将s加入ci表errorshow(5,s,)输出数字串 show(6,s,)输出标识符show(-1,ch)输出错误五、源程序代码和测试的结果package package_two;import java.util.*;import java.io.*;public class word staticStringk=do,end,for,if,printf,scanf,then,while,auto,break,case,char,const,continue,default,double,else,enum,extern,float,goto,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,inline;/1关键字static char s=,;,(,),;/2分界符static char m=+,-,*,/;/3算术运算符static String r=,=,;/4关系运算符ArrayList ci=new ArrayList();/5常数ArrayList id=new ArrayList();/6标识符int pint;/搜索指示器String strtoken=;/存放构成单词符号的字符串int row;/行数int line;/列数char ch;/存放最新读入源程序字符String instring;/存放输入源程序word()/初始化instring=if i=0 for n+;na=48&c64&c96&c)/当其后的字符是=或时,要再读一个字符。否则不要再读。 return true; return false; void getbc()/检查空白直到读入字符非空白while(ch= )getchar();void getchar()/读入下一个字符pint+;if(pint=instring.length()-1)/当指针没有越界时,可读字符ch=instring.charAt(pint);if(ch=n)/当读到换行符时,行数加一,列数置一。再读下一个字符change_r_l();getchar();else ch= ;/当指针越界时,置ch为空白符void retract()/读入前一个字符pint-;ch=instring.charAt(pint);void words()/识别字符串strtoken=;/先将strtoken置空while(isletter(ch)|isdigit(ch)|isline(ch)/当是字母,数字,下划线时继续识别字符串strtoken=strtoken+ch;/将新识别的字符加到strtoken后getchar();void num()/识别数字串strtoken=;/先将strtoken置空while(isdigit(ch)/当数字时继续识别数字串strtoken=strtoken+ch;/将新识别的字符加到strtoken后getchar();if(isletter(ch)|isline(ch)/识别完数字串而其后是字母,下划线时出错处理while(isletter(ch)|isline(ch)|isdigit(ch)/当是字母,数字,下划线时继续识别错误数字串strtoken=strtoken+ch;/将新识别的字符加到strtoken后getchar();show(0,strtoken, );/输出错误数字串strtoken=;/将strtoken置空返回void show(int i,String s,char a)/各种输出处理switch(i)case -1:System.out.println(a+ +Error+ Error +(+row+,+line+);break;case 0:System.out.println(s+ +Error+ Error +(+row+,+line+);break;case 1:System.out.println(s+ +(1,+s+)+ 关键字 +(+row+,+line+);break;case 2:System.out.println(a+ +(2,+a+)+ 分界符 +(+row+,+line+);break;case 3:System.out.println(a+ +(3,+a+)+ 算术运算符 +(+row+,+line+);break;case 4:System.out.println(s+ +(4,+s+)+ 关系运算符 +(+row+,+line+);break;case 5:System.out.println(s+ +(5,+s+)+ 常数 +(+row+,+line+);break;case 6:System.out.println(s+ +(6,+s+)+ 标识符 +(+row+,+line+);break;line+;/列数加一void change_r_l()/改变行列数row+;line=1;void handle()/输入串处理pint=-1;/将搜索指示器置-1System.out.println(要处理的语句为 : +instring);getchar();/读入一个字符while(pintinstring.length()/当搜索指示器没有越界时getbc();/检查空白直到读入读入非空if(isdigit(ch)/当ch为数字时进行数字串识别num();/数字串识别if(strtoken.length()!=0)/经过数字串识别后,如果strtoken不为空if(reseverci(strtoken)=-1)/如果strtoken不在ci表中,将strtoken加入ci表中ci.add(strtoken);/将strtoken加入ci表中show(5,strtoken, );/输出数字串/System.out.println(one.strtoken+是第+(one.ci.size()-1)+个常数);else /如果strtoken在ci表中,仅输出/System.out.println(one.strtoken+是第+one.reseverci(one.strtoken)+个已经识别的常数);show(5,strtoken, );/输出数字串/拼出数字串else if(isletter(ch)/当ch为字母时进行字符串识别words();/字符串识别if(reserve(strtoken)=-1)/如果strtoken不在k表中if(reseverid(strtoken)=-1)/如果strtoken不在id表中id.add(strtoken);/将strtoken加入id表中show(6,strtoken, );/输出标识串/System.out.println(one.strtoken+是第+(one.id.size()-1)+个标识符);else /如果strtoken在id表中/System.out.println(one.strtoken+是第+one.reseverid(one.strtoken)+个已经识别的标识符);show(6,strtoken, );/输出标识串else /如果strtoken在k表中/System.out.println(one.strtoken+是第+one.reserve(one.strtoken)+个关键字);show(1,strtoken, );/输出关键字/拼出字符串else if(in_s(ch)!=-1) /分界符处理包含在one.in_s(one.ch)中else if(in_m(ch)!=-1)/算术运算符处理包含在one.in_m(one.ch)中else if(in_k(ch)!=-1)/关系运算符处理包含在one.in_k(one.ch)中elseshow(-1, ,ch);/errorgetchar();/读下一位int reserve(String s)/判断字符串是否是保留字int i;for(i=0;ik.length;i+)if(s.equals(ki)return i;/是保留字,就返回编码return -1;/不是保留字,就返回-1int reseverid(String s)/判断识别的标志符是否已经在id表中int i;for(i=0;iid.size();i+)if(s.equals(id.get(i)return i;/识别的标志符已经在id表中,返回位置return -1;/识别的标志符不在id表中,返回-1int reseverci(String s)/判断识别的数字串是否已经在ci表中int i;for(i=0;ici.size();i+)if(s.equals(ci.get(i)return i;/识别的数字串已经在ci表中,返回位置return -1;/识别的数字串不在ci表中,返回-1int in_s(char c)/查找分界符int i;for(i=0;is.length;i+)if(c=si)/与某个分界符配备时/System.out.println(c+是分界符表中的第+i+个分界符);show(2, ,c);/输出分界符getchar();/读下一位return i;/返回所在位置return -1;/不在分界符表中int in_m(char c)/查找算术运算符int i;for(i=0;im.length;i+)if(c=mi)/与某个算术运算符配备时/System.out.println(c+是算术运算符表中的第+i+个算术运算符);show(3, ,c);/输出算术运算符getchar();/读下一位return i;/返回所在位置return -1;/不在算术运算符表中int in_k(char b)/查找关系运算符int i;if(remove()=false)/读下一位为假时,进行一位关系运算符识别for(i=0;ir.length;i+) if(ri.length()=1)/当关系运算符为一位时,尝试匹配 if(ri.equals(Character.toString(b) / System.out.println(b+是关系运算符表中的第+i+个关系运算符); show(4, ri, );/输出关系运算符 getchar();/读下一位return i;/返回所在位置 else/读下一位为假时,进行两位关系运算符识别char a=new char2;/将两位字符放入a中a0=b;getchar();a1=ch;for(i=0;ir.length;i+)if(ri.length()=2)/当关系运算符为两位时,尝试匹配if(ri.equals(String.copyValueOf(a) /System.out.println(String.copyValueOf(a)+是关系运算符表中的第+i+个关系运算符);show(4, ri, );/输出关系运算符 getchar();/读下一位return i;/返回所在位置 retract();/两位关系运算符匹配失败,读入前一个字符return -1;/不在关系运算表中void r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股权分割产权转让合同模板
- 征收拆迁补偿房屋买卖合同争议解决与执行合同
- 企业宿舍宿管员全面服务合同
- 2025年综合类-乙烯装置操作工-乙烯压缩理论知识历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-临床医学检验技术(主管技师)-微生物和微生物学检验历年真题摘选带答案(5卷单选100题合辑)
- 2025年综合类-中西医结合外科学-第十二单元急腹症历年真题摘选带答案(5卷单选100题合辑)
- 2025年综合类-中级房地产经济-第十四章中级房地产经济综合练习历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-中学信息技术(高级)-第五章算法与程序设计历年真题摘选带答案(5套单选100题合辑)
- 安徽差旅管理办法抽调
- 大棚地漏养护管理办法
- GB/T 20424-2025重有色金属精矿产品中有害元素的限量规范
- 干部履历表(中共中央组织部2015年制)
- 腰椎穿刺课件
- 八年级物理上册《实验题》专项训练题及答案(人教版)
- 广西中医药大学赛恩斯新医药学院
- 电器质量保证协议
- 【员工关系管理研究国内外文献综述2800字】
- GB/T 17622-2008带电作业用绝缘手套
- 英语天气课件
- 仿制药生物等效性试验指导原则(日本)
- 一诺LZYN质量流量计使用说明书-2009版
评论
0/150
提交评论