module tlang.compiler.parsing.exceptions;

import tlang.compiler.parsing.core;
import misc.exceptions;
import tlang.compiler.symbols.check;
import tlang.compiler.symbols.data;
import tlang.compiler.lexer.core.tokens : Token;
import std.conv : to;

public class ParserException : TError
{
    private Parser parser;

    public enum ParserErrorType
    {
        GENERAL_ERROR,
        LITERAL_OVERFLOW
    }

    this(Parser parser, ParserErrorType errType = ParserErrorType.GENERAL_ERROR, string message = "")
    {
        super("ParserException("~to!(string)(errType)~"): "~message);
        this.parser = parser;
    }
}

public final class SyntaxError : ParserException
{
    private SymbolType expected;
    private SymbolType provided;
    private Token providedToken;

    this(Parser parser, SymbolType expected, Token providedToken)
    {
        this.expected = expected;
        this.provided = getSymbolType(providedToken);
        this.providedToken = providedToken;

        super(parser);

        msg = "Syntax error: Expected "~to!(string)(expected)~" but got "~to!(string)(provided)~", see "~providedToken.toString();
    }
}