diff --git a/src/syntaxer.cpp b/src/syntaxer.cpp index 0c33b7f..adfc197 100644 --- a/src/syntaxer.cpp +++ b/src/syntaxer.cpp @@ -430,21 +430,20 @@ static void add_bracket_to(std::vector& tv, const int locatio { if (tv[i].t == Expression::Token::OPERATOR) { - switch (tv[i].v.o) + if (tv[i].v.o == Expression::Token::CPA) { - case Expression::Token::OPA: - lv--; - break; - case Expression::Token::CPA: lv++; - break; - default: - if (!lv) - { - tv.insert(tv.begin() + i + 1, Expression::Token(Expression::Token::OPA)); - return; - } - break; + } + + if (!lv) + { + tv.insert(tv.begin() + i + 1, Expression::Token(Expression::Token::OPA)); + return; + } + + if (tv[i].v.o == Expression::Token::OPA) + { + lv--; } } } @@ -457,21 +456,20 @@ static void add_bracket_to(std::vector& tv, const int locatio { if (tv[i].t == Expression::Token::OPERATOR) { - switch (tv[i].v.o) + if (tv[i].v.o == Expression::Token::OPA) { - case Expression::Token::OPA: lv++; - break; - case Expression::Token::CPA: + } + + if (!lv) + { + tv.insert(tv.begin() + i, Expression::Token(Expression::Token::CPA)); + return; + } + + if (tv[i].v.o == Expression::Token::CPA) + { lv--; - break; - default: - if (!lv) - { - tv.insert(tv.begin() + i, Expression::Token(Expression::Token::CPA)); - return; - } - break; } } } @@ -650,68 +648,68 @@ void apply_corrections(std::vector& tv) for (int current_prio_level = mp[get_max_index(mp)]; current_prio_level >= 0; current_prio_level--) { - // calculate how many ranges need to be processed at this level - std::vector rv; - find_select_prio_op_ranges(mp, rv, current_prio_level); + int corrections = 1; + int relative_level = -current_prio_level; - for (int current_range = rv.size() - 1; current_range >= 0; current_range--) + while (corrections) { - Range &outer_range = rv[current_range]; + corrections = 0; - std::vector inner_prios; - rank_inner_ops_raw(inner_prios, tv, outer_range.start, outer_range.finish); - - for (int inner_prio = inner_prios[get_max_index(inner_prios)]; inner_prio >= 0; inner_prio--) + int same_op_cnt = -1; + for (int i = 0; i < tv.size(); i++) { - std::vector inner_ranges; - find_select_prio_op_ranges(inner_prios, inner_ranges, inner_prio); + Expression::Token& tok = tv[i]; - for (int inner_range = inner_ranges.size() - 1; inner_range >= 0; inner_range--) + if (tok.t == Expression::Token::OPERATOR) { - int corrections = 1; - - Range &range = inner_ranges[inner_range]; - while (corrections) + if (tok.v.o == Expression::Token::OPA) { - corrections = 0; + relative_level++; + } + else if (tok.v.o == Expression::Token::CPA) + { + relative_level--; + } - int same_op_cnt = -1; - for (int i = outer_range.start + range.start; i < outer_range.start + range.finish + 1; i++) + if (relative_level < 0) + { + same_op_cnt = -1; + } + else if ((tok.v.o == Expression::Token::SUB || tok.v.o == Expression::Token::DIV) && !relative_level) + { + same_op_cnt++; + + if (same_op_cnt == 2) { - int loc = get_mop_location(tv, i); - Expression::Token& tok = tv[loc]; + same_op_cnt = 0; - if (tok.v.o == Expression::Token::SUB || tok.v.o == Expression::Token::DIV) + corrections++; + + switch (tok.v.o) { - same_op_cnt++; - - if (same_op_cnt == 2) - { - same_op_cnt = 0; - - corrections++; - - switch (tok.v.o) - { - case Expression::Token::SUB: - tok.v.o = Expression::Token::ADD; - break; - case Expression::Token::DIV: - tok.v.o = Expression::Token::MUL; - break; - default: - pr_warn("Impossible operator in this branch, this is a bug!"); - break; - } - - // inverse order to keep location valid between calls - add_bracket_to(tv, loc, 1); - add_bracket_to(tv, loc, -1); - - pr_debug("Updated vector:"); - Parser::print_math_vector(tv); - } + case Expression::Token::SUB: + tok.v.o = Expression::Token::ADD; + break; + case Expression::Token::DIV: + tok.v.o = Expression::Token::MUL; + break; + default: + pr_warn("Impossible operator in this branch, this is a bug!"); + break; } + + // inverse order to keep location valid between calls + add_bracket_to(tv, i, 1); + add_bracket_to(tv, i, -1); + + // advance one step to compensate for inserted left bracket + i++; + + // elevate one level to compensate for new brackets + relative_level++; + + pr_debug("Updated vector:"); + Parser::print_math_vector(tv); } } }