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