?? ana.java
字號:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
/*
* this class is used for word ananalyze.
* author:賀靜
*/
public class Ana {
public static char charToken;
public static int lineNo, c;
public static String token;
private String outputText;
private int state;
private BufferedReader input;
private HashMap table;
private boolean isOper(char a) {
if (table.containsKey(String.valueOf(a))) {
return true;
}
return false;
}
/*
* i is the ASCII of the char if i is between 97 and 122, i is a-z; if i is
* between 65 and 90, i is A-Z;
*/
private boolean isLetter(char a) {
int i = (int) a;
if ((97 <= i & i <= 122) || (65 <= i & i <= 90)) {
return true;
}
return false;
}
/*
* the ASCII of digits 0-9 is between 48 and 57
*/
private boolean isDigit(char a) {
int i = (int) a;
if (48 <= i & i <= 57) {
return true;
}
return false;
}
// switch the state
private void reSet() throws IOException {
switch (state) {
case 0:
state = 8;
break;
case 8:
state = 11;
break;
case 11:
state = 14;
break;
default:
}
}
// refresh the input,"@" 終止符
public void setBufferInput(String s) {
input = new BufferedReader(new StringReader(s + "@"));
}
/*
* the main method of word annalyze 0:operator; 8:key word or identify;
* 11:number
*/
public void analysis() throws IOException {
state = 0;
outputText = "";
Error error = new Error();
table = new HashMap(new Hashmap().getHashMap());
c = input.read();
lineNo = 1;
token = " ";
int lineNO = 0;
charToken = (char) c;
String token2 = " ";
while (c != -1) {
switch (state) {
case 0:
if (charToken == ' ')
;
else if (charToken == '\n')
lineNo++;
else if (charToken == '+' || charToken == '>'
|| charToken == '[' || charToken == ']'
|| charToken == '(' || charToken == ')'
|| charToken == '{' || charToken == '}'
|| charToken == ';') {
token = String.valueOf(charToken);
outputText += "LINE " + lineNo + ":" + " " + token + "\n";
} else if (charToken == '<')
state = 1;
else if (charToken == '=')
state = 2;
else if (charToken == '-')
state = 3;
else if (charToken == '/')
state = 4;
else if (charToken == '*')
state = 7;
else {
reSet();
break;
}
c = input.read();
charToken = (char) c;
break;
case 1:
if (charToken == '>') {
token = "<>";
outputText += "LINE " + lineNo + ":" + " " + token + "\n";
c = input.read();
charToken = (char) c;
} else {
token = "<";
outputText += "LINE " + lineNo + ":" + " " + token + "\n";
}
state = 0;
break;
case 2:
if (charToken == '=') {
token = "==";
c = input.read();
charToken = (char) c;
outputText += "LINE " + lineNo + ":" + " " + token + "\n";
} else {
token = "=";
outputText += "LINE " + lineNo + ":" + " " + token + "\n";
}
state = 0;
break;
case 3:
if (isDigit(charToken) & !isLetter(token.charAt(0))
& !isDigit(token.charAt(0))) {
token = "<->";
state = 11;
} else {
token = "-";
outputText += "LINE " + lineNo + ":" + " " + token + "\n";
state = 0;
}
break;
case 4:
if (charToken == '*') {
state = 5;
c = input.read();
charToken = (char) c;
} else {
token = "/";
outputText += "LINE " + lineNo + ":" + " " + token + "\n";
state = 0;
}
break;
case 5:
if (charToken == '*')
state = 6;
else {
if (charToken == '\n')
lineNO++;
state = 5;
}
c = input.read();
charToken = (char) c;
break;
case 6:
if (charToken == '/') {
lineNo = lineNo + lineNO;
lineNO = 0;
state = 0;
} else if (charToken == '*')
state = 6;
else {
if (charToken == '\n')
lineNO++;
state = 5;
}
c = input.read();
charToken = (char) c;
break;
case 7:
if (charToken == '/') {
outputText += error.getError(input, lineNo, token, c,
charToken, 0);
} else {
token = "*";
outputText += "LINE " + lineNo + ":" + " " + token + "\n";
}
state = 0;
break;
case 8:
if (isLetter(charToken)) {
state = 9;
token2 = String.valueOf(charToken);
c = input.read();
charToken = (char) c;
} else
reSet();
break;
case 9:
if (isLetter(charToken) || isDigit(charToken)
|| charToken == '_') {
token2 += String.valueOf(charToken);
state = 9;
c = input.read();
charToken = (char) c;
} else
state = 10;
break;
case 10:
token = token2;
if (token2.endsWith("_")) {
outputText += error.getError(input, lineNo, token, c,
charToken, 1);
} else {
if (!table.containsKey(token2))
table.put(token, "ID");
outputText += "LINE " + lineNo + ": " + table.get(token)
+ ": " + token + "\n";
}
state = 0;
break;
case 11:
if (isDigit(charToken)) {
state = 12;
token2 = String.valueOf(charToken);
c = input.read();
charToken = (char) c;
} else
reSet();
break;
case 12:
if (isDigit(charToken) || charToken == '.') {
token2 += String.valueOf(charToken);
state = 12;
c = input.read();
charToken = (char) c;
} else
state = 13;
break;
case 13:
if (isLetter(charToken)) {
token = token2 + charToken;
outputText += error.getError(input, lineNo, token, c,
charToken, 2);
} else {
try {
if (token2.contains(".")) {
if (token2.endsWith(".")) {
token = token2;
outputText += error.getError(input, lineNo,
token, c, charToken, 3);
state = 0;
break;
} else {
double num = Double.parseDouble(token2);
token2 = "" + num;
}
} else {
int num = Integer.parseInt(token2);
token2 = "" + num;
}
if (token.equals("<->")) {
token = "-" + token2;
} else
token = token2;
if (!table.containsKey(token))
table.put(token, "NUM");
outputText += "LINE " + lineNo + ": "
+ table.get(token) + ": " + token + "\n";
} catch (NumberFormatException nfe) {
token = token2;
outputText += error.getError(input, lineNo, token, c,
charToken, 6);
state = 0;
break;
}
}
state = 0;
break;
case 14:
if (isOper(charToken)) {
state = 0;
} else if (isLetter(charToken)) {
state = 8;
} else if (isDigit(charToken))
state = 11;
else
state = 15;
break;
case 15:// 16:error
outputText += error.getError(input, lineNo, token, c,
charToken, 4);
state = 0;
break;
}
}
if (state == 5 || state == 6) {
outputText += error.getError(input, lineNo, token, c, charToken, 5)
+ " END";
}
}
// return the output text
public String getOutput() {
return outputText;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -