package me.august.lumen.compile.parser;
import me.august.lumen.compile.parser.ast.expr.Expression;
import me.august.lumen.compile.resolve.type.UnresolvedType;
import me.august.lumen.compile.scanner.Token;
import me.august.lumen.compile.scanner.Type;
public interface TokenParser {
default Expression parseExpression() {
return parseExpression(0);
}
Expression parseExpression(int precedence);
Token consume();
Token peek();
boolean accept(Type type);
boolean expect(Type type);
default UnresolvedType nextUnresolvedType() {
String identifier = consume().expectType(Type.IDENTIFIER).getContent();
int dimensions = 0;
while (accept(Type.L_BRACKET)) {
consume().expectType(Type.R_BRACKET);
dimensions++;
}
return new UnresolvedType(identifier, dimensions);
}
default String expectIdentifier() {
Token token = consume();
if (token.getType() != Type.IDENTIFIER) {
throw new RuntimeException("Expected identifier");
}
return token.getContent();
}
}