feat: implement group parser
This commit is contained in:
parent
63f79a28e1
commit
452884a74c
@ -1,11 +1,50 @@
|
|||||||
#include "compiler/treeifier/ast.hh"
|
#include "compiler/treeifier/ast.hh"
|
||||||
|
#include "compiler/treeifier/tokenizer.hh"
|
||||||
|
#include "compiler/treeifier/ast/helper.hh"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
using namespace ppc::comp::tree;
|
||||||
using namespace ppc::comp::tree::ast;
|
using namespace ppc::comp::tree::ast;
|
||||||
using namespace std::string_literals;
|
using namespace std::string_literals;
|
||||||
|
|
||||||
|
static bool read_nmsp(ast_ctx_t &ctx, size_t &i, const lang::namespace_name_t &name) {
|
||||||
|
tree_helper_t h(ctx, i);
|
||||||
|
|
||||||
|
size_t equal_i = 0;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (h.ended()) break;
|
||||||
|
if (equal_i >= name.size()) return false;
|
||||||
|
auto &curr = h.curr();
|
||||||
|
if (!curr.is_identifier()) return false;
|
||||||
|
|
||||||
|
if (name[equal_i] != curr.identifier()) return false;
|
||||||
|
|
||||||
|
if (h.try_advance() && h.curr().is_operator(operator_t::DOUBLE_COLON)) {
|
||||||
|
equal_i++;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return equal_i != name.size();
|
||||||
|
}
|
||||||
|
|
||||||
bool group_parser_t::parse(ast_ctx_t &ctx, size_t &i, data::map_t &out) const {
|
bool group_parser_t::parse(ast_ctx_t &ctx, size_t &i, data::map_t &out) const {
|
||||||
return false;
|
tree_helper_t h(ctx, i);
|
||||||
|
|
||||||
|
for (auto &pair : named_parsers) {
|
||||||
|
if (!read_nmsp(ctx, i, pair.first)) continue;
|
||||||
|
auto &parser = *pair.second;
|
||||||
|
return h.parse(parser, out);
|
||||||
|
}
|
||||||
|
for (auto parser : parsers) {
|
||||||
|
try {
|
||||||
|
return h.parse(*parser, out);
|
||||||
|
}
|
||||||
|
catch (std::string) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -14,7 +53,7 @@ group_parser_t &group_parser_t::add(parser_t &parser) {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
group_parser_t &group_parser_t::add(parser_t &parser, const lang::namespace_name_t &name) {
|
group_parser_t &group_parser_t::add(parser_t &parser, const lang::namespace_name_t &name) {
|
||||||
if (name.is_empty()) throw "Name can't be empty."s;
|
if (name.empty()) throw "Name can't be empty."s;
|
||||||
if (std::find(parsers.begin(), parsers.end(), &parser) != parsers.end()) {
|
if (std::find(parsers.begin(), parsers.end(), &parser) != parsers.end()) {
|
||||||
throw "Parser '" + name.to_string() + "' already in group.";
|
throw "Parser '" + name.to_string() + "' already in group.";
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user