java 简单的词法分析

王朝学院·作者佚名  2016-05-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

java 简单的词法分析package com.seakt.example;

import java.io.*;import java.lang.String;

public class J_Scanner {public String infile; public String outfile; public String []key = new String[33];FileOutputStream out = null;public J_Scanner(String infile,String outfile){J_Scanner.this.infile = infile;J_Scanner.this.outfile = outfile;String[] key_temp = {"","auto","double","int","struct","break","else","long","switch","case", "enum","register","typedef","char","extern","return","union","const","float","short","unsigned","continue","for","signed","void","default","goto","sizeof","volatile","do","if","while","static"};key = key_temp;try {out = new FileOutputStream(new File(outfile)); }catch(IOException e){e.PRintStackTrace();}}//输出关键字public void print_key(){for(int i=0;i<J_Scanner.this.key.length;i++){System.out.printf("%s\r\n",J_Scanner.this.key[i]);}}//读文件 public void readFile() { File file = new File(J_Scanner.this.infile); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String tempString = null; while ((tempString = reader.readLine()) != null) { System.out.println(tempString.length()); getToken(tempString); } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } } //判断是否字符 private boolean isLetter(char ch){if((ch>=65&&ch<=90)||(ch>=97&&ch<=122)||ch==35||ch==46)return true;else return false; } //判断是否数字 private boolean isDigit(char ch){ if(ch>=48&&ch<=57)return true;else return false; } //查找关键字 private int reserve(String s){ for(int i=1;i<33;i++) if(s==key[i]) return i; return 0;

}

private void getToken(String s) throws IOException{

String str_write=null; int i=0,code;char ch=' ';String temp="";if(s.length()!=0){ch=s.charAt(i);}while(i<s.length()){

//如果是空跳过while(i<s.length()&&ch==' '){ i++; ch=s.charAt(i);}//是字母if(isLetter(ch)){while((isLetter(ch)||isDigit(ch))&&i<s.length()){ temp+=ch; i++; if(i<s.length()-1){ ch=s.charAt(i); }else{ ch=' '; }}i--;code=reserve(temp);if(code==0){str_write = temp+"\t"+"标识符"+"\r\n";out.write(str_write.getBytes()); temp="";str_write="";}else{ str_write = temp+"\t"+"关键字"+"\r\n"; out.write(str_write.getBytes()); temp="";str_write="";}

}else if(isDigit(ch)){while(isDigit(ch)){ temp+=ch; i++; if(i<s.length()-1){ ch=s.charAt(i); }else{ ch=' '; }}i--; str_write = temp+"\t"+"常数"+"\r\n";out.write(str_write.getBytes());temp="";str_write="";}else if(ch=='='){i++; ch=s.charAt(i);if(ch== '=' ){ str_write = "=="+"\t"+"判断相等"+"\r\n"; out.write(str_write.getBytes()); temp="";str_write="";}else{ i--; str_write = "="+"\t"+"赋值"+"\r\n"; out.write(str_write.getBytes()); temp="";str_write="";}

}else if(ch=='+'){ i++; ch=s.charAt(i); if(ch=='+') out.write(("++"+'\t'+"加1"+"\r\n").getBytes()); else{i--;out.write(("++"+'\t'+"加号"+"\r\n").getBytes()); }}else if(ch=='&'){ i++; ch=s.charAt(i); if(ch=='&') out.write(("&&"+'\t'+"与"+"\r\n").getBytes()); else{i--; out.write(("&"+'\t'+"按位与"+"\r\n").getBytes()); }}else if(ch=='|'){ i++; ch=s.charAt(i); if(ch=='|') out.write(("||"+'\t'+"或"+"\r\n").getBytes()); else{i--; out.write(("|"+'\t'+"按位或"+"\r\n").getBytes()); }}

else if(ch=='-') out.write(( (char)ch+'\t'+"减号"+"\r\n").getBytes());else if(ch==';') out.write(( (char)ch+'\t'+"分号"+"\r\n").getBytes());else if(ch=='(')out.write(( (char)ch+'\t'+"左括号"+"\r\n").getBytes());else if(ch==')')out.write(( (char)ch+'\t'+"右括号"+"\r\n").getBytes());else if(ch=='{') out.write(( (char)ch+'\t'+"左花括号"+"\r\n").getBytes());else if(ch=='}')out.write(( (char)ch+'\t'+"右花括号"+"\r\n").getBytes());else if(ch=='*'){i++; ch=s.charAt(i);if(ch=='*')out.write(("**"+'\t'+"运算符"+"\r\n").getBytes());else{ i--; out.write(("*"+'\t'+"乘号"+"\r\n").getBytes());}

}else if(ch=='<'){i++; ch=s.charAt(i);if(ch=='=') out.write(("<="+'\t'+"小于等于"+"\r\n").getBytes());else{ i--; out.write(("<"+'\t'+"小于"+"\r\n").getBytes());}

}else if(ch=='>'){i++;if(i<s.length()-1){ ch=s.charAt(i); }else{ ch=' '; }if(ch=='=') out.write((">="+'\t'+"大于等于"+"\r\n").getBytes());else{ i--; out.write(("<"+'\t'+"大于"+"\r\n").getBytes());}}elsereturn;i++;if(i<s.length()){ch=s.charAt(i);}} } //关闭输出流 public void close_outStream() throws IOException{J_Scanner.this.out.close();} }

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航