package org.nutz.el.parse;
import org.nutz.el.ElException;
import org.nutz.el.Parse;
import org.nutz.el.opt.arithmetic.LBracketOpt;
import org.nutz.el.opt.arithmetic.ModOpt;
import org.nutz.el.opt.arithmetic.MulOpt;
import org.nutz.el.opt.arithmetic.PlusOpt;
import org.nutz.el.opt.arithmetic.RBracketOpt;
import org.nutz.el.opt.arithmetic.SubOpt;
import org.nutz.el.opt.bit.BitNot;
import org.nutz.el.opt.bit.BitOr;
import org.nutz.el.opt.bit.BitXro;
import org.nutz.el.opt.bit.LeftShift;
import org.nutz.el.opt.bit.RightShift;
import org.nutz.el.opt.bit.UnsignedLeftShift;
import org.nutz.el.opt.logic.AndOpt;
import org.nutz.el.opt.logic.GTEOpt;
import org.nutz.el.opt.logic.GTOpt;
import org.nutz.el.opt.logic.LTEOpt;
import org.nutz.el.opt.logic.LTOpt;
import org.nutz.el.opt.logic.NEQOpt;
import org.nutz.el.opt.logic.NotOpt;
import org.nutz.el.opt.logic.OrOpt;
import org.nutz.el.opt.logic.QuestionOpt;
import org.nutz.el.opt.logic.QuestionSelectOpt;
import org.nutz.el.opt.object.ArrayOpt;
import org.nutz.el.opt.object.CommaOpt;
import org.nutz.el.opt.object.FetchArrayOpt;
import org.nutz.el.opt.arithmetic.DivOpt;
import org.nutz.el.opt.bit.BitAnd;
import org.nutz.el.opt.logic.EQOpt;
import org.nutz.el.opt.object.AccessOpt;
/**
* 操作符转换器
* @author juqkai(juqkai@gmail.com)
*
*/
public class OptParse implements Parse {
public Object fetchItem(CharQueue exp){
switch(exp.peek()){
case '+':
exp.poll();
return new PlusOpt();
case '-':
exp.poll();
return new SubOpt();
case '*':
exp.poll();
return new MulOpt();
case '/':
exp.poll();
return new DivOpt();
case '%':
exp.poll();
return new ModOpt();
case '(':
exp.poll();
return new LBracketOpt();
case ')':
exp.poll();
return new RBracketOpt();
case '>':
exp.poll();
switch(exp.peek()){
case '=':
exp.poll();
return new GTEOpt();
case '>':
exp.poll();
if(exp.peek() == '>'){
exp.poll();
return new UnsignedLeftShift();
}
return new RightShift();
}
return new GTOpt();
case '<':
exp.poll();
switch(exp.peek()){
case '=':
exp.poll();
return new LTEOpt();
case '<':
exp.poll();
return new LeftShift();
}
return new LTOpt();
case '=':
exp.poll();
switch(exp.peek()){
case '=':
exp.poll();
return new EQOpt();
}
throw new ElException("表达式错误,请检查'='后是否有非法字符!");
case '!':
exp.poll();
switch(exp.peek()){
case '=':
exp.poll();
return new NEQOpt();
}
return new NotOpt();
case '|':
exp.poll();
switch(exp.peek()){
case '|':
exp.poll();
return new OrOpt();
}
return new BitOr();
case '&':
exp.poll();
switch(exp.peek()){
case '&':
exp.poll();
return new AndOpt();
}
return new BitAnd();
case '~':
exp.poll();
return new BitNot();
case '^':
exp.poll();
return new BitXro();
case '?':
exp.poll();
return new QuestionOpt();
case ':':
exp.poll();
return new QuestionSelectOpt();
case '.':
if(!Character.isJavaIdentifierStart(exp.peek(1))){
return null;
}
exp.poll();
return new AccessOpt();
case ',':
exp.poll();
return new CommaOpt();
case '[':
exp.poll();
return new Object[]{new ArrayOpt(),new LBracketOpt()};
case ']':
exp.poll();
return new Object[]{new RBracketOpt(), new FetchArrayOpt()};
}
return null;
}
}