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

📄 wordanalysis.java

📁 一个实现了pascal语法的词法分析器
💻 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 + -