fix: some location fixes

This commit is contained in:
TopchetoEU 2022-10-20 13:32:52 +03:00
parent bd90a3ed6d
commit 0cb7e25097
2 changed files with 20 additions and 7 deletions

View File

@ -66,17 +66,22 @@ class exp_parser_t : public parser_t {
auto map = op_to_map(op_stack.back());
auto op_n = op_stack.back().op_n;
auto loc = op_stack.back().location;
op_stack.pop_back();
if (res.size() < op_n) return false;
auto &ops = map["ops"].array();
for (size_t i = 0; i < op_n; i++) {
ops.push_back(res.back());
loc = loc.intersect(conv::map_to_loc(res.back().map()["location"].string()));
res.pop_back();
}
map["location"] = conv::loc_to_map(loc);
std::reverse(ops.begin(), ops.end());
res.push_back(map);
@ -100,13 +105,21 @@ class exp_parser_t : public parser_t {
op_stack.pop_back();
return true;
}
bool pop_call(size_t n, std::vector<located_t<op_data_t>> &op_stack, array_t &res) const {
bool pop_call(size_t n, location_t loc, std::vector<located_t<op_data_t>> &op_stack, array_t &res) const {
map_t call = {
{ "$_name", "$_call" },
};
array_t &args = call["args"].array({});
while (true) {
if (op_stack.back().precedence == precedence_t::CALL_START) break;
if (!pop(op_stack, res)) return false;
}
loc = loc.intersect(op_stack.back().location);
op_stack.pop_back();
call["location"] = conv::loc_to_map(loc);
for (size_t i = 0; i <= n; i++) {
args.push_back(res.back());
res.pop_back();
@ -118,7 +131,6 @@ class exp_parser_t : public parser_t {
res.pop_back();
res.push_back(call);
op_stack.pop_back();
return true;
}
bool pop_until(const op_data_t &data, tree_helper_t &h, std::vector<located_t<op_data_t>> &op_stack, array_t &res) const {
@ -162,7 +174,7 @@ class exp_parser_t : public parser_t {
last_val = false;
}
else if (op == operator_t::COMMA) {
if (call_args_n.size() == 0) h.err("Unexpected comma here.");
if (call_args_n.size() == 0) break;
pop_until({ precedence_t::CALL_START, .assoc = true }, h, op_stack, res);
h.advance("Expected an argument.");
@ -183,7 +195,7 @@ class exp_parser_t : public parser_t {
}
}
if (is_call) pop_call(call_args_n.back(), op_stack, res);
if (is_call) pop_call(call_args_n.back(), h.loc(), op_stack, res);
else if (is_paren) pop_paren(op_stack, res);
else break;
@ -240,6 +252,7 @@ class exp_parser_t : public parser_t {
while (!op_stack.empty()) {
if (op_stack.back().precedence == precedence_t::PAREN) throw message_t::error("Unclosed paren.", op_stack.back().location);
if (op_stack.back().precedence == precedence_t::CALL_START) throw message_t::error("Unclosed call.", op_stack.back().location);
if (!pop(op_stack, res)) return h.err("Expected an expression on the right side of this operator.");
}

View File

@ -36,8 +36,8 @@ class type_parser_t : public parser_t {
nmsp["location"] = conv::loc_to_map(loc);
}
else {
auto loc_1 = conv::map_to_loc(nmsp_content[0].map()["location"].map());
auto loc_2 = conv::map_to_loc(nmsp_content[nmsp_content.size() - 1].map()["location"].map());
auto loc_1 = conv::map_to_loc(nmsp_content[0].map()["location"].string());
auto loc_2 = conv::map_to_loc(nmsp_content[nmsp_content.size() - 1].map()["location"].string());
auto loc = loc_1.intersect(loc_2);
nmsp["location"] = conv::loc_to_map(loc);
}