Add character rule class
This commit is contained in:
parent
061d8a8efc
commit
849f2ee195
3 changed files with 78 additions and 30 deletions
|
|
@ -5,60 +5,79 @@
|
|||
using namespace std;
|
||||
using namespace igloo;
|
||||
using namespace tree_sitter;
|
||||
using namespace tree_sitter::rules;
|
||||
|
||||
EqualsContainerConstraint<
|
||||
TransitionMap<rules::Rule>,
|
||||
bool (*)(const TransitionMap<rules::Rule>::pair_type &, const TransitionMap<rules::Rule>::pair_type &)
|
||||
>
|
||||
EqualsTransitionMap(const TransitionMap<rules::Rule> &expected) {
|
||||
return EqualsContainer(expected, TransitionMap<rules::Rule>::elements_equal);
|
||||
}
|
||||
|
||||
Describe(Rules) {
|
||||
Describe(transitions) {
|
||||
Symbol symbol1 = Symbol(1);
|
||||
Symbol symbol2 = Symbol(2);
|
||||
Symbol symbol3 = Symbol(3);
|
||||
Symbol symbol4 = Symbol(3);
|
||||
rules::Symbol symbol1 = rules::Symbol(1);
|
||||
rules::Symbol symbol2 = rules::Symbol(2);
|
||||
rules::Symbol symbol3 = rules::Symbol(3);
|
||||
rules::Symbol symbol4 = rules::Symbol(3);
|
||||
|
||||
It(handles_symbols) {
|
||||
AssertThat(
|
||||
symbol1.transitions(),
|
||||
EqualsContainer(TransitionMap<Rule>(
|
||||
EqualsTransitionMap(TransitionMap<rules::Rule>(
|
||||
{ symbol1.copy() },
|
||||
{ new Blank() }
|
||||
), TransitionMap<Rule>::elements_equal));
|
||||
{ new rules::Blank() }
|
||||
)));
|
||||
}
|
||||
|
||||
It(handles_characters) {
|
||||
rules::Char char1 = rules::Char('a');
|
||||
AssertThat(
|
||||
char1.transitions(),
|
||||
EqualsTransitionMap(TransitionMap<rules::Rule>(
|
||||
{ char1.copy() },
|
||||
{ new rules::Blank() }
|
||||
)));
|
||||
}
|
||||
|
||||
It(handles_choices) {
|
||||
AssertThat(
|
||||
Choice(symbol1, symbol2).transitions(),
|
||||
EqualsContainer(TransitionMap<Rule>(
|
||||
rules::Choice(symbol1, symbol2).transitions(),
|
||||
EqualsTransitionMap(TransitionMap<rules::Rule>(
|
||||
{ symbol1.copy(), symbol2.copy() },
|
||||
{ new Blank(), new Blank() }
|
||||
), TransitionMap<Rule>::elements_equal));
|
||||
{ new rules::Blank(), new rules::Blank() }
|
||||
)));
|
||||
}
|
||||
|
||||
It(handles_sequences) {
|
||||
AssertThat(
|
||||
Seq(symbol1, symbol2).transitions(),
|
||||
EqualsContainer(TransitionMap<Rule>(
|
||||
rules::Seq(symbol1, symbol2).transitions(),
|
||||
EqualsTransitionMap(TransitionMap<rules::Rule>(
|
||||
{ symbol1.copy() },
|
||||
{ symbol2.copy() }
|
||||
), TransitionMap<Rule>::elements_equal));
|
||||
)));
|
||||
}
|
||||
|
||||
It(handles_long_sequences) {
|
||||
AssertThat(
|
||||
Seq(Seq(symbol1, symbol2), Seq(symbol3, symbol4)).transitions(),
|
||||
EqualsContainer(TransitionMap<Rule>(
|
||||
rules::Seq(
|
||||
rules::Seq(symbol1, symbol2),
|
||||
rules::Seq(symbol3, symbol4)).transitions(),
|
||||
EqualsTransitionMap(TransitionMap<rules::Rule>(
|
||||
{ symbol1.copy() },
|
||||
{ new Seq(symbol2, Seq(symbol3, symbol4)) }
|
||||
), TransitionMap<Rule>::elements_equal));
|
||||
{ new rules::Seq(symbol2, rules::Seq(symbol3, symbol4)) }
|
||||
)));
|
||||
}
|
||||
|
||||
It(handles_choices_with_common_starting_symbols) {
|
||||
AssertThat(
|
||||
Choice(
|
||||
Seq(symbol1, symbol2),
|
||||
Seq(symbol1, symbol3)).transitions(),
|
||||
EqualsContainer(TransitionMap<Rule>(
|
||||
rules::Choice(
|
||||
rules::Seq(symbol1, symbol2),
|
||||
rules::Seq(symbol1, symbol3)).transitions(),
|
||||
EqualsTransitionMap(TransitionMap<rules::Rule>(
|
||||
{ symbol1.copy() },
|
||||
{ new Choice(symbol2, symbol3) }
|
||||
), TransitionMap<Rule>::elements_equal));
|
||||
{ new rules::Choice(symbol2, symbol3) }
|
||||
)));
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,9 +6,11 @@ using namespace std;
|
|||
|
||||
namespace tree_sitter {
|
||||
namespace rules {
|
||||
|
||||
// Constructors
|
||||
Blank::Blank() {}
|
||||
Symbol::Symbol(int id) : id(id) {};
|
||||
Char::Char(char value) : value(value) {};
|
||||
Seq::Seq(const Rule &left, const Rule &right) : left(left.copy()), right(right.copy()) {};
|
||||
Seq::Seq(const Rule *left, const Rule *right) : left(left), right(right) {};
|
||||
Seq::Seq(shared_ptr<const Rule> left, shared_ptr<const Rule> right) : left(left), right(right) {};
|
||||
|
|
@ -24,6 +26,10 @@ namespace tree_sitter {
|
|||
TransitionMap<Rule> Symbol::transitions() const {
|
||||
return TransitionMap<Rule>({ copy() }, { new Blank() });
|
||||
}
|
||||
|
||||
TransitionMap<Rule> Char::transitions() const {
|
||||
return TransitionMap<Rule>({ copy() }, { new Blank() });
|
||||
}
|
||||
|
||||
TransitionMap<Rule> Choice::transitions() const {
|
||||
auto result = left->transitions();
|
||||
|
|
@ -35,11 +41,10 @@ namespace tree_sitter {
|
|||
|
||||
TransitionMap<Rule> Seq::transitions() const {
|
||||
return left->transitions().map([&](rule_ptr left_rule) -> rule_ptr {
|
||||
if (typeid(*left_rule) == typeid(Blank)) {
|
||||
if (typeid(*left_rule) == typeid(Blank))
|
||||
return right;
|
||||
} else {
|
||||
else
|
||||
return rule_ptr(new Seq(left_rule, right));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -53,6 +58,11 @@ namespace tree_sitter {
|
|||
return (other != NULL) && (other->id == id);
|
||||
}
|
||||
|
||||
bool Char::operator==(const Rule &rule) const {
|
||||
const Char *other = dynamic_cast<const Char *>(&rule);
|
||||
return (other != NULL) && (other->value == value);
|
||||
}
|
||||
|
||||
bool Choice::operator==(const Rule &rule) const {
|
||||
const Choice *other = dynamic_cast<const Choice *>(&rule);
|
||||
return (other != NULL) && (*other->left == *left) && (*other->right == *right);
|
||||
|
|
@ -71,7 +81,11 @@ namespace tree_sitter {
|
|||
Symbol * Symbol::copy() const {
|
||||
return new Symbol(id);
|
||||
}
|
||||
|
||||
|
||||
Char * Char::copy() const {
|
||||
return new Char(value);
|
||||
}
|
||||
|
||||
Choice * Choice::copy() const {
|
||||
return new Choice(left, right);
|
||||
}
|
||||
|
|
@ -86,7 +100,11 @@ namespace tree_sitter {
|
|||
}
|
||||
|
||||
string Symbol::to_string() const {
|
||||
return string(std::to_string(id));
|
||||
return std::to_string(id);
|
||||
}
|
||||
|
||||
string Char::to_string() const {
|
||||
return std::to_string(value);
|
||||
}
|
||||
|
||||
string Choice::to_string() const {
|
||||
|
|
|
|||
11
src/rules.h
11
src/rules.h
|
|
@ -36,6 +36,17 @@ namespace tree_sitter {
|
|||
private:
|
||||
int id;
|
||||
};
|
||||
|
||||
class Char : public Rule {
|
||||
public:
|
||||
Char(char value);
|
||||
TransitionMap<Rule> transitions() const;
|
||||
Char * copy() const;
|
||||
bool operator==(const Rule& other) const;
|
||||
std::string to_string() const;
|
||||
private:
|
||||
char value;
|
||||
};
|
||||
|
||||
class Choice : public Rule {
|
||||
public:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue