#ifndef roza_PARSER_HPP #define roza_PARSER_HPP #include "commons.hpp" #include "Lexer.hpp" #include "lib/StatusLog.hpp" namespace roza { class Parser { public: explicit Parser(Lexer& lexer, StatusLog& log); virtual ~Parser(); std::shared_ptr parse(); private: Lexer& m_lexer; StatusLog& m_log; size_t m_cursor = 0; std::shared_ptr node(size_t offset=0) const; NodeType type(size_t offset=0) const; bool type_is(NodeType type, size_t offset=0) const; std::shared_ptr consume_or_nullptr(NodeType type); std::shared_ptr consume(NodeType type); void consume_all(NodeType type); std::shared_ptr consume(); void next(); std::shared_ptr parse_prog(); std::shared_ptr parse_instr(); std::shared_ptr parse_expr(); std::shared_ptr parse_imp(); std::shared_ptr parse_or(); std::shared_ptr parse_and(); std::shared_ptr parse_term(); std::shared_ptr parse_factor(); std::shared_ptr parse_unop(); std::shared_ptr parse_pow(); std::shared_ptr parse_group(); std::shared_ptr parse_base(); std::shared_ptr parse_int(); }; } #endif