package me.august.lumen.compile.parser.components;
import me.august.lumen.compile.parser.ast.expr.*;
import me.august.lumen.compile.scanner.Type;
import me.august.lumen.compile.scanner.tokens.NumberToken;
import me.august.lumen.compile.scanner.tokens.StringToken;
public final class ComponentParsers {
public static final PrefixParser NUMBER_PARSER = (parser, token) -> {
if (token.getType() == Type.NUMBER) {
NumberToken numTok = (NumberToken) token;
return new NumExpr(numTok.getValue());
} else {
throw new RuntimeException("Unexpected token: " + token);
}
};
public static final PrefixParser GROUPING_PARSER = (parser, token) -> {
Expression expression = parser.parseExpression();
if (parser.consume().getType() != Type.R_PAREN) {
throw new RuntimeException("Expected right parenthesis");
}
return expression;
};
public static final PrefixParser STRING_PARSER = (parser, token) -> {
StringToken stringTok = (StringToken) token;
return new StringExpr(token.getContent(), stringTok.getQuoteType());
};
public static final PrefixParser BOOLEAN_PARSER = (parser, token) -> {
if (token.getType() == Type.TRUE) {
return new TrueExpr();
} else {
return new FalseExpr();
}
};
public static final PrefixParser NULL_PARSER =
(parser, token) -> new NullExpr();
private ComponentParsers() {}
}