Fix resolution of shift-extra vs reduce actions
This commit is contained in:
parent
351b4f4aaa
commit
a8d2585330
2 changed files with 38 additions and 14 deletions
|
|
@ -41,15 +41,38 @@ describe("ParseConflictManager", []() {
|
|||
});
|
||||
|
||||
describe("shift-extra actions", [&]() {
|
||||
ParseAction shift_extra = ParseAction::Error();
|
||||
ParseAction other = ParseAction::Shift(2, { 0, 0 });
|
||||
ParseAction shift_extra = ParseAction::ShiftExtra();
|
||||
ParseAction shift = ParseAction::Shift(2, { 0, 0 });
|
||||
ParseAction reduce = ParseAction::Reduce(sym2, 1, -1, AssociativityRight, production);
|
||||
|
||||
it("favors other actions over shift-extra actions", [&]() {
|
||||
result = conflict_manager->resolve(other, shift_extra);
|
||||
it("favors any shift action over a shift-extra actions", [&]() {
|
||||
result = conflict_manager->resolve(shift, shift_extra);
|
||||
AssertThat(result.first, IsTrue());
|
||||
AssertThat(result.second, Equals(ConflictTypeNone));
|
||||
|
||||
result = conflict_manager->resolve(shift_extra, other);
|
||||
result = conflict_manager->resolve(shift_extra, shift);
|
||||
AssertThat(result.first, IsFalse());
|
||||
AssertThat(result.second, Equals(ConflictTypeNone));
|
||||
});
|
||||
|
||||
it("favors any reduce action over a shift-extra actions", [&]() {
|
||||
result = conflict_manager->resolve(reduce, shift_extra);
|
||||
AssertThat(result.first, IsTrue());
|
||||
AssertThat(result.second, Equals(ConflictTypeNone));
|
||||
|
||||
result = conflict_manager->resolve(shift_extra, reduce);
|
||||
AssertThat(result.first, IsFalse());
|
||||
AssertThat(result.second, Equals(ConflictTypeNone));
|
||||
});
|
||||
});
|
||||
|
||||
describe("reduce-extra actions", [&]() {
|
||||
it("favors shift-extra actions over reduce-extra actions", [&]() {
|
||||
result = conflict_manager->resolve(ParseAction::ShiftExtra(), ParseAction::ReduceExtra(sym1));
|
||||
AssertThat(result.first, IsTrue());
|
||||
AssertThat(result.second, Equals(ConflictTypeNone));
|
||||
|
||||
result = conflict_manager->resolve(ParseAction::ReduceExtra(sym1), ParseAction::ShiftExtra());
|
||||
AssertThat(result.first, IsFalse());
|
||||
AssertThat(result.second, Equals(ConflictTypeNone));
|
||||
});
|
||||
|
|
|
|||
|
|
@ -21,9 +21,11 @@ pair<bool, ConflictType> ParseConflictManager::resolve(
|
|||
return { true, ConflictTypeNone };
|
||||
|
||||
case ParseActionTypeShift:
|
||||
if (new_action.type == ParseActionTypeReduce) {
|
||||
if (new_action.extra)
|
||||
return { false, ConflictTypeNone };
|
||||
if (new_action.extra) {
|
||||
return {false, ConflictTypeNone};
|
||||
} else if (old_action.extra) {
|
||||
return {true, ConflictTypeNone};
|
||||
} else if (new_action.type == ParseActionTypeReduce) {
|
||||
int min_precedence = old_action.precedence_range.min;
|
||||
int max_precedence = old_action.precedence_range.max;
|
||||
int new_precedence = new_action.precedence_range.max;
|
||||
|
|
@ -48,15 +50,14 @@ pair<bool, ConflictType> ParseConflictManager::resolve(
|
|||
return { false, ConflictTypeUnresolved };
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ParseActionTypeReduce:
|
||||
if (new_action.extra)
|
||||
return { false, ConflictTypeNone };
|
||||
if (old_action.extra)
|
||||
return { true, ConflictTypeNone };
|
||||
if (new_action.extra)
|
||||
return { false, ConflictTypeNone };
|
||||
if (new_action.type == ParseActionTypeReduce) {
|
||||
if (new_action.extra)
|
||||
return { false, ConflictTypeNone };
|
||||
if (old_action.extra)
|
||||
return { true, ConflictTypeNone };
|
||||
int old_precedence = old_action.precedence_range.min;
|
||||
int new_precedence = new_action.precedence_range.min;
|
||||
if (new_precedence > old_precedence) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue