?? lexicalanalyze.java
字號(hào):
/*
* 呂淵 200532580144
* 使用工具:eclipse
* Java SE 6
*/
import java.util.*;
public class LexicalAnalyze {
private String inputString = "";
//存儲(chǔ)內(nèi)容、類型、行號(hào)
public LinkedList<Tokens> list = new LinkedList<Tokens>();
public ArrayList<Integer> tokenStart = new ArrayList<Integer>();
public ArrayList<Integer> tokenEnd = new ArrayList<Integer>();
//存入list2的內(nèi)容
public final int CMMK = 1;//保留字
public final int CMMN = 2;//數(shù)字
public final int CMMS = 3;//符號(hào)
public final int CMMI = 4;//標(biāo)識(shí)符
public final int CMME = 5;//錯(cuò)誤
public final int CMMSP = 6;//空格
public boolean lexicalError = false;
//是否注釋不完整
private boolean commentNotEnd = false;
private int commentLastAt = 0;
//是否出現(xiàn)命名錯(cuò)誤
private boolean wrongNamed = false;
int start = 0;
//構(gòu)造方法
public LexicalAnalyze (String inputString) {
this.inputString = inputString;
lexicalAnalyse();
if (commentNotEnd == true || wrongNamed == true) lexicalError = true;
}
//詞法分析
private void lexicalAnalyse(){
int line = 1;
//對(duì)每行依次進(jìn)行分析存入list
boolean hasMoreLines;
do{
hasMoreLines = false;
for (int i = 0; i < inputString.length(); i++) {
if (inputString.charAt(i)=='\n') {
hasMoreLines = true;
if (i != 0)
lineLexicalAnalyse(inputString.substring(0,i), line);
start++;
if (i != inputString.length()-1) {
inputString = inputString.substring(i+1);
line++;
}
else
inputString = "";
break;
}
}
if (hasMoreLines == false)
lineLexicalAnalyse(inputString, line);
}while (hasMoreLines == true);
//以下為找出滿足注釋條件的部分
boolean checkComments;
boolean isComment = false;
int cBegin = -1;//注釋開(kāi)始位置
int cEnd = -1;//注釋結(jié)束位置
do{
checkComments = false;
for (int i = 0; i < list.size(); i++) {
//判斷是否注釋開(kāi)始
if (isComment == false && i < list.size()-1 && list.get(i).token.equals("/")) {
if (list.get(i+1).token.equals("*")) {
isComment = true;
cBegin = i;//注釋開(kāi)始位置
}
else if (list.get(i+1).token.equals("/")) {
int commentLine = list.get(i).lineNo;
for (int j = i; j < list.size(); j++) {
if (list.get(j).lineNo == commentLine) {
list.remove(j);
j--;
}
else break;
}
}
}
//判斷是否注釋結(jié)束
if (isComment == true && i-cBegin>2 &&
list.get(i).token.equals("/") &&
list.get(i-1).token.equals("*")) {
cEnd = i;//注釋結(jié)束位置
for (int j = 0; j < cEnd - cBegin + 1; j++)
list.remove(cBegin);
isComment = false;
checkComments = true;
break;
}
}
}while (checkComments == true);
//注釋未結(jié)束
if (isComment == true) {
commentNotEnd = true;
commentLastAt = cBegin;
}
else {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).type == CMMSP) {
list.remove(i);
i--;
}
else if (list.get(i).type == CMME) {
wrongNamed = true;
break;
}
}
}
}
//分析單行
private void lineLexicalAnalyse(String str, int line){
//轉(zhuǎn)換Tab為空格
str = str.replace('\t', ' ');
StringTokenizer strT = new StringTokenizer(str, " +-*/=<>();{}[],", true);
while (strT.hasMoreTokens()) {
Tokens newToken = new Tokens();
//存儲(chǔ)Token
String strTTemp = strT.nextToken();
newToken.token = strTTemp;
newToken.lineNo = line;
//以下為識(shí)別過(guò)程
//Token為空格
if (strTTemp.equals(" ")) {
newToken.type = CMMSP;
newToken.start = start;
start++;
newToken.end = start;
list.add(newToken);
}
else if (strTTemp.contains(".")) {
newToken.type = CMME;
newToken.start = start;
start += strTTemp.length();
newToken.end = start;
list.add(newToken);
}
else {
//檢查是否數(shù)字
try {
Integer.parseInt(strTTemp);
newToken.type = CMMN;
newToken.start = start;
start += strTTemp.length();
newToken.end = start;
list.add(newToken);
}
//非數(shù)字情況
catch(Exception e) {
//檢查是否符號(hào)
if (strTTemp.equals("+") || strTTemp.equals("-") || strTTemp.equals("*") ||
strTTemp.equals("/") || strTTemp.equals("=") || strTTemp.equals("(") ||
strTTemp.equals(")") || strTTemp.equals(";") || strTTemp.equals("{") ||
strTTemp.equals("}") || strTTemp.equals("<") || strTTemp.equals(">") ||
strTTemp.equals("[") || strTTemp.equals("]") || strTTemp.equals(",")) {
if (list.size()>0 && strTTemp.equals("=") &&
list.get(list.size()-1).token.equals("=")) {
newToken.token = "==";
newToken.type = CMMS;
newToken.start = start-1;
start++;
newToken.end = start;
list.set(list.size()-1, newToken);
}
else if (list.size()>0 && strTTemp.equals(">") &&
list.get(list.size()-1).token.equals("<")){
newToken.token = "<>";
newToken.type = CMMS;
newToken.start = start-1;
start++;
newToken.end = start;
list.set(list.size()-1, newToken);
}
else {
newToken.type = CMMS;
newToken.start = start;
start++;
newToken.end = start;
list.add(newToken);
}
}
//檢查是否保留字
else if ("if".equals(strTTemp) || "else".equals(strTTemp) ||
"while".equals(strTTemp) || "read".equals(strTTemp) ||
"write".equals(strTTemp) || "int".equals(strTTemp) ||
"real".equals(strTTemp)) {
newToken.type = CMMK;
newToken.start = start;
start += strTTemp.length();
newToken.end = start;
list.add(newToken);
}
else {
//檢查是否滿足標(biāo)志符命名規(guī)則
boolean isIndentifier = true;
if (Character.isDigit(strTTemp.charAt(0)) ||
strTTemp.charAt(strTTemp.length()-1)=='_')
isIndentifier = false;
if (isIndentifier)
for (int i = 0; i < strTTemp.length(); i++){
if( !( isLetter(strTTemp.charAt(i)) ||
Character.isDigit(strTTemp.charAt(i)) ||
strTTemp.charAt(i)=='_' ) ) {
isIndentifier = false;
break;
}
}
if (isIndentifier == true) { //滿足標(biāo)志符命名規(guī)則
newToken.type = CMMI;
newToken.start = start;
start += strTTemp.length();
newToken.end = start;
list.add(newToken);
}
else { //不滿足標(biāo)志符命名規(guī)則
newToken.type = CMME;
newToken.start = start;
start += strTTemp.length();
newToken.end = start;
list.add(newToken);
}
}
}
}
}
list.add(new Tokens());
}
//判斷是否為字母
private boolean isLetter(char ch) {
if ((ch >= 65 && ch <= 90)||(ch >= 97 && ch <= 122))
return true;
else
return false;
}
//詞法分析輸出內(nèi)容
public ArrayList<String> toArrayList() {
ArrayList<String> toArrayList = new ArrayList<String>();
if (commentNotEnd == true) {
toArrayList.add(" 注釋未結(jié)束 #" + commentLastAt);
tokenStart.add(list.get(commentLastAt).start);
tokenEnd.add(list.get(commentLastAt+1).end);
return toArrayList;
}
if (wrongNamed == true) {
toArrayList.add("出現(xiàn)錯(cuò)誤內(nèi)容:");
tokenStart.add(-2);
tokenEnd.add(-2);
for (Tokens value: list)
if (value.type == CMME) {
toArrayList.add(" " + value.token + " #" + value.lineNo);
tokenStart.add(value.start);
tokenEnd.add(value.end);
}
return toArrayList;
}
String[] array = {"保留字","數(shù)字","符號(hào)","標(biāo)識(shí)符"};
//按照行進(jìn)行輸出
int lineNo = 0;
for (Tokens value: list)
if (value.type != CMMSP) {
if (value.lineNo != lineNo) {
lineNo = value.lineNo;
toArrayList.add("第" + lineNo + "行:");
tokenStart.add(-2);
tokenEnd.add(-2);
}
toArrayList.add(" " + value.token + " ---------- " +
array[value.type-1] + " #" + value.lineNo);
tokenStart.add(value.start);
tokenEnd.add(value.end);
}
return toArrayList;
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -