📄 parser.java
字号:
}
}
else if(token.getType()==TokenType.GE){
if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
throw new exceptions.TypeMismatchedException();//type smatch
}
int ret=0;
//System.out.println("ge: "+(boolean)(tmpexp[1].getValue()>tmpexp[0].getValue()));
if(tmpexp[1].getValue()>=tmpexp[0].getValue())
ret=1;
Expression expr=new Expression("E",ret,ret,ret,TokenType.BOOL);
stack[top-3]=expr;
top-=2;
}
else{
throw new exceptions.MissingOperandException();
}
}
else if(token.getType()==TokenType.LE){
if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
throw new exceptions.TypeMismatchedException();//type smatch
}
int ret=0;
//System.out.println("le: "+(boolean)(tmpexp[1].getValue()>tmpexp[0].getValue()));
if(tmpexp[1].getValue()<=tmpexp[0].getValue())
ret=1;
Expression expr=new Expression("E",ret,ret,ret,TokenType.BOOL);
stack[top-3]=expr;
top-=2;
}
else{
throw new exceptions.MissingOperandException();
}
}
else if(token.getType()==TokenType.NEQUAL){
if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
throw new exceptions.TypeMismatchedException();///type smatch
}
int ret=0;
//System.out.println("ne: "+(boolean)(tmpexp[1].getValue()>tmpexp[0].getValue()));
if(tmpexp[1].getValue()!=tmpexp[0].getValue())
ret=1;
Expression expr=new Expression("E",ret,ret,ret,TokenType.BOOL);
stack[top-3]=expr;
top-=2;
}
else{
throw new exceptions.MissingOperandException();
}
}
else if(token.getType()==TokenType.EQUAL){
if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
throw new exceptions.TypeMismatchedException();///type smatch
}
int ret=0;
//System.out.println("ne: "+(boolean)(tmpexp[1].getValue()>tmpexp[0].getValue()));
if(tmpexp[1].getValue()==tmpexp[0].getValue())
ret=1;
Expression expr=new Expression("E",ret,ret,ret,TokenType.BOOL);
stack[top-3]=expr;
top-=2;
}
else{
throw new exceptions.MissingOperandException();
}
}
else if(token.getType()==TokenType.COMMA){
if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.NUMBER||(tmpexp[1].getType()!=TokenType.NUMBER&&tmpexp[1].getType()!=TokenType.COMMA)){
throw new exceptions.TypeMismatchedException();//type smatch
}
double ret1=tmpexp[0].getMax();
double ret2=tmpexp[0].getMin();
//System.out.println("comma: ");
if(tmpexp[1].getMax()>ret1)
ret1=tmpexp[1].getMax();//max
if(tmpexp[1].getMin()<ret2)
ret2=tmpexp[1].getMin();//min
Expression expr=new Expression("E",ret1,ret1,ret2,TokenType.COMMA);
stack[top-3]=expr;
top-=2;
}
else{
throw new exceptions.MissingOperandException();
}
}
else if(token.getType()==TokenType.MAX){
if(top>2&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.COMMA){
throw new exceptions.MissingOperandException();//type smatch
}
//System.out.println("max: ");
Expression expr=new Expression("E",tmpexp[0].getMax(),tmpexp[0].getMax(),tmpexp[0].getMax(),TokenType.NUMBER);
stack[top-2]=expr;
top-=1;
}
else{
throw new exceptions.FunctionCallException();
}
}
else if(token.getType()==TokenType.MIN){
if(top>2&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.COMMA){
throw new exceptions.MissingOperandException();
}
//System.out.println("min: "+tmpexp[0].getMin());
Expression expr=new Expression("E",tmpexp[0].getMin(),tmpexp[0].getMin(),tmpexp[0].getMin(),TokenType.NUMBER);
stack[top-2]=expr;
top-=1;
}
else{
throw new exceptions.FunctionCallException();
}
}
else if(token.getType()==TokenType.SIN){
if(top>2&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.NUMBER&&tmpexp[0].getType()!=TokenType.COMMA){
throw new exceptions.TypeMismatchedException();//type smatch
}
if(tmpexp[0].getType()==TokenType.COMMA){
throw new exceptions.FunctionCallException();//type smatch
}
//System.out.println("sin: ");
double ret=Math.sin(tmpexp[0].getValue());
Expression expr=new Expression("E",ret,ret,ret,TokenType.NUMBER);
stack[top-2]=expr;
top-=1;
}
else{
throw new exceptions.FunctionCallException();
}
}
else if(token.getType()==TokenType.COS){
if(top>2&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))){
if(tmpexp[0].getType()!=TokenType.NUMBER&&tmpexp[0].getType()!=TokenType.COMMA){
throw new exceptions.TypeMismatchedException();//type smatch
}
if(tmpexp[0].getType()==TokenType.COMMA){
throw new exceptions.FunctionCallException();//type smatch
}
//System.out.println("cos: ");
double ret=Math.cos(tmpexp[0].getValue());
Expression expr=new Expression("E",ret,ret,ret,TokenType.NUMBER);
stack[top-2]=expr;
top-=1;
}
else{
throw new exceptions.FunctionCallException();
}
}
else if(token.getType()==TokenType.COLON){
if(top>5&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))
&&(stack[top-3].getName().equals("E"))&&(!stack[top-4].getName().equals("E"))
&&(stack[top-5].getName().equals("E"))){
if(((Token)stack[top-4]).getType()!=TokenType.QMARK){
throw new exceptions.TrinaryOperationException();//no colon match
}
if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER||
tmpexp[2].getType()!=TokenType.BOOL){
throw new exceptions.TypeMismatchedException();//type smatch
}
//System.out.println("?: ");
double ret=tmpexp[0].getValue();
if(tmpexp[2].getValue()>0){
ret=tmpexp[1].getValue();
}
Expression expr=new Expression("E",ret,ret,ret,TokenType.NUMBER);
stack[top-5]=expr;
top-=4;
}
else{
throw new exceptions.TrinaryOperationException();
}
}
}
/**
* parse
* @param input input string
* @throws IOException
* @throws ExpressionException
*/
private void parse(String input) throws IOException,ExpressionException
{
stack=new Symbol[100];
top=1;
Token t=new Token("",0,-1,TokenType.getPriority(-1));
boolean flag=true;
scanner=new Scanner(input);
stack[0]=t;
while(true)
{
if(flag){
lookahead=scanner.getNextToken();
// System.out.println("get: "+lookahead.getType());///////////
}
Token tmptoken=(Token)(stack[getTop()]);
if(((Token)stack[getTop()]).getType()==TokenType.END&&lookahead.getType()==TokenType.END){
accept();
return;
}
else if(parserTable.isError(tmptoken.getType(), lookahead.getType())){
throw parserTable.getError(tmptoken.getType(), lookahead.getType());
}
/*
else if(tmptoken.getPriority()==lookahead.getPriority()){
if(TokenType.isLeft(tmptoken.getType())){
stack[top++]=lookahead;
System.out.println("in stack:"+lookahead.getType());////////
flag=true;
}
else{
flag=true;
System.out.print("reduced1:");//////////
while(!TokenType.isShift(((Token)stack[getTop()]).getType(),lookahead.getType())){
reduce();
if(parserTable.isError(((Token)stack[getTop()]).getType(), lookahead.getType())){
throw parserTable.getError(((Token)stack[getTop()]).getType(), lookahead.getType());
}
if(((Token)stack[getTop()]).getType()==TokenType.END&&lookahead.getType()==TokenType.END){
accept();
return;
}
}
stack[top++]=lookahead;
System.out.println("in stack:"+lookahead.getType());///////
}
}
*/
else if(parserTable.isShift(((Token)stack[getTop()]).getType(),lookahead.getType())){
flag=true;
stack[top++]=lookahead;
//System.out.println("in stack:"+lookahead.getType());///////
}
else if(!parserTable.isShift(((Token)stack[getTop()]).getType(),lookahead.getType())){
flag=true;
while(!parserTable.isShift(((Token)stack[getTop()]).getType(),lookahead.getType())){
//System.out.println("reduced2.1:"+((Token)stack[getTop()]).getType()+" "+lookahead.getType());//////////
reduce();
if(parserTable.isError(((Token)stack[getTop()]).getType(), lookahead.getType())){
throw parserTable.getError(((Token)stack[getTop()]).getType(), lookahead.getType());
}
if(((Token)stack[getTop()]).getType()==TokenType.END&&lookahead.getType()==TokenType.END){
accept();
return;
}
}
stack[top++]=lookahead;
//System.out.println("in stack:"+lookahead.getType());///////
}
}
}
/**
* calculate an expression
* @param string input string
* @return result of expression
* @throws IOException
* @throws ExpressionException
*/
public double calculate(String string) throws IOException,ExpressionException
{
parse(string);
System.out.println(fin.getValue());
if(fin.getType()==TokenType.BOOL)
throw new exceptions.TypeMismatchedException();
return fin.getValue();
}
static public void main(String []args) throws IOException,Exception
{
Parser a=new Parser();
a.calculate("max(5,8)=sin(2)?5:cos(5)<1?5+3:-4");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -