📄 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 + -