1、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
2、_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()-从文本中读入源程序四、算法流程图五、源程
3、序代码和测试的结果package package_two;import java.util.*;import java.io.*;public class word staticStringk=do,endforifprintfscanfthenwhileautobreakcasecharconstcontinuedefaultdoubleelseenumexternfloatgotointlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatileinline;/1关键字static
4、 char s=,;()/2分界符 static char m=+-*/3算术运算符 static String r=/4关系运算符 ArrayList ci=new ArrayList();/5常数 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&91)|(c96&123)ret
5、urn true; boolean isline(char c)/判断字符c是否是下划线 if(c=_)return true; boolean remove()/用于在判断关系运算符时,判断是否是要再读一个字符 char b=instring.charAt(pint+1); if(b=|b=)/当其后的字符是=或时,要再读一个字符。否则不要再读。 return true; void getbc()/检查空白直到读入字符非空白 while(ch= ) getchar(); void getchar()/读入下一个字符 pint+; if(pint=instring.length()-1)/当指
6、针没有越界时,可读字符 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+
7、ch;/将新识别的字符加到strtoken后 void num()/识别数字串/先将strtoken置空 while(isdigit(ch)/当数字时继续识别数字串 if(isletter(ch)|isline(ch)/识别完数字串而其后是字母,下划线时出错处理 while(isletter(ch)|isline(ch)|isdigit(ch)/当是字母,数字,下划线时继续识别错误数字串 strtoken=strtoken+ch; show(0,strtoken,/输出错误数字串 strtoken=/将strtoken置空返回 void show(int i,String s,char a)/
8、各种输出处理 switch(i) case -1:System.out.println(a+ +Error Error (+row+line+) break; case 0:System.out.println(s+ case 1:(1,+s+ 关键字 case 2:(2,+a+ 分界符 case 3:(3, 算术运算符 case 4:(4, 关系运算符 case 5:(5, 常数 case 6:(6, 标识符 line+;/列数加一 void change_r_l()/改变行列数 row+; void handle()/输入串处理/将搜索指示器置-1要处理的语句为 :+instring);
9、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
10、.println(one.strtoken+是第+(one.ci.size()-1)+个常数 else /如果strtoken在ci表中,仅输出 /System.out.println(one.strtoken+one.reseverci(one.strtoken)+个已经识别的常数 /拼出数字串 else if(isletter(ch)/当ch为字母时进行字符串识别 words();/字符串识别 if(reserve(strtoken)=-1)/如果strtoken不在k表中 if(reseverid(strtoken)=-1)/如果strtoken不在id表中 id.add(strtoke
11、n);/将strtoken加入id表中 show(6,strtoken,/输出标识串 / System.out.println(one.strtoken+(one.id.size()-1)+个标识符 else /如果strtoken在id表中+one.reseverid(one.strtoken)+个已经识别的标识符 else /如果strtoken在k表中+one.reserve(one.strtoken)+个关键字 show(1,strtoken,/输出关键字 /拼出字符串 else if(in_s(ch)!=-1) /分界符处理包含在one.in_s(one.ch)中 else if(i
12、n_m(ch)! /算术运算符处理包含在one.in_m(one.ch)中 else if(in_k(ch)! /关系运算符处理包含在one.in_k(one.ch)中 else show(-1, ,ch);/error/读下一位 int reserve(String s)/判断字符串是否是保留字 int i; for(i=0;ik.length;i+) if(s.equals(ki) return i;/是保留字,就返回编码 return -1;/不是保留字,就返回-1 int reseverid(String s)/判断识别的标志符是否已经在id表中id.size(); if(s.equa
13、ls(id.get(i)/识别的标志符已经在id表中,返回位置/识别的标志符不在id表中,返回-1 int reseverci(String s)/判断识别的数字串是否已经在ci表中ci.size(); if(s.equals(ci.get(i)/识别的数字串已经在ci表中,返回位置/识别的数字串不在ci表中,返回-1 int in_s(char c)/查找分界符s.length;i+) if(c=si)/与某个分界符配备时 / System.out.println(c+是分界符表中的第+i+个分界符 show(2, ,c);/输出分界符/返回所在位置/不在分界符表中 int in_m(cha
14、r c)/查找算术运算符m.length; if(c=mi)/与某个算术运算符配备时是算术运算符表中的第个算术运算符 show(3, /输出算术运算符/不在算术运算符表中 int in_k(char b)/查找关系运算符 if(remove()=false)/读下一位为假时,进行一位关系运算符识别 for(i=0;r.length; if(ri.length()=1)/当关系运算符为一位时,尝试匹配 if(ri.equals(Character.toString(b) / System.out.println(b+是关系运算符表中的第个关系运算符 show(4, ri,/输出关系运算符 ret
15、urn i; else/读下一位为假时,进行两位关系运算符识别 char a=new char2;/将两位字符放入a中 a0=b; a1=ch; if(ri.length()=2)/当关系运算符为两位时,尝试匹配 if(ri.equals(String.copyValueOf(a) / System.out.println(String.copyValueOf(a)+ show(4, ri, retract();/两位关系运算符匹配失败,读入前一个字符/不在关系运算表中 void readstr()throws Exception/从命令行读入源程序 BufferedReader sin=ne
16、w BufferedReader(new InputStreamReader(System.in);/从命令行输入的输入流 BufferedWriter fw=new BufferedWriter(new FileWriter (E:+ File.separator +fun.txt); /输出流,输出到fun.txt instring=sin.readLine(); while(instring.length()!=0)/将从命令行的输入写入fun.txt fw.write(instring); fw.newLine(); handle();/处理读入的源程序 instring=sin.re
17、adLine(); fw.close(); void readtext()throws Exception/从文本读入源程序 BufferedReader f =new BufferedReader(new FileReader ( instring=f.readLine(); while(instring!=null) handle();/处理读入的源程序 change_r_l(); instring=f.readLine(); f.close();测试方法和测试的结果测试方法:可用程序默认源程序或调用readstr()从命令行输入源程序或调用readtext()从指定文本中读入源程序测试的结果六、实验的评价、收获与体会