#ifndef jk_PARSER_HPP #define jk_PARSER_HPP #include "commons.hpp" #include "Logger.hpp" #include "Lexer.hpp" namespace jk { JK_ERROR(syntax_error); class Parser { public: explicit Parser(Logger& logger, std::shared_ptr lexer); virtual ~Parser(); std::shared_ptr parse(std::string const& source); private: Logger& m_logger; std::shared_ptr m_lexer; std::vector> m_tokens; size_t m_cursor; std::shared_ptr current() const; Loc loc() const; std::shared_ptr consume(); std::shared_ptr consume(NodeType type); bool type_is(NodeType type, int lookahead=0) const; std::shared_ptr parse_prog(); std::shared_ptr parse_expr(); std::shared_ptr parse_vardecl(); std::shared_ptr parse_lambda(); std::shared_ptr parse_params(); std::shared_ptr parse_body(); std::shared_ptr parse_funcall(); std::shared_ptr parse_literal(); }; } #endif