Represent ParseItemSets as ordered maps

This way, reductions will be added in a deterministic order
when constructing the parse table.
This commit is contained in:
Max Brunsfeld 2015-07-08 21:53:40 -07:00
parent 929897a78e
commit d6a6b0a19b
3 changed files with 12 additions and 3 deletions

View file

@ -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)),

View file

@ -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));
}

View file

@ -2,7 +2,7 @@
#define COMPILER_BUILD_TABLES_PARSE_ITEM_H_
#include <set>
#include <unordered_map>
#include <map>
#include <vector>
#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<rules::Symbol> &consumed_symbols);
bool operator==(const ParseItem &other) const;
bool operator<(const ParseItem &other) const;
rules::Associativity associativity() const;
std::vector<rules::Symbol> consumed_symbols;
};
std::ostream &operator<<(std::ostream &stream, const ParseItem &item);
typedef std::unordered_map<ParseItem, std::set<rules::Symbol>> ParseItemSet;
typedef std::map<ParseItem, std::set<rules::Symbol>> ParseItemSet;
} // namespace build_tables
} // namespace tree_sitter