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

📄 scanner.java

📁 实验软装置(基于表达式的计算器ExprEval) 很不错的 有帮助于学习提高
💻 JAVA
字号:
package scanner;
import java.io.*;
import exceptions.*;
public class Scanner {


	/**
	 * the input string
	 */
	String stream;
	/**
	 * table for identifier
	 */
	ScannerTable identifier;
	/**
	 * table for relop
	 */
	ScannerTable relop;
	/**
	 * table for logical
	 */
	ScannerTable logical;
	/**
	 * table for arithmetic
	 */
	ScannerTable arith;
	/**
	 * table for number
	 */
	ScannerTable number;
	/**
	 * table for bool
	 */
	ScannerTable bool;
	/**
	 * tmp token
	 */
	Token tmpToken;
	/**
	 * ptr for input stream
	 */
	int pos=0;
	
	/**
	 * reprocess the input string
	 * @throws ExpressionException
	 */
	private void preprocess() throws ExpressionException{
		int i;
		boolean flag=false;
	    String newstr="";
	    String tstr=stream;
	    tstr=tstr.replaceAll(" ", "");
	    if(tstr.equals("$")){
	    	throw new exceptions.EmptyExpressionException();
	    }
		for(i=0;i<stream.length();i++){
			if(stream.charAt(i)==' '){
				if(!flag){
					flag=true;
					newstr+=stream.charAt(i);
				}
				else{
					
				}
			}
			else if(stream.charAt(i)!='#'){
				newstr+=stream.charAt(i);
				flag=false;
			}
			else if(stream.charAt(i)=='#'||i!=stream.length()-1&&stream.charAt(i)=='$'){
				throw new exceptions.IllegalSymbolException();
			}
		}
		stream="";
		for(i=0;i<newstr.length();i++){
			if(newstr.charAt(i)==' '){
			//	if(i>0&&newstr.length()>1&&newstr.charAt(i+1)>='0'&&newstr.charAt(i+1)<='9'&&newstr.charAt(i-1)>='0'&&newstr.charAt(i-1)<='9'){
					stream+='#';
			//	}
				//else{
					
			//	}
			}
			else{
			
				stream+=newstr.charAt(i);
			}
		}
		
	}
	/**
	 * constructor
	 * @param Stream input string
	 * @throws IOException
	 * @throws ExpressionException
	 */
	public Scanner(String Stream) throws IOException,ExpressionException
	{
		stream=Stream+"$";
		preprocess();
		
		stream.replaceAll(" ", "");
		if(stream.equals("$")){
			throw new exceptions.EmptyExpressionException();
		}
		identifier=new ScannerTable("id.txt");
		relop=new ScannerTable("relop.txt");
		logical=new ScannerTable("logical.txt");
		arith=new ScannerTable("arith.txt");
		number=new ScannerTable("number.txt");
		bool=new ScannerTable("bool.txt");
		
	}
	
	/**
	 * get next character
	 * @return next character(omitting blank)
	 * @throws ExpressionException
	 */
	private char getNextChar() throws ExpressionException
	{
		if(pos>=stream.length())
			return '$';
		while(stream.charAt(pos)==' '){
			pos++;
			if(pos>=stream.length())
				return '$';
		}
	
		pos++;
		return stream.charAt(pos-1);
		
	}
	
	/**
	 * get Identifier
	 * @return true if identifier got
	 * @throws ExpressionException
	 */
	private boolean getId() throws ExpressionException
	{
		int tmppos=pos;
		int state=0;
		boolean flag=false;
		while(true){
			char c=getNextChar();
			if(c>='a'&&c<='z'||c>='A'&&c<='Z'){
				flag=true;
			}
			int next=identifier.getState(state, c);
	//		System.out.println(c+" "+next);
			if(next<0)
			{
				pos=tmppos;
				if(flag){
				
					throw new IllegalIdentifierException();
				}
				return false;
			}
			else
				state=next;
			if(identifier.isFinal(state)){
				int input=identifier.getReturn(state);
				tmpToken=new Token("",0,input,TokenType.getPriority(input));
				pos-=identifier.getBackTrack(state);
				return true;
			}
		}
		
	}
	/**
	 * get relop
	 * @return true if relop got
	 * @throws ExpressionException
	 */
	private boolean getRelop() throws ExpressionException
	{
		int tmppos=pos;
		int state=0;
		
		while(true){
			char c=getNextChar();
			int next=relop.getState(state, c);
	//		System.out.println(c+" "+next);
			if(next<0)
			{
				pos=tmppos;
				return false;
			}
			else
				state=next;
			if(relop.isFinal(state)){
				int input=relop.getReturn(state);
				tmpToken=new Token("",0,input,TokenType.getPriority(input));
				pos-=relop.getBackTrack(state);
				return true;
			}
		}
		
	}
	/**
	 * get logical operator
	 * @return true if logical operator got
	 * @throws ExpressionException
	 */
	private boolean getLogic() throws ExpressionException
	{
		int tmppos=pos;
		int state=0;
		
		while(true){
			char c=getNextChar();
			int next=logical.getState(state, c);
		//	System.out.println(c+" "+next);
			if(next<0)
			{
				pos=tmppos;
				return false;
			}
			else
				state=next;
			if(logical.isFinal(state)){
				int input=logical.getReturn(state);
				tmpToken=new Token("",0,input,TokenType.getPriority(input));
				pos-=logical.getBackTrack(state);
				return true;
			}
		}	
	}
	/**
	 * get arithmetic operator
	 * @return true if arithmetic operator got
	 * @throws ExpressionException
	 */
	private boolean getArith() throws ExpressionException
	{
		int tmppos=pos;
		int state=0;
		
		while(true){
			char c=getNextChar();
			int next=arith.getState(state, c);
		//	System.out.println(c+" "+next);
			if(next<0)
			{
				pos=tmppos;
				return false;
			}
			else
				state=next;
			if(arith.isFinal(state)){
				int input=arith.getReturn(state);
				tmpToken=new Token("",0,input,TokenType.getPriority(input));
				pos-=arith.getBackTrack(state);
				return true;
			}
		}
		
	}
	/**
	 * get number
	 * @return true if number got
	 * @throws ExpressionException
	 */
	private boolean getNumber() throws ExpressionException
	{
		int tmppos=pos;
		int state=0;
		
		boolean flag=false;
		while(true){
			char c=getNextChar();
			int next=number.getState(state, c);
		//	System.out.println(c+" "+next);
			if(next<0)
			{
				pos=tmppos;
				if(flag){
					throw new IllegalDecimalException();
				}
				return false;
			}
			else{
				state=next;
				flag=true;
			}
			if(number.isFinal(state)){
				int input=number.getReturn(state);
			//	System.out.println(stream);
			//	System.out.println(tmppos+" "+( pos-1));
				tmpToken=new Token("",Double.parseDouble(stream.substring(tmppos, pos-1)),input,TokenType.getPriority(input));
				pos-=number.getBackTrack(state);
				return true;
			}
		}
		
	}	
	
	/**
	 * get boolean
	 * @return true if boolean got
	 * @throws ExpressionException
	 */
	private boolean getBool() throws ExpressionException
	{
		int tmppos=pos;
		int state=0;
		
		while(true){
			char c=getNextChar();
			int next=bool.getState(state, c);
		//	System.out.println(c+" "+next);
			if(next<0)
			{
				pos=tmppos;
				return false;
			}
			else
				state=next;
			if(bool.isFinal(state)){
				int input=bool.getReturn(state);
				int tmp=1;
				if(stream.charAt(tmppos)=='F'||stream.charAt(tmppos)=='f'){
					tmp=0;
				}
				tmpToken=new Token("",tmp,input,TokenType.getPriority(input));
				pos-=bool.getBackTrack(state);
				return true;
			}
		}
		
	}
	/**
	 * get negative
	 * @return true if negative got
	 * @throws ExpressionException
	 */
	private boolean getNeg() throws ExpressionException
	{
		int tmppos=pos;
		int state=0;
		char c=getNextChar();
		if(c=='-'){
			if(pos==1){
				tmpToken=new Token("",0,6,TokenType.getPriority(6));
				return true;
			}
			else if(stream.charAt(pos-2)=='#'){
				if(pos==2||(stream.charAt(pos-3)!=')'&&('0'>stream.charAt(pos-3)||'9'<stream.charAt(pos-3)))){
					tmpToken=new Token("",0,6,TokenType.getPriority(6));
					return true;			
				}
			}
			else if(stream.charAt(pos-2)!=')'&&('0'>stream.charAt(pos-2)||'9'<stream.charAt(pos-2)))
			{
				
			//	System.out.println(stream.charAt(pos-1));
				tmpToken=new Token("",0,6,TokenType.getPriority(6));
				return true;				
			}
		}
		pos--;
		return false;
	}
	/**
	 * get next token
	 * @return next token
	 * @throws ExpressionException
	 */
	public Token getNextToken() throws ExpressionException
	{
		if(stream.charAt(pos)=='$')
		{
			tmpToken=new Token("",0,-1,TokenType.getPriority(-1));
		//	System.out.println(tmpToken.getType());
			return tmpToken;
		}
		if(stream.charAt(pos)=='#'){
			pos++;
		}
		if(getBool())
		{
		//	System.out.println(tmpToken.getType());
			return tmpToken;
		}
		if(getNumber())
		{
			//System.out.println(tmpToken.getType());
			return tmpToken;
		}
		else if(getNeg()){
		//	System.out.println(tmpToken.getType());
			return tmpToken;
		}
		if(getId())
		{
			//System.out.println(tmpToken.getType());
			return tmpToken;
		}
		else if(getRelop()){
		//	System.out.println(tmpToken.getType());
			return tmpToken;
		}
		else if(getLogic())
		{
		//	System.out.println(tmpToken.getType());
			return tmpToken;
		}
		else if(getArith())
		{
		//	System.out.println(tmpToken.getType());
			return tmpToken;
		}

		throw new exceptions.IllegalSymbolException();
	}
	
	static public void main(String []args) throws IOException,ExpressionException
	{
		Scanner a=new Scanner("max(3,4,5)");
		Token t1=a.getNextToken();
		System.out.println("op1:"+t1.getType()+" "+t1.getValue());
		System.out.println("op2:"+a.getNextToken().getType());
		System.out.println("op3:"+a.getNextToken().getType());
		
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -