#ifndef LEXER_HPP #define LEXER_HPP #include #include #include #include #include "BaseException.hpp" #include "Token.hpp" namespace Lexer { class Lexer { public: Lexer(); void addNamespaceInput(const std::string & ns, const std::string & input); void setKeyWords(const std::unordered_map & new_keywords); std::vector tokenizeNamespace(const std::string & ns); std::vector getTokens(const std::string & ns) const; class Exception : public BaseException { public: using BaseException::BaseException; Exception(const std::string & msg) { rawMessage_ = msg; context_ = ""; } std::string formatMessage() const override { return "[LEXER ERROR]: " + rawMessage_; } }; private: std::unordered_map inputs_; std::unordered_map> tokens_; std::unordered_map positions_; std::unordered_map line_numbers_; std::unordered_map column_numbers_; std::unordered_map keywords; std::string operators_; Tokens::Token nextToken(); const std::string & input() const; size_t & pos(); int & line(); int & col(); char peek(size_t offset = 0) const; char advance(); bool isAtEnd() const; void skipWhitespaceAndComments(); static bool matchFromVector(const std::vector & vec, const std::string & value); Tokens::Token createToken(Tokens::Type type, size_t start, size_t end, const std::string & value = ""); Tokens::Token matchIdentifierOrKeyword(size_t start_pos, Tokens::Type type = Tokens::Type::IDENTIFIER); Tokens::Token matchNumber(size_t start_pos); Tokens::Token matchStringLiteral(size_t start_pos); Tokens::Token matchOperatorOrPunctuation(size_t start_pos); }; // class Lexer }; // namespace Lexer #endif // LEXER_HPP