diff --git a/TreeSitter.xcodeproj/project.pbxproj b/TreeSitter.xcodeproj/project.pbxproj index 7661e9b1..1cb42b25 100644 --- a/TreeSitter.xcodeproj/project.pbxproj +++ b/TreeSitter.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ 12FD40DD185FF12C0041A84E /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DC185FF12C0041A84E /* parser.c */; }; 12FD40DF1860064C0041A84E /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DE1860064C0041A84E /* tree.c */; }; 12FD40E2186245FE0041A84E /* transitions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40E0186245FE0041A84E /* transitions.cpp */; }; + 12FD40E718639B910041A84E /* rule_visitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40E618639B910041A84E /* rule_visitor.cpp */; }; 27A343CA69E17E0F9EBEDF1C /* pattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27A340F3EEB184C040521323 /* pattern.cpp */; }; /* End PBXBuildFile section */ @@ -133,6 +134,7 @@ 12FD40E0186245FE0041A84E /* transitions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transitions.cpp; sourceTree = ""; }; 12FD40E1186245FE0041A84E /* transitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transitions.h; sourceTree = ""; }; 12FD40E41862B3530041A84E /* rule_visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rule_visitor.h; sourceTree = ""; }; + 12FD40E618639B910041A84E /* rule_visitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rule_visitor.cpp; sourceTree = ""; }; 27A340F3EEB184C040521323 /* pattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pattern.cpp; sourceTree = ""; }; 27A3438C4FA59A3882E8493B /* pattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pattern.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -182,6 +184,7 @@ 12FD40E0186245FE0041A84E /* transitions.cpp */, 12FD40E1186245FE0041A84E /* transitions.h */, 12FD40E41862B3530041A84E /* rule_visitor.h */, + 12FD40E618639B910041A84E /* rule_visitor.cpp */, ); path = rules; sourceTree = ""; @@ -436,6 +439,7 @@ 12F9A651182DD6BC00FAF50C /* grammar.cpp in Sources */, 12FD40D6185FEEDB0041A84E /* parse_table_builder_spec.cpp in Sources */, 12D136A4183678A2005F3369 /* repeat.cpp in Sources */, + 12FD40E718639B910041A84E /* rule_visitor.cpp in Sources */, 12130622182C85D300FCF928 /* item_set.cpp in Sources */, 12130605182C348F00FCF928 /* char.cpp in Sources */, 1213060B182C389100FCF928 /* symbol.cpp in Sources */, diff --git a/spec/compiler/rules/pattern_spec.cpp b/spec/compiler/rules/pattern_spec.cpp index 05a73fce..5c84f5b1 100644 --- a/spec/compiler/rules/pattern_spec.cpp +++ b/spec/compiler/rules/pattern_spec.cpp @@ -6,9 +6,9 @@ using namespace tree_sitter::rules; Describe(pattern_rules) { It(parses_simple_strings) { - pattern_ptr rule = pattern("abc"); + Pattern rule("abc"); AssertThat( - rule->to_rule_tree()->to_string(), + rule.to_rule_tree()->to_string(), Equals(seq({ character('a'), character('b'), @@ -17,9 +17,9 @@ Describe(pattern_rules) { }; It(parses_character_classes) { - pattern_ptr rule = pattern("\\w-\\d"); + Pattern rule("\\w-\\d"); AssertThat( - rule->to_rule_tree()->to_string(), + rule.to_rule_tree()->to_string(), Equals(seq({ char_class(CharClassTypeWord), character('-'), @@ -28,9 +28,9 @@ Describe(pattern_rules) { }; It(parses_choices) { - pattern_ptr rule = pattern("ab|cd|ef"); + Pattern rule("ab|cd|ef"); AssertThat( - rule->to_rule_tree()->to_string(), + rule.to_rule_tree()->to_string(), Equals(choice({ seq({ character('a'), @@ -48,9 +48,9 @@ Describe(pattern_rules) { }; It(parses_choices_in_sequences) { - pattern_ptr rule = pattern("(a|b)cd"); + Pattern rule("(a|b)cd"); AssertThat( - rule->to_rule_tree()->to_string(), + rule.to_rule_tree()->to_string(), Equals(seq({ choice({ character('a'), @@ -62,9 +62,9 @@ Describe(pattern_rules) { }; It(parses_special_characters_when_they_are_escaped) { - pattern_ptr rule = pattern("a\\(b"); + Pattern rule("a\\(b"); AssertThat( - rule->to_rule_tree()->to_string(), + rule.to_rule_tree()->to_string(), Equals(seq({ character('a'), character('('), @@ -73,9 +73,9 @@ Describe(pattern_rules) { } It(parses_repeating_rules) { - pattern_ptr rule = pattern("(ab)+(cd)+"); + Pattern rule("(ab)+(cd)+"); AssertThat( - rule->to_rule_tree()->to_string(), + rule.to_rule_tree()->to_string(), Equals( seq({ repeat(seq({ diff --git a/src/compiler/lr/item.cpp b/src/compiler/lr/item.cpp index 38ce3cd2..cda1a856 100644 --- a/src/compiler/lr/item.cpp +++ b/src/compiler/lr/item.cpp @@ -23,11 +23,11 @@ namespace tree_sitter { }); }; - vector Item::next_symbols() const { - vector result; + vector Item::next_symbols() const { + vector result; for (auto pair : rules::transitions(rule)) { shared_ptr sym = dynamic_pointer_cast(pair.first); - if (sym) result.push_back(sym); + if (sym) result.push_back(*sym); } return result; } diff --git a/src/compiler/lr/item.h b/src/compiler/lr/item.h index e779b4d5..4e3498cd 100644 --- a/src/compiler/lr/item.h +++ b/src/compiler/lr/item.h @@ -16,7 +16,7 @@ namespace tree_sitter { static Item at_beginning_of_rule(const std::string &rule_name, const Grammar &grammar); TransitionMap transitions() const; - std::vector next_symbols() const; + std::vector next_symbols() const; bool operator==(const Item &other) const; bool is_done() const; diff --git a/src/compiler/lr/item_set.cpp b/src/compiler/lr/item_set.cpp index c40e530f..53882288 100644 --- a/src/compiler/lr/item_set.cpp +++ b/src/compiler/lr/item_set.cpp @@ -16,8 +16,8 @@ namespace tree_sitter { static void add_item(vector &vector, const Item &item, const Grammar &grammar) { if (!vector_contains(vector, item)) { vector.push_back(item); - for (rules::sym_ptr rule : item.next_symbols()) { - Item next_item = Item::at_beginning_of_rule(rule->name, grammar); + for (rules::Symbol rule : item.next_symbols()) { + Item next_item = Item::at_beginning_of_rule(rule.name, grammar); add_item(vector, next_item, grammar); } } diff --git a/src/compiler/lr/parse_table_builder.cpp b/src/compiler/lr/parse_table_builder.cpp index 6494439a..fbe95164 100644 --- a/src/compiler/lr/parse_table_builder.cpp +++ b/src/compiler/lr/parse_table_builder.cpp @@ -23,7 +23,7 @@ namespace tree_sitter { void add_shift_actions(const ItemSet &item_set, size_t state_index) { for (auto transition : item_set.sym_transitions(grammar)) { - rules::sym_ptr symbol = static_pointer_cast(transition.first); + auto symbol = static_pointer_cast(transition.first); size_t new_state_index = add_item_set(*transition.second); table.add_action(state_index, symbol->name, ParseAction::Shift(new_state_index)); } diff --git a/src/compiler/rules/pattern.cpp b/src/compiler/rules/pattern.cpp index 7c4f0605..ece4890b 100644 --- a/src/compiler/rules/pattern.cpp +++ b/src/compiler/rules/pattern.cpp @@ -103,7 +103,7 @@ namespace tree_sitter { Pattern::Pattern(const std::string &string) : value(string) {}; - pattern_ptr pattern(const std::string &value) { + rule_ptr pattern(const std::string &value) { return std::make_shared(value); } diff --git a/src/compiler/rules/pattern.h b/src/compiler/rules/pattern.h index b08b8ea1..d0d30834 100644 --- a/src/compiler/rules/pattern.h +++ b/src/compiler/rules/pattern.h @@ -15,8 +15,7 @@ namespace tree_sitter { rule_ptr to_rule_tree() const; }; - typedef std::shared_ptr pattern_ptr; - pattern_ptr pattern(const std::string &value); + rule_ptr pattern(const std::string &value); } } diff --git a/src/compiler/rules/rule_visitor.cpp b/src/compiler/rules/rule_visitor.cpp new file mode 100644 index 00000000..508f7e01 --- /dev/null +++ b/src/compiler/rules/rule_visitor.cpp @@ -0,0 +1,15 @@ +#include "rule_visitor.h" + +namespace tree_sitter { + namespace rules { + void RuleVisitor::visit(const Blank *rule) {} + void RuleVisitor::visit(const Symbol *rule) {} + void RuleVisitor::visit(const Char *rule) {} + void RuleVisitor::visit(const CharClass *rule) {} + void RuleVisitor::visit(const Choice *rule) {} + void RuleVisitor::visit(const Repeat *rule) {} + void RuleVisitor::visit(const Seq *rule) {} + void RuleVisitor::visit(const String *rule) {} + void RuleVisitor::visit(const Pattern *rule) {} + } +} \ No newline at end of file diff --git a/src/compiler/rules/rule_visitor.h b/src/compiler/rules/rule_visitor.h index 26cf3e48..9e83b3d0 100644 --- a/src/compiler/rules/rule_visitor.h +++ b/src/compiler/rules/rule_visitor.h @@ -7,15 +7,15 @@ namespace tree_sitter { namespace rules { class RuleVisitor { public: - virtual void visit(const Blank *rule) = 0; - virtual void visit(const Symbol *rule) = 0; - virtual void visit(const Char *rule) = 0; - virtual void visit(const CharClass *rule) = 0; - virtual void visit(const Choice *rule) = 0; - virtual void visit(const Repeat *rule) = 0; - virtual void visit(const Seq *rule) = 0; - virtual void visit(const String *rule) = 0; - virtual void visit(const Pattern *rule) = 0; + virtual void visit(const Blank *rule); + virtual void visit(const Symbol *rule); + virtual void visit(const Char *rule); + virtual void visit(const CharClass *rule); + virtual void visit(const Choice *rule); + virtual void visit(const Repeat *rule); + virtual void visit(const Seq *rule); + virtual void visit(const String *rule); + virtual void visit(const Pattern *rule); }; } } diff --git a/src/compiler/rules/string.cpp b/src/compiler/rules/string.cpp index 652d69d2..e57a998a 100644 --- a/src/compiler/rules/string.cpp +++ b/src/compiler/rules/string.cpp @@ -5,7 +5,7 @@ namespace tree_sitter { namespace rules { String::String(std::string value) : value(value) {}; - string_ptr str(const std::string &value) { + rule_ptr str(const std::string &value) { return std::make_shared(value); } diff --git a/src/compiler/rules/string.h b/src/compiler/rules/string.h index bd99bd5f..53e99ecb 100644 --- a/src/compiler/rules/string.h +++ b/src/compiler/rules/string.h @@ -15,8 +15,7 @@ namespace tree_sitter { const std::string value; }; - typedef std::shared_ptr string_ptr; - string_ptr str(const std::string &value); + rule_ptr str(const std::string &value); } } diff --git a/src/compiler/rules/symbol.cpp b/src/compiler/rules/symbol.cpp index b6323b9a..f9e51f46 100644 --- a/src/compiler/rules/symbol.cpp +++ b/src/compiler/rules/symbol.cpp @@ -5,7 +5,7 @@ namespace tree_sitter { namespace rules { Symbol::Symbol(const std::string &name) : name(name) {}; - sym_ptr sym(const std::string &name) { + rule_ptr sym(const std::string &name) { return std::make_shared(name); } diff --git a/src/compiler/rules/symbol.h b/src/compiler/rules/symbol.h index a4b3cbfc..bda020a0 100644 --- a/src/compiler/rules/symbol.h +++ b/src/compiler/rules/symbol.h @@ -15,8 +15,7 @@ namespace tree_sitter { const std::string name; }; - typedef std::shared_ptr sym_ptr; - sym_ptr sym(const std::string &name); + rule_ptr sym(const std::string &name); } }