#ifndef sk_PARSER_HPP #define sk_PARSER_HPP #include "commons.hpp" #include "Lexer.hpp" namespace sk { SK_ERROR(syntax_error); class Parser { public: explicit Parser(std::shared_ptr lexer, Logger& logger); virtual ~Parser(); std::shared_ptr parse(std::string const& source); private: std::shared_ptr m_lexer; Logger& m_logger; std::vector> m_tokens; size_t m_cursor = 0; std::shared_ptr consume(); std::shared_ptr consume(NodeType type); bool type_is(NodeType type); Loc loc() const; std::shared_ptr parse_prog(); std::shared_ptr parse_builtins(); }; } #endif