#include "parse_table.h" using std::string; using std::ostream; using std::to_string; using std::unordered_set; namespace tree_sitter { // Action ParseAction::ParseAction(ParseActionType type, size_t state_index, string symbol_name, size_t child_symbol_count) : type(type), state_index(state_index), symbol_name(symbol_name), child_symbol_count(child_symbol_count) {}; ParseAction ParseAction::Error() { return ParseAction(ParseActionTypeError, -1, "", -1); } ParseAction ParseAction::Accept() { return ParseAction(ParseActionTypeAccept, -1, "", -1); } ParseAction ParseAction::Shift(size_t state_index) { return ParseAction(ParseActionTypeShift, state_index, "", -1); } ParseAction ParseAction::Reduce(std::string symbol_name, size_t child_symbol_count) { return ParseAction(ParseActionTypeReduce, -1, symbol_name, child_symbol_count); } bool ParseAction::operator==(const ParseAction &other) const { bool types_eq = type == other.type; bool state_indices_eq = state_index == other.state_index; bool child_symbol_counts_eq = child_symbol_count == other.child_symbol_count; return types_eq && state_indices_eq && child_symbol_counts_eq; } ostream& operator<<(ostream &stream, const ParseAction &action) { switch (action.type) { case ParseActionTypeError: return stream << string("#"); case ParseActionTypeAccept: return stream << string("#"); case ParseActionTypeShift: return stream << (string("#"); case ParseActionTypeReduce: return stream << (string("#"); } } // State ParseState::ParseState() : lex_state_index(-1) {} unordered_set ParseState::expected_inputs() const { unordered_set result; for (auto pair : actions) result.insert(pair.first); return result; } ostream& operator<<(ostream &stream, const ParseState &state) { stream << string("# #"); started1 = true; } stream << string(">"); return stream; } // Table size_t ParseTable::add_state() { states.push_back(ParseState()); return states.size() - 1; } void ParseTable::add_action(size_t state_index, string sym_name, ParseAction action) { symbol_names.insert(sym_name); states[state_index].actions[sym_name].insert(action); } }