Include precedence calculation in ParseItemSet::transitions
This commit is contained in:
parent
433f060a5b
commit
4850384b78
4 changed files with 70 additions and 41 deletions
|
|
@ -99,11 +99,12 @@ class ParseTableBuilder {
|
|||
void add_shift_actions(const ParseItemSet &item_set, ParseStateId state_id) {
|
||||
for (const auto &transition : item_set.transitions()) {
|
||||
const Symbol &symbol = transition.first;
|
||||
const ParseItemSet &next_item_set = transition.second;
|
||||
const ParseItemSet &next_item_set = transition.second.first;
|
||||
const PrecedenceRange &precedence = transition.second.second;
|
||||
|
||||
ParseAction *new_action = add_action(
|
||||
state_id, symbol,
|
||||
ParseAction::Shift(0, precedence_values_for_item_set(next_item_set)),
|
||||
ParseAction::Shift(0, precedence),
|
||||
item_set);
|
||||
if (new_action)
|
||||
new_action->state_index = add_parse_state(next_item_set);
|
||||
|
|
@ -319,16 +320,6 @@ class ParseTableBuilder {
|
|||
return result;
|
||||
}
|
||||
|
||||
PrecedenceRange precedence_values_for_item_set(const ParseItemSet &item_set) {
|
||||
PrecedenceRange result;
|
||||
for (const auto &pair : item_set.entries) {
|
||||
const ParseItem &item = pair.first;
|
||||
if (item.step_index > 0)
|
||||
result.add(item.production->at(item.step_index - 1).precedence);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
string symbol_name(const rules::Symbol &symbol) const {
|
||||
if (symbol.is_built_in()) {
|
||||
if (symbol == rules::ERROR())
|
||||
|
|
|
|||
|
|
@ -104,8 +104,8 @@ size_t ParseItemSet::Hash::operator()(const ParseItemSet &item_set) const {
|
|||
return result;
|
||||
}
|
||||
|
||||
map<Symbol, ParseItemSet> ParseItemSet::transitions() const {
|
||||
map<Symbol, ParseItemSet> result;
|
||||
ParseItemSet::TransitionMap ParseItemSet::transitions() const {
|
||||
ParseItemSet::TransitionMap result;
|
||||
for (const auto &pair : entries) {
|
||||
const ParseItem &item = pair.first;
|
||||
const LookaheadSet &lookahead_symbols = pair.second;
|
||||
|
|
@ -114,9 +114,11 @@ map<Symbol, ParseItemSet> ParseItemSet::transitions() const {
|
|||
|
||||
size_t step = item.step_index + 1;
|
||||
Symbol symbol = item.production->at(item.step_index).symbol;
|
||||
int precedence = item.production->at(item.step_index).precedence;
|
||||
ParseItem new_item(item.lhs(), *item.production, step);
|
||||
|
||||
result[symbol].entries[new_item] = lookahead_symbols;
|
||||
result[symbol].first.entries[new_item] = lookahead_symbols;
|
||||
result[symbol].second.add(precedence);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include "compiler/rules/symbol.h"
|
||||
#include "compiler/rules/metadata.h"
|
||||
#include "compiler/syntax_grammar.h"
|
||||
#include "compiler/precedence_range.h"
|
||||
|
||||
namespace tree_sitter {
|
||||
namespace build_tables {
|
||||
|
|
@ -37,7 +38,9 @@ class ParseItemSet {
|
|||
ParseItemSet();
|
||||
explicit ParseItemSet(const std::map<ParseItem, LookaheadSet> &);
|
||||
|
||||
std::map<rules::Symbol, ParseItemSet> transitions() const;
|
||||
typedef std::map<rules::Symbol, std::pair<ParseItemSet, PrecedenceRange>> TransitionMap;
|
||||
|
||||
TransitionMap transitions() const;
|
||||
bool operator==(const ParseItemSet &) const;
|
||||
|
||||
std::map<ParseItem, LookaheadSet> entries;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue