#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 ensure(NodeType type); void next(); std::shared_ptr parse_prog(); std::shared_ptr parse_instr(); std::shared_ptr parse_vardecl(); std::shared_ptr parse_constdecl(); std::shared_ptr parse_assign(); std::shared_ptr parse_if(); std::shared_ptr parse_then(); std::shared_ptr parse_else(); std::shared_ptr parse_expr(); std::shared_ptr parse_imp(); std::shared_ptr parse_or(); std::shared_ptr parse_and(); std::shared_ptr parse_eq(); std::shared_ptr parse_cmp(); 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_call(); std::shared_ptr parse_args(); std::shared_ptr parse_int(); std::shared_ptr parse_fun(); std::shared_ptr parse_params(); std::shared_ptr parse_param(); std::shared_ptr parse_ret(); std::shared_ptr parse_body(); std::shared_ptr parse_type(); }; } #endif