#pragma once

#include <iostream>
#include <sstream>
#include <regex>
#include <nlohmann/json.hpp>
#include <memory>

struct Token {
    const char* tokenName;
    const char* recognizer;
};

class Lexer {
    public:
        Lexer(std::string stream) : m_stream(stream), m_currentLineNumber(0) {}

        std::shared_ptr<nlohmann::json> tokenize();
    private:
        std::shared_ptr<nlohmann::json> grabToken(std::shared_ptr<nlohmann::json>&& tokens);
        void discardWhitespace();

        std::string m_stream;
        uint32_t m_currentLineNumber;
};

