ImageVerifierCode 换一换
格式:DOC , 页数:19 ,大小:1.22MB ,
资源ID:6778167      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6778167.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(合肥工业大学编译原理实验 词法分析设计.doc)为本站会员(buyk185)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

合肥工业大学编译原理实验 词法分析设计.doc

1、实验题目:词法分析设计我幸苦写的程序,老师竟然认为我可能是抄的。女生就写不出来吗!不能忍啊!既然如此,我就将它放上网吧!(其他两个实验报告,我也会放上网的。请不用客气的下载吧)Edited by Magic Yang完成日期:2013-5-22一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。二、实验内容用 VC+/VB/JAVA 语言实现对 C 语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若

2、遇到错误则显示“Error”,然后跳过错误部分继续显示 ;同时进行标识符登记符号表的管理。以下是实现词法分析设计的主要工作:(1)从源程序文件中读入字符。(2)统计行数和列数用于错误单词的定位。(3)删除空格类字符,包括回车、制表符空格。(4)按拼写单词,并用(内码,属性)二元式表示。(属性值token 的机内表示)(5)如果发现错误则报告出错(6)根据需要是否填写标识符表供以后各阶段使用。三、数据结构及生成的算法描述事先已经构造好的表k 数组-关键字表 1,每个数组元素存放一个关键字s 数组- 分界符表 2m 数组-算术运算符表 3r 数组- 关系运算符表 4事先定义的表及变量ci 数组-常

3、数表 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 re

4、tract()-读入前一个字符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

5、 是否在分界符表中int in_m(char c)-判断字符 c 是否在算术运算符表中int in_k(char b)-判断字符 b 是否在关系运算符中void readstr()-从命令行读入源程序void readtext()-从文本中读入源程序4、算法流程图生成关键字表 k 和符号表s,m,rhandle()输入串处理readstr()从命令行读入源程序 readtext()从文本中读入源程序reserve(s)s 是否是保留字pint 没有越界words()识别字符串getchar()得到当前首字符show(6,s,)输出标识符num()识别数字串isdigit(ch)isletter

6、(ch)show(5,s,)输出数字串 reseverci(s)s 是否已经在 ci 表中reseverid(s)s 是否已经在 id 表中show(1,s,)输出保留字数字串不空in_s(c)c 是否在分界符表中将 s 加入 ci表将 s 加入 id表in_m(c)c 是否在算术运算符表中in_k(b)b 是否在关系运算符表中errorshow(-1,ch)输出错误getbc()-检查空白直到读入字符非空白 结束五、源程序代码和测试的结果package package_two;import java.util.*;import java.io.*;public class word stat

7、icStringk=“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

8、“,“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()/初始化instrin

9、g=“if i=0 for n+;na=48 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.

10、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)

11、|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 “+“(“

12、+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,“

13、+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+;/列数加一voi

14、d 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)=-

15、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(i

16、sletter(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

17、+“是第“+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(i

18、n_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;/识别的

19、标志符已经在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+“个分界符“);

20、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()

21、=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.

22、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 readstr()throws Exception/从命令行读入源程序BufferedReader

23、 sin=new BufferedReader(new InputStreamReader(System.in);/从命令行输入的输入流BufferedWriter fw=new BufferedWriter(new FileWriter (“E:“+ File.separator +“fun.txt“); /输出流,输出到fun.txtinstring=sin.readLine();while(instring.length()!=0)/将从命令行的输入写入fun.txtfw.write(instring);fw.newLine();handle();/处理读入的源程序change_r_l(

24、);instring=sin.readLine();fw.close();void readtext()throws Exception/从文本读入源程序BufferedReader f =new BufferedReader(new FileReader (“E:“+ File.separator +“fun.txt“);instring=f.readLine();while(instring!=null)handle();/处理读入的源程序change_r_l();instring=f.readLine();f.close();测试方法和测试的结果测试方法:可用程序默认源程序或调用readstr()从命令行输入源程序或调用readtext()从指定文本中读入源程序测试的结果6、实验的评价、收获与体会

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报