package me.august.lumen.compile.parser.components;
import me.august.lumen.compile.parser.TokenParser;
import me.august.lumen.compile.parser.ast.expr.Expression;
import me.august.lumen.compile.parser.ast.expr.InstanceofExpr;
import me.august.lumen.compile.parser.ast.expr.NotExpr;
import me.august.lumen.compile.parser.ast.expr.RelExpr;
import me.august.lumen.compile.resolve.type.UnresolvedType;
import me.august.lumen.compile.scanner.Token;
import me.august.lumen.compile.scanner.Type;
public class RelationalParser implements InfixParser {
@Override
public Expression parse(TokenParser parser, Expression left, Token token) {
switch (token.getType()) {
case INSTANCEOF_KEYWORD:
UnresolvedType type = parser.nextUnresolvedType();
return new InstanceofExpr(left, type);
case NOT_INSTANCEOF_KEYWORD:
type = parser.nextUnresolvedType();
return new NotExpr(new InstanceofExpr(left, type));
default:
Expression right = parser.parseExpression(getPrecedence());
RelExpr.Op operator = getOperator(token.getType());
return new RelExpr(left, right, operator);
}
}
@Override
public int getPrecedence() {
return Precedence.RELATIONAL.getLevel();
}
private RelExpr.Op getOperator(Type type) {
switch (type) {
case GT: return RelExpr.Op.GT;
case GTE: return RelExpr.Op.GTE;
case LT: return RelExpr.Op.LT;
case LTE: return RelExpr.Op.LTE;
default: throw new RuntimeException("Unexpected type: " + type);
}
}
}