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.ShiftExpr;
import me.august.lumen.compile.scanner.Token;
import me.august.lumen.compile.scanner.Type;
public class ShiftParser implements InfixParser {
@Override
public Expression parse(TokenParser parser, Expression left, Token token) {
Expression right = parser.parseExpression(getPrecedence());
return new ShiftExpr(left, right, getOperation(token.getType()));
}
@Override
public int getPrecedence() {
return Precedence.SHIFT.getLevel();
}
private ShiftExpr.Op getOperation(Type type) {
switch (type) {
case SH_L: return ShiftExpr.Op.SH_L;
case SH_R: return ShiftExpr.Op.SH_R;
case U_SH_R: return ShiftExpr.Op.U_SH_R;
default: throw new RuntimeException("Unexpected type: " + type);
}
}
}