Get rid of types for shared pointers to rule subclasses
This commit is contained in:
parent
c3b8a73831
commit
9f78d72a7c
14 changed files with 53 additions and 37 deletions
|
|
@ -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 = "<group>"; };
|
||||
12FD40E1186245FE0041A84E /* transitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transitions.h; sourceTree = "<group>"; };
|
||||
12FD40E41862B3530041A84E /* rule_visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rule_visitor.h; sourceTree = "<group>"; };
|
||||
12FD40E618639B910041A84E /* rule_visitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rule_visitor.cpp; sourceTree = "<group>"; };
|
||||
27A340F3EEB184C040521323 /* pattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pattern.cpp; sourceTree = "<group>"; };
|
||||
27A3438C4FA59A3882E8493B /* pattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pattern.h; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
|
@ -182,6 +184,7 @@
|
|||
12FD40E0186245FE0041A84E /* transitions.cpp */,
|
||||
12FD40E1186245FE0041A84E /* transitions.h */,
|
||||
12FD40E41862B3530041A84E /* rule_visitor.h */,
|
||||
12FD40E618639B910041A84E /* rule_visitor.cpp */,
|
||||
);
|
||||
path = rules;
|
||||
sourceTree = "<group>";
|
||||
|
|
@ -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 */,
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -23,11 +23,11 @@ namespace tree_sitter {
|
|||
});
|
||||
};
|
||||
|
||||
vector<rules::sym_ptr> Item::next_symbols() const {
|
||||
vector<rules::sym_ptr> result;
|
||||
vector<rules::Symbol> Item::next_symbols() const {
|
||||
vector<rules::Symbol> result;
|
||||
for (auto pair : rules::transitions(rule)) {
|
||||
shared_ptr<const rules::Symbol> sym = dynamic_pointer_cast<const rules::Symbol>(pair.first);
|
||||
if (sym) result.push_back(sym);
|
||||
if (sym) result.push_back(*sym);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace tree_sitter {
|
|||
static Item at_beginning_of_rule(const std::string &rule_name, const Grammar &grammar);
|
||||
|
||||
TransitionMap<Item> transitions() const;
|
||||
std::vector<rules::sym_ptr> next_symbols() const;
|
||||
std::vector<rules::Symbol> next_symbols() const;
|
||||
bool operator==(const Item &other) const;
|
||||
bool is_done() const;
|
||||
|
||||
|
|
|
|||
|
|
@ -16,8 +16,8 @@ namespace tree_sitter {
|
|||
static void add_item(vector<Item> &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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<const rules::Symbol>(transition.first);
|
||||
auto symbol = static_pointer_cast<const rules::Symbol>(transition.first);
|
||||
size_t new_state_index = add_item_set(*transition.second);
|
||||
table.add_action(state_index, symbol->name, ParseAction::Shift(new_state_index));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<Pattern>(value);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,8 +15,7 @@ namespace tree_sitter {
|
|||
rule_ptr to_rule_tree() const;
|
||||
};
|
||||
|
||||
typedef std::shared_ptr<const Pattern> pattern_ptr;
|
||||
pattern_ptr pattern(const std::string &value);
|
||||
rule_ptr pattern(const std::string &value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
15
src/compiler/rules/rule_visitor.cpp
Normal file
15
src/compiler/rules/rule_visitor.cpp
Normal file
|
|
@ -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) {}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<String>(value);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,8 +15,7 @@ namespace tree_sitter {
|
|||
const std::string value;
|
||||
};
|
||||
|
||||
typedef std::shared_ptr<const String> string_ptr;
|
||||
string_ptr str(const std::string &value);
|
||||
rule_ptr str(const std::string &value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<Symbol>(name);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,8 +15,7 @@ namespace tree_sitter {
|
|||
const std::string name;
|
||||
};
|
||||
|
||||
typedef std::shared_ptr<const Symbol> sym_ptr;
|
||||
sym_ptr sym(const std::string &name);
|
||||
rule_ptr sym(const std::string &name);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue