⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scaner.java

📁 实现算法与界面设计的完全分离。很好的封装自己的词法分析程序
💻 JAVA
字号:


public class Scaner {
 public ScanBuffer scanBuffer; //扫描缓冲区--共享
 private String finalAccidence;
 private AccidenceAnalyser aa;
 private int BUFFER_SIZE = 100;
 private String toDelString;
 private int senLength = 0;
 private char[] sentenceChar = new char[1000];
 private String TOKEN;
 private char CHAR;
 private int index = 0;
 private String IDENTITY = "identity";
 private String DIGIT = "digit";
 private String WORD_ERROR_INF = "在此行发现不能识别的单词,此行分析终止!";
 private boolean ASTATE = true;

 public Scaner(AccidenceAnalyser aa) {
 this.aa = aa;
 initBuffer();
 this.finalAccidence = "";
 System.out.println("扫描处理器已经创建!");
 }

 public String readFromBuffer(char[] Data) {
 String toDelString = String.valueOf(Data);
 return toDelString;
 }

 public String scan(String toDelString) {
 sentenceChar = toDelString.toCharArray();
 this.senLength = sentenceChar.length;
 int i = 0;
 //分析单词
 while (this.index <this.senLength) {
 //state0:
 this.TOKEN = "";
 this.CHAR = GETBC(sentenceChar);
 if (this.CHAR == ';') {
 break; //';'表示这一行结束
 }
 //进入状态判断
 switch (this.CHAR) {
 //judge letter
case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':case 'g':case 'h':case 'i':case 'j':case 'k':
case 'l':case 'm':case 'n':case 'o':case 'p':case 'q':case 'r':case 's':case 't':case 'u':case 'v':case 'w':case 'x':case 'y':
case 'z':case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':case 'G':case 'H':case 'I':case 'J':case 'K':case 'L':case 'M':
case 'N':case 'O':case 'P':case 'Q':case 'R':case 'S':case 'T':case 'U':case 'V':case 'W':case 'X':case 'Y':case 'Z':
 //do
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 //state1
 CHAR = this.GETCHAR(sentenceChar);
 while (this.ISLETTER(CHAR) || this.ISDIGIT(CHAR)) {
 this.TOKEN = this.CONTACT(this.TOKEN, CHAR);
 CHAR = this.GETCHAR(sentenceChar);
 }
 this.RETRACT();
 //state2
 if (aa.keyWordTable.isKeyWord(TOKEN)) {
 this.finalAccidence = this.finalAccidence + "[保留字] " +
 this.returnAWord(TOKEN) + "\n";
 }
 else {
 this.finalAccidence = this.finalAccidence + "[标识符] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(IDENTITY)) + "\n";
 }
 //clear up token
 this.TOKEN = "";
 break;
 //judge ditital
 case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
 //do
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 //state3
 CHAR = this.GETCHAR(sentenceChar);
 while (this.ISDIGIT(CHAR)) {
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 CHAR = this.GETCHAR(sentenceChar);
 }
 this.RETRACT();
 //state4
 this.finalAccidence = this.finalAccidence + "[数字] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(DIGIT)) + "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case '=':
 //state5
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[等号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case '+':
 //state6
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[加号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case '*':
 //state7
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 CHAR = this.GETCHAR(sentenceChar);
 //state8
 if (CHAR == '*') {
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[乘方] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 }
 //state9
 else {
 this.finalAccidence = this.finalAccidence + "[乘号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 }
 //clear up token
 this.TOKEN = "";
 break;
 case ',':
 //state10
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[逗号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case '(':
 //state11
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[左括号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case ')':
 //state12
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[右括号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case '{':
 //state13
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[左大括号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case '}':
 //state14
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[右大括号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case '[':
 //state15
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[左中括号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case ']':
 //state16
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[右中括号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 case '.':
 //state17
 this.TOKEN = this.CONTACT(TOKEN, CHAR);
 this.finalAccidence = this.finalAccidence + "[点号] " +
 this.returnAWord(TOKEN) + "[种别码] " +
 String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
 "\n";
 //clear up token
 this.TOKEN = "";
 break;
 default:
 //state18
 this.TOKEN = this.CONTACT(this.TOKEN, this.CHAR);
 //追加出错信息
 this.finalAccidence = this.finalAccidence + "[ERROR]" +
 this.WORD_ERROR_INF + "'" + this.TOKEN + "'" + "\n";
 this.ASTATE = false;
 //clear up token
 this.TOKEN = "";
 break;
 }
 if (this.ASTATE == false) {
 break;
 }
 }
 return this.finalAccidence;
 }

 
 public void controlThread() {
 this.toDelString = this.readFromBuffer(this.scanBuffer.Data);
 this.aa.outputAccidence(this.scan(this.toDelString));
 //分割符
 System.out.println("-------------------end row " + aa.pretreatment.fileRow +
 "-------------------");
 //结束这一行分析
 //clear up the var
 this.index = 0;
 this.finalAccidence = "";
 this.ASTATE = true;
 this.toDelString = "";
 this.senLength = 0;
 this.TOKEN = "";
 }

 public String returnAWord(String TOKEN) {
 return TOKEN;
 }

 public void initBuffer() {
 this.scanBuffer = aa.csbFactory.createScanBuffer(BUFFER_SIZE);
 }
//以下为字符的处理方法
/////////////////////////////////////////////////////
//////////////字符方法开始///////////////////////////
/////////////////////////////////////////////////////

 public char GETBC(char[] sentenceChar) {
 try {
 while ( (sentenceChar[this.index]) == ' ') {
 this.index++;
 }
 this.index++;
 }
 catch (java.lang.ArrayIndexOutOfBoundsException e) {
 return ';'; //表示此行已经结束
 }
 return sentenceChar[index - 1];
 }

 public char GETCHAR(char[] sentenceChar) {
	 try{
 next();
 return sentenceChar[this.index - 1];
	 }catch(java.lang.ArrayIndexOutOfBoundsException e){return ';';}
	 }


 public void next() {
 this.index++;
 }

 public boolean ISLETTER(char letter) {
 return java.lang.Character.isLetter(letter);
 }

 public boolean ISDIGIT(char letter) {
 return java.lang.Character.isDigit(letter);
 }

 public String CONTACT(String TOKEN, char CHAR) {
 String tmpS = TOKEN + String.valueOf(CHAR);
 TOKEN = tmpS;
 return TOKEN;
 }

 public boolean ISRESERVE(String TOKEN) {
 return aa.keyWordTable.isKeyWord(TOKEN);
 }

 public void RETRACT() {
 this.index--;
 }
/////////////////////////////////////////////////////
//////////////字符方法结束///////////////////////////
/////////////////////////////////////////////////////
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -