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

📄 sp_scanner.java

📁 JAVA编程实现用于处理表达式的简单编译器
💻 JAVA
字号:
import  java.util.*;

/**
 * 词法分析器 
 *     
 * @author  林玉东.烟台
 * @version 1.0 11/01 2003 
 */  
public class SP_Scanner  implements SP_Const
{
	//
	private char[]     input;         //将输入缓存为数组
	private int        lp;            //处理指针
	private boolean    hasBackSapce;  //退格处理
	public  int        curWordType;   //当前读取的单词的类型,设置为public可以
    public  String     curWordValue;  //当前读取的单词的字符串

	private SP_SimpleParseUI impl;  //与实际应用接口引用

	//
	public SP_Scanner(SP_SimpleParseUI impl)
	{
		init();
		this.impl=impl;
	}
	public void init() //用于多次分析
	{
		input=null;
		lp=0;
		hasBackSapce=false;
		curWordType=WT_NULL;
		curWordValue=null;
	}
	public void setScanExpress(String in)
	{
		//System.out.println("expess========"+in);
		init();
		input=in.toCharArray();
	}

	//
	public boolean hasMoreWord()
	{
		return lp<input.length;
	}
	//
	public void backSpace()
	{
		hasBackSapce=true;
	}
	//读入一个单词 一般多命名为gettoken()
	public void readOneWord()
		throws Exception
	{
		if(hasBackSapce){
			hasBackSapce=false;
			return;
		}
		if(lp>=input.length)
			return;

		int len=input.length;
		curWordType=WT_NULL;
		curWordValue=null;
		//跳过空格等
		while(input[lp]==' '||input[lp]=='\t'||input[lp]=='\n'){
			lp++;
			if(lp==len)
				return;
		}
		//读取标志符/保留字单词
		if(Character.isLetter(input[lp])){
			int st=lp; 
			lp++;
			while(lp<len && Character.isLetterOrDigit(input[lp])) {
				lp++;
			}
			curWordValue=new String(input,st,lp-st);
			if(impl.isUserFunction(curWordValue) && input[lp]=='(')
				curWordType=WT_UserFunction;
			else if(SP_Function.isSysFunction(curWordValue) && input[lp]=='(')
				curWordType=WT_SysFunction;
			else if(impl.isVariable(curWordValue))
				curWordType=WT_Variable;
			else if(WT_ReservedWord.isReservedWord(curWordValue))
				curWordType=WT_ReservedWord.getType(curWordValue);
			else
				throw new Exception("存在非法字符串:"+curWordValue+" !");
		}
		//读取数字常数单词(整数/浮点...)
		else if(Character.isDigit(input[lp])){
			int st=lp; 
			boolean isFloat=false;
			lp++;
			while(lp<len && (Character.isDigit(input[lp]) || input[lp]=='.')){
				if(input[lp]=='.')
					isFloat=true;
				lp++;
			}
			curWordValue=new String(input,st,lp-st);
			if(isFloat)
				curWordType=WT_FloatConst;
			else
				curWordType=WT_IntegerConst;
		}
		//读取字符串常数单词
		else if(_isStringStartToken(input[lp])) {
			char endc=_getStringEndToken(input[lp]);
			lp++;
			int st=lp; 
			while(lp<len && input[lp]!=endc){
				lp++;
				if(lp==len)
					throw new Exception("缺小"+endc+"!");
			}
			curWordValue=new String(input,st,lp-st);
			curWordType=WT_StringConst;
			lp++; //消耗掉"/'/]
		} 
		//读取界符/运算符单词  一符一种
		else switch(input[lp])
		{
			case ',':
				lp++;
				curWordType=WT_COMMA;
				break;
			case ';':
				lp++;
				curWordType=WT_SEMICOLON;
				break;
			case ':':
				lp++;
				curWordType=WT_COLON;
				break;
			case '[':
				lp++;
				curWordType=WT_LBRACK;
				break;
			case ']':
				lp++;
				curWordType=WT_RBRACK;
				break;
			case '(':
				lp++;
				curWordType=WT_LPAREN;
				break;
			case ')':
				lp++;
				curWordType=WT_RPAREN;
				break;
			case '+':
				lp++;
				curWordType=WT_PLUS;
				break;
			case '-':
				lp++;
				curWordType=WT_MINUS;
				break;
			case '*':
				lp++;
				curWordType=WT_TIMES;
				break;
			case '/':
				lp++;
				curWordType=WT_DIVIDE;
				break;
			case '%':
				lp++;
				curWordType=WT_MOD;
				break;
			case '=':
				lp++;
				if(input[lp]=='='){
					curWordType=WT_EQL;
					lp++;
				}
				else{
					curWordType=WT_BECOME;
				}
				break;
			case '>':
				lp++;
				if(input[lp]=='='){
					curWordType=WT_GEQ;
					lp++;
				}
				else{
					curWordType=WT_GTR;
				}
				break;
			case '<':
				lp++;
				if(input[lp]=='='){
					curWordType=WT_LEQ;
					lp++;
				}
				else{
					curWordType=WT_LSS;
				}
				break;
			case '!':
				lp++;
				if(input[lp]=='='){
					curWordType=WT_NEQ;
					lp++;
				}
				else{
					curWordType=WT_R_NOT;
				}
				break;
			case '&':
				lp++;
				if(input[lp]=='&'){
					curWordType=WT_R_AND;
					lp++;
				}
				else{
					curWordType=WT_B_AND;
				}
				break;
			case '|':
				lp++;
				if(input[lp]=='|'){
					curWordType=WT_R_OR;
					lp++;
				}
				else{
					curWordType=WT_B_OR;
				}
				break;
			
			default:
				throw new Exception("存在非法字符->"+input[lp]);
		}

		//System.out.println("========"+curWordType+":"+curWordValue);
	}

    //对字符常数的特别处理  内部方法  _**(
    private boolean _isStringStartToken(char c)
	{
		if(c=='\"' || c=='\'' || c=='[')  //'\'' javascript有这种类型
			return true;
		else
			return false;
	}
	private char _getStringEndToken(char c)
	{
		if(c=='\"')
			return '\"';
		else if(c=='\'')
			return '\'';
		else
			return ']';
	}

}

⌨️ 快捷键说明

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