ppc-lang/include/compiler/treeifier/ast.hh

82 lines
2.7 KiB
C++
Raw Normal View History

2022-09-27 11:09:02 +00:00
#pragma once
#include <string>
2022-10-04 13:00:18 +00:00
#include <set>
#include <map>
#include <unordered_set>
2022-09-27 11:09:02 +00:00
#include <unordered_map>
#include <memory>
#include "compiler/treeifier/tokenizer.hh"
#include "utils/data.hh"
#include "lang/common.hh"
using namespace std::string_literals;
using namespace ppc;
2022-10-04 20:45:08 +00:00
using namespace ppc::lang;
2022-10-04 13:00:18 +00:00
using namespace ppc::messages;
2022-09-27 11:09:02 +00:00
namespace ppc::comp::tree::ast {
2022-10-14 17:27:45 +00:00
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*;
2022-10-04 13:00:18 +00:00
class group_t {
private:
std::map<lang::namespace_name_t, std::string> named_parsers;
std::set<std::string> unnamed_parsers;
std::map<std::string, parser_t> parsers;
public:
group_t &replace(const std::string &name, parser_t parser);
2023-01-18 08:01:09 +00:00
group_t &add(const std::string &name, parser_t parser);
group_t &add(const std::string &name, const lang::namespace_name_t &identifier, parser_t parser);
2022-10-09 13:34:02 +00:00
bool operator()(ast_ctx_t &ctx, size_t &i, data::map_t &out) const;
};
2022-10-09 11:18:38 +00:00
2022-10-04 13:00:18 +00:00
struct ast_ctx_t {
2022-09-27 11:09:02 +00:00
private:
std::unordered_map<std::string, group_t> groups;
2022-09-27 11:09:02 +00:00
public:
2022-10-04 13:00:18 +00:00
msg_stack_t &messages;
std::vector<token_t> &tokens;
2022-10-09 11:18:38 +00:00
std::set<loc_namespace_name_t> imports;
loc_namespace_name_t nmsp;
2022-10-04 13:00:18 +00:00
2022-10-09 13:34:02 +00:00
ast_ctx_t &operator=(const ast_ctx_t &other) = delete;
2022-10-04 13:00:18 +00:00
template <class T>
bool parse(const T &parser, size_t &i, data::map_t &out) {
return parser(*this, i, out);
2022-10-09 11:18:38 +00:00
}
group_t &group(const std::string &name);
2022-10-09 11:18:38 +00:00
template <class T>
static data::map_t parse(const T &glob, msg_stack_t &messages, std::vector<token_t> &tokens) {
ast_ctx_t ctx(messages, tokens);
2022-10-09 11:18:38 +00:00
data::map_t res;
size_t i = 0;
2022-10-09 11:18:38 +00:00
if (!ctx.parse(glob, i, res)) throw message_t::error("Failed to compile.");
return res;
}
2022-10-09 13:34:02 +00:00
ast_ctx_t(msg_stack_t &messages, std::vector<token_t> &tokens);
2022-09-27 11:09:02 +00:00
};
2022-09-27 11:09:52 +00:00
2022-10-09 11:18:38 +00:00
namespace conv {
data::map_t identifier_to_map(const located_t<std::string> &loc);
located_t<std::string> 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);
2022-10-04 13:00:18 +00:00
2022-10-09 11:18:38 +00:00
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_exp, parse_stat_exp;
2023-01-18 08:01:09 +00:00
parser_func_t parse_func, parse_field, parse_export, parse_struct;
parser_func_t parse_if, parse_while, parse_return, parse_break, parse_continue, parse_stat_comp;
parser_func_t parse_exp_var, parse_exp_str_lit, parse_exp_int_lit, parse_exp_float_lit;
2022-09-27 11:09:02 +00:00
}