收藏 分享(赏)

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

上传人:buyk185 文档编号:6778167 上传时间:2019-04-22 格式:DOC 页数:19 大小:1.22MB
下载 相关 举报
合肥工业大学编译原理实验 词法分析设计.doc_第1页
第1页 / 共19页
合肥工业大学编译原理实验 词法分析设计.doc_第2页
第2页 / 共19页
合肥工业大学编译原理实验 词法分析设计.doc_第3页
第3页 / 共19页
合肥工业大学编译原理实验 词法分析设计.doc_第4页
第4页 / 共19页
合肥工业大学编译原理实验 词法分析设计.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

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营业执照举报