#include "discardparser.hpp"

#include "scanner.hpp"

namespace Compiler
{
    DiscardParser::DiscardParser(ErrorHandler& errorHandler, const Context& context)
        : Parser(errorHandler, context)
        , mState(StartState)
    {
    }

    bool DiscardParser::parseInt(int value, const TokenLoc& loc, Scanner& scanner)
    {
        if (mState == StartState || mState == MinusState)
        {
            if (isEmpty())
                mTokenLoc = loc;

            start();
            return false;
        }

        return Parser::parseInt(value, loc, scanner);
    }

    bool DiscardParser::parseFloat(float value, const TokenLoc& loc, Scanner& scanner)
    {
        if (mState == StartState || mState == MinusState)
        {
            if (isEmpty())
                mTokenLoc = loc;

            start();
            return false;
        }

        return Parser::parseFloat(value, loc, scanner);
    }

    bool DiscardParser::parseName(const std::string& name, const TokenLoc& loc, Scanner& scanner)
    {
        if (mState == StartState)
        {
            if (isEmpty())
                mTokenLoc = loc;

            start();
            return false;
        }

        return Parser::parseName(name, loc, scanner);
    }

    bool DiscardParser::parseSpecial(int code, const TokenLoc& loc, Scanner& scanner)
    {
        if (code == Scanner::S_minus && mState == StartState)
        {
            if (isEmpty())
                mTokenLoc = loc;

            start();

            mState = MinusState;
            return true;
        }

        return Parser::parseSpecial(code, loc, scanner);
    }

    void DiscardParser::reset()
    {
        mState = StartState;
        mTokenLoc = TokenLoc();
        Parser::reset();
    }

    const TokenLoc& DiscardParser::getTokenLoc() const
    {
        return mTokenLoc;
    }
}
