Store parse actions' precedences as ranges, not sets
This commit is contained in:
parent
ef2acf9496
commit
6d748a6714
8 changed files with 105 additions and 50 deletions
35
src/compiler/precedence_range.cc
Normal file
35
src/compiler/precedence_range.cc
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
#include "compiler/precedence_range.h"
|
||||
|
||||
namespace tree_sitter {
|
||||
|
||||
PrecedenceRange::PrecedenceRange() : min(0), max(0), empty(true) {}
|
||||
|
||||
PrecedenceRange::PrecedenceRange(int min, int max)
|
||||
: min(min), max(max), empty(false) {}
|
||||
|
||||
void PrecedenceRange::add(int new_value) {
|
||||
if (empty) {
|
||||
min = new_value;
|
||||
max = new_value;
|
||||
empty = false;
|
||||
} else {
|
||||
if (new_value < min)
|
||||
min = new_value;
|
||||
else if (new_value > max)
|
||||
max = new_value;
|
||||
}
|
||||
}
|
||||
|
||||
bool PrecedenceRange::operator<(const PrecedenceRange &other) const {
|
||||
if (empty)
|
||||
return !other.empty;
|
||||
else
|
||||
return (min < other.min && max <= other.min) ||
|
||||
(min == other.min && max < other.max);
|
||||
}
|
||||
|
||||
bool PrecedenceRange::operator==(const PrecedenceRange &other) const {
|
||||
return (empty == other.empty) && (min == other.min) && (max == other.max);
|
||||
}
|
||||
|
||||
} // namespace tree_sitter
|
||||
Loading…
Add table
Add a link
Reference in a new issue