package me.august.lumen.compile.parser.components;
import me.august.lumen.compile.parser.TokenParser;
import me.august.lumen.compile.parser.ast.expr.ArrayAccessExpr;
import me.august.lumen.compile.parser.ast.expr.Expression;
import me.august.lumen.compile.parser.ast.expr.IncrementExpr;
import me.august.lumen.compile.scanner.Token;
import me.august.lumen.compile.scanner.Type;
// not really infix, but we can pretend to be
// one and just not parse a right-hand expression.
public class PostfixParser implements InfixParser {
@Override
public Expression parse(TokenParser parser, Expression left, Token token) {
switch (token.getType()) {
case INC:
return new IncrementExpr(left, IncrementExpr.Op.INC, true);
case DEC:
return new IncrementExpr(left, IncrementExpr.Op.DEC, true);
case L_BRACKET:
Expression index = parser.parseExpression();
parser.expect(Type.R_BRACKET);
left = new ArrayAccessExpr(left, index);
while (parser.accept(Type.L_BRACKET)) {
index = parser.parseExpression();
parser.expect(Type.R_BRACKET);
left = new ArrayAccessExpr(left, index);
}
return left;
default:
throw new RuntimeException("Unexpected token: " + token);
}
}
@Override
public int getPrecedence() {
return Precedence.POSTFIX.getLevel();
}
}