#pragma once #include #include #include #include #include #include "compiler/treeifier/tokenizer.hh" #include "utils/data.hh" #include "lang/common.hh" using namespace std::string_literals; using namespace ppc; using namespace ppc::lang; using namespace ppc::messages; namespace ppc::comp::tree::ast { struct ast_ctx_t; using parser_func_t = bool (ast_ctx_t &ctx, size_t &res_i, data::map_t &out); using parser_t = parser_func_t*; class group_t { private: std::map named_parsers; std::map parsers; public: group_t &insert(const std::string &name, parser_t parser, const std::string &relative_to, bool after); group_t &add_last(const std::string &name, parser_t parser); group_t &replace(const std::string &name, parser_t parser); group_t &add_named(const std::string &name, parser_t parser, const lang::namespace_name_t &identifier); bool operator()(ast_ctx_t &ctx, size_t &i, data::map_t &out) const; }; struct ast_ctx_t { private: std::unordered_map groups; public: msg_stack_t &messages; std::vector &tokens; std::set imports; loc_namespace_name_t nmsp; ast_ctx_t &operator=(const ast_ctx_t &other) = delete; template bool parse(const T &parser, size_t &i, data::map_t &out) { return parser(*this, i, out); } group_t &group(const std::string &name); template static data::map_t parse(const T &glob, msg_stack_t &messages, std::vector &tokens) { ast_ctx_t ctx(messages, tokens); data::map_t res; size_t i = 0; if (!ctx.parse(glob, i, res)) throw message_t::error("Failed to compile."); return res; } ast_ctx_t(msg_stack_t &messages, std::vector &tokens); }; namespace conv { data::map_t identifier_to_map(const located_t &loc); located_t map_to_identifier(const data::map_t &map); data::string_t loc_to_map(const location_t &loc); location_t map_to_loc(const data::string_t &map); data::map_t nmsp_to_map(const loc_namespace_name_t &nmsp); loc_namespace_name_t map_to_nmsp(const data::map_t &map); } parser_func_t parse_glob, parse_nmsp, parse_identifier, parse_type, parse_func, parse_field, parse_exp, parse_stat_exp; parser_func_t parse_exp_var, parse_exp_str_lit, parse_exp_int_lit, parse_exp_float_lit; }