?? wordanalysis.java
字號:
/*
* Created on 2006-4-3
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package wordmachine;
import java.util.Vector;
import java.io.*;
/**
* @author Tang Qin;
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class WordAnalysis {
static String inLine = null; //從文件讀入的一行字符串;
static int currPointer = 0; //當前要讀入的字符的指針;
static char currChar = ' ';
static String strToken = ""; //識別出的單個單詞;
static String[] resWord = {"ID","VAR","BEGIN","END","INT","IF", //保留字表;
"THEN","ELSE","WHILE","DO","PROCEDURE"};
static boolean error = false;
static Vector tokenVector = new Vector();
static int lineNO = 0;
public static void main(String[] args)
{
File sourceFile;
BufferedReader source;
try{
InputStreamReader din = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(din);
System.out.print("請輸入源文件路徑:\n");
sourceFile = new File(in.readLine());
source = new BufferedReader(new FileReader(sourceFile)); //建立源文件輸入流;
inLine = source.readLine();
WordAnalysis wordAnalysis = new WordAnalysis();
//總控制流程,以每行為單位輸入字符串,并對其進行處理
while(inLine!=null)
{
//System.out.println(lineNO+":"+inLine+" length:"+inLine.length());
currPointer = 0; //將指針指向第一個
while(currPointer < inLine.length())
{ //從中識別出單個單詞的總控制方法,并將得出的單詞及其屬性的相關信息做成一個節點,插入鏈表。
strToken = "";
wordAnalysis.getWord();
}
inLine = source.readLine();
lineNO += 1;
}
if(!error)
{
System.out.println("請輸入輸出的XML文件路徑:");
WriteXml writexml = new WriteXml(in.readLine());
int i;
for(i=0;i<tokenVector.size();i++)
{
Token temp;
temp = (Token)tokenVector.elementAt(i);
writexml.toWrite(temp.lineNO,temp.token,temp.type);
}
writexml.toSave();
}
}
catch(Exception E)
{
E.printStackTrace();
}
}
//********從中識別出單個單詞的總控制方法,并將得出的單詞及其屬性的相關信息做成一個節點,插入鏈表,在每讀入一個字符之前都要先判斷是否是否越界;且此方法調用完后應指向下一個單詞的開始點******
public void getWord()
{
int code;
getChar();
getBC(); //每一行的最后一個字符一定不是是回車符,若是空隔符,則說明是最后一個;
if(Character.isLetter(currChar))
{
while(Character.isLetterOrDigit(currChar))
{
strToken = strToken.concat(String.valueOf(currChar));
if(currPointer >= inLine.length())
break;
getChar();
} //退出情況有兩種,1:一行處理完畢;2:碰到非字母與數字;
if(!Character.isLetterOrDigit(currChar)) //若是應為非字母與數字退出,就要回溯;
retract();
code = reserve(strToken); //返回關鍵字或標識符的編碼;
insertWord(strToken,resWord[code],lineNO);
}
else if(Character.isDigit(currChar))
{
while(Character.isDigit(currChar))
{
strToken = strToken.concat(String.valueOf(currChar));
if(currPointer >= inLine.length())
break;
getChar();
}
if(!Character.isDigit(currChar))
retract();
insertWord(strToken,"CONST",lineNO);
}
else switch(currChar)
{
case ':' :
{
if(currPointer<inLine.length())
{
getChar();
if(currChar=='=')
insertWord(":=","ASSIGN",lineNO);
else
{
retract();
insertWord(":","COLON",lineNO);
}
}
else
{
insertWord(":","COLON",lineNO);
}
} break;
case ',' :
{
insertWord(",","COMMA",lineNO);
} break;
case ';' :
{
insertWord(";","SEMI",lineNO);
} break;
case '(' :
{
insertWord("(","LPAREN",lineNO);
} break;
case ')' :
{
insertWord(")","RPAREN",lineNO);
} break;
case '+' :
{
insertWord("+","PLUS",lineNO);
} break;
case '-' :
{
insertWord("-","MINUS",lineNO);
} break;
case '*' :
{
insertWord("*","MULTIPLY",lineNO);
} break;
case '/' :
{
insertWord("/","DEVISION",lineNO);
} break;
case '>' :
{
if(currPointer<inLine.length())
{
getChar();
if(currChar=='=')
insertWord(">=","GOREQUAL",lineNO);
else
{
retract();
insertWord(">","GREATER",lineNO);
}
}
else
{
insertWord(">","GREATER",lineNO);
}
} break;
case '<' :
{
if(currPointer<inLine.length())
{
getChar();
if(currChar=='=')
insertWord("<=","LOREQUAL",lineNO);
else
{
retract();
insertWord("<","LOWER",lineNO);
}
}
else
{
insertWord("<","LOWER",lineNO);
}
} break;
case '=' :
{
if(currPointer<inLine.length())
{
getChar();
if(currChar=='=')
insertWord("==","EQUAL",lineNO);
else
{
retract();
errorHandle("=",lineNO);
}
}
else
{
errorHandle("=",lineNO);
}
} break;
case ' ' : ; break;
case '\t': ; break;
default : errorHandle(String.valueOf(currChar),lineNO);
}
}
//***************單個單詞獲取完畢*********************************************************************************************************************************************************
//***************獲取當前前指針所指向的字符**************************************************************
public void getChar()
{
currChar = inLine.charAt(currPointer ); //獲取當前指針指向的字符;
currPointer += 1; //將指針向前加1;
}
//**************獲取當前字符處理完畢******************************************************************
//**************返回所取得的單詞的編碼,若為保留字,則返回它的編碼,否則返回0,0不是保留字的編碼******
public int reserve(String t_strToken)
{
int code = 0;
int i = 1 ;
for(i = 1;i < resWord.length;i++ )
{
if (resWord[i].equals(t_strToken))
{
code = i;
break;
//System.out.print(resWord[i]);
}
// System.out.println("code:"+code+" token="+t_strToken);
// System.out.println("length==="+resWord.length);
}
return code;
}
//*****************單個單詞編碼返回完畢***************************************************************
//*****************將搜索指示器向回移動一個位置,回溯;并將currChar置為' '****************************
public void retract()
{
currPointer -= 1;
currChar = ' ';
}
//*****************回溯處理完畢************************************************************************
//*****************屏蔽每個單詞開始之前的空格**********************************************************
public void getBC()
{
while(currChar == ' '||currChar == '\t')
{
if(currPointer>=inLine.length())
return;
getChar();
}
}
//*****************空格符屏蔽完畢**********************************************************************
//*****************將識別出的單詞,及其類型的相關信息形成一個節點,并插入Vector中;********************
public void insertWord(String t_strToken,String t_type,int t_lineNO)
{
Token token = new Token(t_lineNO,t_type,t_strToken);
tokenVector.addElement(token);
}
//*****************插入單詞處理完畢******************************************************************
//*****************出錯處理**************************************************************************
public void errorHandle(String t_strToken,int t_lineNO)
{
System.out.println("\nERROR:in Line "+t_lineNO+" "+t_strToken+" is not legal!!!!!!");
error = true;
}
//*****************出錯處理完畢**********************************************************************
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -