diff --git a/spec/fixtures/parsers/c.c b/spec/fixtures/parsers/c.c index ec3ebdf2..1ebc68f5 100644 --- a/spec/fixtures/parsers/c.c +++ b/spec/fixtures/parsers/c.c @@ -4317,7 +4317,7 @@ static const TSParseAction *ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = { [sym_init_declarator] = ACTIONS(REDUCE(sym_type_specifier, 1)), [sym_declarator] = ACTIONS(REDUCE(sym_type_specifier, 1)), [sym_direct_declarator] = ACTIONS(REDUCE(sym_type_specifier, 1)), - [sym_star] = ACTIONS(REDUCE(sym_expression, 1), REDUCE(sym_type_specifier, 1)), + [sym_star] = ACTIONS(REDUCE(sym_type_specifier, 1), REDUCE(sym_expression, 1)), [sym_identifier] = ACTIONS(REDUCE(sym_type_specifier, 1)), [sym_comment] = ACTIONS(SHIFT_EXTRA()), [aux_sym_declarator_repeat1] = ACTIONS(REDUCE(sym_type_specifier, 1)), diff --git a/src/compiler/build_tables/parse_item.cc b/src/compiler/build_tables/parse_item.cc index 769d052a..c575f100 100644 --- a/src/compiler/build_tables/parse_item.cc +++ b/src/compiler/build_tables/parse_item.cc @@ -20,6 +20,14 @@ bool ParseItem::operator==(const ParseItem &other) const { (rule == other.rule || rule->operator==(*other.rule)); } +bool ParseItem::operator<(const ParseItem &other) const { + if (lhs < other.lhs) return true; + if (other.lhs < lhs) return false; + if (consumed_symbols.size() < other.consumed_symbols.size()) return true; + if (other.consumed_symbols.size() < consumed_symbols.size()) return false; + return rule < other.rule; +} + rules::Associativity ParseItem::associativity() const { return rules::Associativity(get_metadata(rule, rules::ASSOCIATIVITY)); } diff --git a/src/compiler/build_tables/parse_item.h b/src/compiler/build_tables/parse_item.h index b4bd81a2..a2a51557 100644 --- a/src/compiler/build_tables/parse_item.h +++ b/src/compiler/build_tables/parse_item.h @@ -2,7 +2,7 @@ #define COMPILER_BUILD_TABLES_PARSE_ITEM_H_ #include -#include +#include #include #include "compiler/build_tables/item.h" #include "compiler/rules/symbol.h" @@ -16,13 +16,14 @@ class ParseItem : public Item { ParseItem(const rules::Symbol &lhs, rules::rule_ptr rule, const std::vector &consumed_symbols); bool operator==(const ParseItem &other) const; + bool operator<(const ParseItem &other) const; rules::Associativity associativity() const; std::vector consumed_symbols; }; std::ostream &operator<<(std::ostream &stream, const ParseItem &item); -typedef std::unordered_map> ParseItemSet; +typedef std::map> ParseItemSet; } // namespace build_tables } // namespace tree_sitter