📄 新建 文本文档.txt
字号:
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.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){
throw new exceptions.TypeMismatchedException();//type smatch
}
double ret1=tmpexp[0].getValue();
double ret2=tmpexp[0].getValue();
System.out.println("comma: ");
if(tmpexp[1].getValue()>tmpexp[0].getValue())
ret1=tmpexp[1].getValue();//max
if(tmpexp[1].getValue()<tmpexp[0].getValue())
ret2=tmpexp[1].getValue();//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.FunctionCallException();//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.FunctionCallException();//type smatch
}
System.out.println("min: ");
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();
}
}
}
public void parse(String input) throws IOException,Exception
{
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.get();
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(((Token)stack[getTop()]).getPriority()<lookahead.getPriority()
||(((Token)stack[getTop()]).getPriority()==lookahead.getPriority()&&!TokenType.isLeft(((Token)stack[getTop()]).getType()))
&&TokenType.isLeft(((Token)stack[getTop()]).getPriority())
||lookahead.getType()==TokenType.RBRACKET){
reduce();
if(parserTable.isError(((Token)stack[getTop()]).getType(), lookahead.getType())){
throw parserTable.getError(((Token)stack[getTop()]).getType(), lookahead.getType());
}
}
stack[top++]=lookahead;
System.out.println("in stack:"+lookahead.getType());///////
}
}
else if(lookahead.getType()!=TokenType.RBRACKET&&tmptoken.getPriority()>lookahead.getPriority()||lookahead.getType()==TokenType.LBRACKET){
flag=true;
stack[top++]=lookahead;
System.out.println("in stack:"+lookahead.getType());///////
}
else if(tmptoken.getPriority()<lookahead.getPriority()||lookahead.getType()==TokenType.RBRACKET){
flag=true;
while(((Token)stack[getTop()]).getPriority()<lookahead.getPriority()
||(((Token)stack[getTop()]).getPriority()==lookahead.getPriority()&&!TokenType.isLeft(((Token)stack[getTop()]).getType()))
&&TokenType.isLeft(((Token)stack[getTop()]).getPriority())
||lookahead.getType()==TokenType.RBRACKET&&((Token)stack[getTop()]).getType()!=TokenType.LBRACKET){
//System.out.println(((Token)stack[getTop()]).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());
}
}
stack[top++]=lookahead;
System.out.println("in stack:"+lookahead.getType());///////
}
}
}
public void calculate(String string) throws IOException,Exception
{
parse(string);
System.out.println(fin.getValue());
}
static public void main(String []args) throws IOException,Exception
{
Parser a=new Parser();
a.calculate(" ");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -