Show precedences and associativities in parse conflicts
This commit is contained in:
parent
500533476b
commit
44d3e4228e
3 changed files with 44 additions and 3 deletions
|
|
@ -290,6 +290,21 @@ class ParseTableBuilder {
|
|||
}
|
||||
if (i == item.step_index)
|
||||
result += " \u2022";
|
||||
|
||||
result += " (prec " + to_string(item.precedence());
|
||||
|
||||
switch (item.associativity()) {
|
||||
case rules::AssociativityNone:
|
||||
result += ")";
|
||||
break;
|
||||
case rules::AssociativityLeft:
|
||||
result += ", assoc left)";
|
||||
break;
|
||||
case rules::AssociativityRight:
|
||||
result += ", assoc right)";
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,13 +41,35 @@ Symbol ParseItem::lhs() const {
|
|||
return Symbol(variable_index);
|
||||
}
|
||||
|
||||
bool ParseItem::is_done() const {
|
||||
return step_index == production->size();
|
||||
}
|
||||
|
||||
int ParseItem::precedence() const {
|
||||
if (production->empty())
|
||||
return 0;
|
||||
else if (is_done())
|
||||
return production->back().precedence;
|
||||
else
|
||||
return production->at(step_index).precedence;
|
||||
}
|
||||
|
||||
rules::Associativity ParseItem::associativity() const {
|
||||
if (production->empty())
|
||||
return rules::AssociativityNone;
|
||||
else if (is_done())
|
||||
return production->back().associativity;
|
||||
else
|
||||
return production->at(step_index).associativity;
|
||||
}
|
||||
|
||||
pair<int, int> ParseItem::remaining_rule_id() const {
|
||||
if (production->empty())
|
||||
return { -2, -1 };
|
||||
else if (step_index < production->size())
|
||||
return { -1, production->at(step_index).rule_id };
|
||||
else
|
||||
else if (is_done())
|
||||
return { production->back().associativity, production->back().precedence };
|
||||
else
|
||||
return { -1, production->at(step_index).rule_id };
|
||||
}
|
||||
|
||||
size_t ParseItem::Hash::operator()(const ParseItem &item) const {
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include <utility>
|
||||
#include "compiler/build_tables/lookahead_set.h"
|
||||
#include "compiler/rules/symbol.h"
|
||||
#include "compiler/rules/metadata.h"
|
||||
#include "compiler/syntax_grammar.h"
|
||||
|
||||
namespace tree_sitter {
|
||||
|
|
@ -18,6 +19,9 @@ class ParseItem {
|
|||
bool operator<(const ParseItem &other) const;
|
||||
rules::Symbol lhs() const;
|
||||
std::pair<int, int> remaining_rule_id() const;
|
||||
bool is_done() const;
|
||||
int precedence() const;
|
||||
rules::Associativity associativity() const;
|
||||
|
||||
int variable_index;
|
||||
const Production *production;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue