diff --git a/src/compiler/build_tables/build_parse_table.cc b/src/compiler/build_tables/build_parse_table.cc index 9d987c17..8d4c91dc 100644 --- a/src/compiler/build_tables/build_parse_table.cc +++ b/src/compiler/build_tables/build_parse_table.cc @@ -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; } diff --git a/src/compiler/build_tables/parse_item.cc b/src/compiler/build_tables/parse_item.cc index 9c6742fc..1209d808 100644 --- a/src/compiler/build_tables/parse_item.cc +++ b/src/compiler/build_tables/parse_item.cc @@ -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 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 { diff --git a/src/compiler/build_tables/parse_item.h b/src/compiler/build_tables/parse_item.h index dd2c52df..ba4d747b 100644 --- a/src/compiler/build_tables/parse_item.h +++ b/src/compiler/build_tables/parse_item.h @@ -5,6 +5,7 @@ #include #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 remaining_rule_id() const; + bool is_done() const; + int precedence() const; + rules::Associativity associativity() const; int variable_index; const Production *production;