#pragma once
#ifndef PARSER_H
#define PARSER_H

#include "JSONLexer.h"
#include "JSONParser.h"
#include "json.h"
#include <deque>
#include <memory>
#include <stdexcept>

namespace json {

class Parser : public JSONParser<JSON> {
    public:
        Parser(JSONLexer lex);


    protected:
        Token lex() override;
        JSON reduce_0(std::deque<Token> subparts) override;
        JSON reduce_1(std::deque<Token> subparts) override;
        JSON reduce_2(std::deque<Token> subparts) override;
        JSON reduce_3(std::deque<Token> subparts) override;
        JSON reduce_4(std::deque<Token> subparts) override;
        JSON reduce_5(std::deque<Token> subparts) override;
        JSON reduce_6(std::deque<Token> subparts) override;
        JSON reduce_7(std::deque<Token> subparts) override;
        JSON reduce_8(std::deque<Token> subparts) override;
        JSON reduce_9(std::deque<Token> subparts) override;
        JSON reduce_10(std::deque<Token> subparts) override;
        JSON reduce_11(std::deque<Token> subparts) override;
        JSON reduce_12(std::deque<Token> subparts) override;
        JSON reduce_13(std::deque<Token> subparts) override;
        JSON reduce_14(std::deque<Token> subparts) override;

    private:
        JSONLexer m_lex;
};

}

#endif