Refactor classes representing individual characters & character classes
This commit is contained in:
parent
8dec6c90f4
commit
9667b3fd6c
17 changed files with 167 additions and 120 deletions
|
|
@ -7,7 +7,7 @@
|
|||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
12130605182C348F00FCF928 /* char.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130603182C348F00FCF928 /* char.cpp */; };
|
||||
12130605182C348F00FCF928 /* character.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130603182C348F00FCF928 /* character.cpp */; };
|
||||
1213060B182C389100FCF928 /* symbol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130609182C389100FCF928 /* symbol.cpp */; };
|
||||
1213060E182C398300FCF928 /* choice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1213060C182C398300FCF928 /* choice.cpp */; };
|
||||
12130611182C3A1100FCF928 /* blank.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1213060F182C3A1100FCF928 /* blank.cpp */; };
|
||||
|
|
@ -21,7 +21,6 @@
|
|||
125120A4183083BD00C9B56A /* arithmetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 125120A3183083BD00C9B56A /* arithmetic.cpp */; };
|
||||
129D242C183EB1EB00FE9F71 /* parse_table_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 129D242A183EB1EB00FE9F71 /* parse_table_builder.cpp */; };
|
||||
12D136A4183678A2005F3369 /* repeat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A2183678A2005F3369 /* repeat.cpp */; };
|
||||
12F8BE8E183C79B2006CCF99 /* char_class.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F8BE8C183C79B2006CCF99 /* char_class.cpp */; };
|
||||
12F9A64E182DD5FD00FAF50C /* spec_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */; };
|
||||
12F9A651182DD6BC00FAF50C /* grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F9A64F182DD6BC00FAF50C /* grammar.cpp */; };
|
||||
12FD4061185E68470041A84E /* c_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD405F185E68470041A84E /* c_code.cpp */; };
|
||||
|
|
@ -31,7 +30,6 @@
|
|||
12FD40B6185EEB5E0041A84E /* arithmetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 125120A3183083BD00C9B56A /* arithmetic.cpp */; };
|
||||
12FD40B8185EEB5E0041A84E /* item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130619182C84DF00FCF928 /* item.cpp */; };
|
||||
12FD40B9185EEB5E0041A84E /* string.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130615182C3D2900FCF928 /* string.cpp */; };
|
||||
12FD40BA185EEB5E0041A84E /* char_class.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F8BE8C183C79B2006CCF99 /* char_class.cpp */; };
|
||||
12FD40BB185EEB5E0041A84E /* blank.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1213060F182C3A1100FCF928 /* blank.cpp */; };
|
||||
12FD40BD185EEB5E0041A84E /* choice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1213060C182C398300FCF928 /* choice.cpp */; };
|
||||
12FD40BF185EEB5E0041A84E /* c_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD405F185E68470041A84E /* c_code.cpp */; };
|
||||
|
|
@ -40,7 +38,7 @@
|
|||
12FD40C3185EEB5E0041A84E /* grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F9A64F182DD6BC00FAF50C /* grammar.cpp */; };
|
||||
12FD40C6185EEB5E0041A84E /* repeat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A2183678A2005F3369 /* repeat.cpp */; };
|
||||
12FD40C7185EEB5E0041A84E /* item_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130620182C85D300FCF928 /* item_set.cpp */; };
|
||||
12FD40C8185EEB5E0041A84E /* char.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130603182C348F00FCF928 /* char.cpp */; };
|
||||
12FD40C8185EEB5E0041A84E /* character.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130603182C348F00FCF928 /* character.cpp */; };
|
||||
12FD40C9185EEB5E0041A84E /* symbol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130609182C389100FCF928 /* symbol.cpp */; };
|
||||
12FD40CA185EEB5E0041A84E /* rule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1251209A1830145300C9B56A /* rule.cpp */; };
|
||||
12FD40CB185EEB5E0041A84E /* pattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27A340F3EEB184C040521323 /* pattern.cpp */; };
|
||||
|
|
@ -59,6 +57,8 @@
|
|||
12FD40EE186641430041A84E /* rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40E818641FB70041A84E /* rules.cpp */; };
|
||||
12FD40EF186641510041A84E /* transitions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40E0186245FE0041A84E /* transitions.cpp */; };
|
||||
12FD40F01866415D0041A84E /* visitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40E618639B910041A84E /* visitor.cpp */; };
|
||||
12FD40F3186641C00041A84E /* char_match.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40F1186641C00041A84E /* char_match.cpp */; };
|
||||
12FD40F4186641C00041A84E /* char_match.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40F1186641C00041A84E /* char_match.cpp */; };
|
||||
27A343CA69E17E0F9EBEDF1C /* pattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27A340F3EEB184C040521323 /* pattern.cpp */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
|
|
@ -84,8 +84,8 @@
|
|||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
12130603182C348F00FCF928 /* char.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = char.cpp; sourceTree = "<group>"; };
|
||||
12130604182C348F00FCF928 /* char.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = char.h; sourceTree = "<group>"; };
|
||||
12130603182C348F00FCF928 /* character.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = character.cpp; sourceTree = "<group>"; };
|
||||
12130604182C348F00FCF928 /* character.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = character.h; sourceTree = "<group>"; };
|
||||
12130607182C374800FCF928 /* rule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rule.h; sourceTree = "<group>"; };
|
||||
12130609182C389100FCF928 /* symbol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = symbol.cpp; sourceTree = "<group>"; };
|
||||
1213060A182C389100FCF928 /* symbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symbol.h; sourceTree = "<group>"; };
|
||||
|
|
@ -120,8 +120,6 @@
|
|||
12D136A3183678A2005F3369 /* repeat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = repeat.h; sourceTree = "<group>"; };
|
||||
12E71794181D02A80051A649 /* specs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; name = specs; path = compiler_specs; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
12E71852181D081C0051A649 /* rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rules.h; path = src/compiler/rules/rules.h; sourceTree = SOURCE_ROOT; };
|
||||
12F8BE8C183C79B2006CCF99 /* char_class.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = char_class.cpp; sourceTree = "<group>"; };
|
||||
12F8BE8D183C79B2006CCF99 /* char_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = char_class.h; sourceTree = "<group>"; };
|
||||
12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = spec_helper.cpp; path = spec/compiler/spec_helper.cpp; sourceTree = SOURCE_ROOT; };
|
||||
12F9A64D182DD5FD00FAF50C /* spec_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spec_helper.h; path = spec/compiler/spec_helper.h; sourceTree = SOURCE_ROOT; };
|
||||
12F9A64F182DD6BC00FAF50C /* grammar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = grammar.cpp; sourceTree = "<group>"; };
|
||||
|
|
@ -140,6 +138,8 @@
|
|||
12FD40E41862B3530041A84E /* visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = visitor.h; sourceTree = "<group>"; };
|
||||
12FD40E618639B910041A84E /* visitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = visitor.cpp; sourceTree = "<group>"; };
|
||||
12FD40E818641FB70041A84E /* rules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rules.cpp; sourceTree = "<group>"; };
|
||||
12FD40F1186641C00041A84E /* char_match.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = char_match.cpp; sourceTree = "<group>"; };
|
||||
12FD40F2186641C00041A84E /* char_match.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = char_match.h; 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 */
|
||||
|
|
@ -167,10 +167,8 @@
|
|||
children = (
|
||||
1213060F182C3A1100FCF928 /* blank.cpp */,
|
||||
12130610182C3A1100FCF928 /* blank.h */,
|
||||
12130603182C348F00FCF928 /* char.cpp */,
|
||||
12130604182C348F00FCF928 /* char.h */,
|
||||
12F8BE8C183C79B2006CCF99 /* char_class.cpp */,
|
||||
12F8BE8D183C79B2006CCF99 /* char_class.h */,
|
||||
12130603182C348F00FCF928 /* character.cpp */,
|
||||
12130604182C348F00FCF928 /* character.h */,
|
||||
1213060C182C398300FCF928 /* choice.cpp */,
|
||||
1213060D182C398300FCF928 /* choice.h */,
|
||||
27A340F3EEB184C040521323 /* pattern.cpp */,
|
||||
|
|
@ -306,6 +304,8 @@
|
|||
12130618182C84B700FCF928 /* lr */,
|
||||
12130602182C344400FCF928 /* rules */,
|
||||
12C344421822F27700B07BE3 /* transition_map.h */,
|
||||
12FD40F1186641C00041A84E /* char_match.cpp */,
|
||||
12FD40F2186641C00041A84E /* char_match.h */,
|
||||
);
|
||||
path = compiler;
|
||||
sourceTree = "<group>";
|
||||
|
|
@ -433,7 +433,6 @@
|
|||
12FD40D9185FEEDF0041A84E /* pattern_spec.cpp in Sources */,
|
||||
12130617182C3D2900FCF928 /* string.cpp in Sources */,
|
||||
12FD40E2186245FE0041A84E /* transitions.cpp in Sources */,
|
||||
12F8BE8E183C79B2006CCF99 /* char_class.cpp in Sources */,
|
||||
12130611182C3A1100FCF928 /* blank.cpp in Sources */,
|
||||
1213060E182C398300FCF928 /* choice.cpp in Sources */,
|
||||
12F9A64E182DD5FD00FAF50C /* spec_helper.cpp in Sources */,
|
||||
|
|
@ -446,9 +445,10 @@
|
|||
12F9A651182DD6BC00FAF50C /* grammar.cpp in Sources */,
|
||||
12FD40D6185FEEDB0041A84E /* parse_table_builder_spec.cpp in Sources */,
|
||||
12D136A4183678A2005F3369 /* repeat.cpp in Sources */,
|
||||
12FD40F3186641C00041A84E /* char_match.cpp in Sources */,
|
||||
12FD40E718639B910041A84E /* visitor.cpp in Sources */,
|
||||
12130622182C85D300FCF928 /* item_set.cpp in Sources */,
|
||||
12130605182C348F00FCF928 /* char.cpp in Sources */,
|
||||
12130605182C348F00FCF928 /* character.cpp in Sources */,
|
||||
1213060B182C389100FCF928 /* symbol.cpp in Sources */,
|
||||
1251209B1830145300C9B56A /* rule.cpp in Sources */,
|
||||
27A343CA69E17E0F9EBEDF1C /* pattern.cpp in Sources */,
|
||||
|
|
@ -466,8 +466,8 @@
|
|||
12FD40B8185EEB5E0041A84E /* item.cpp in Sources */,
|
||||
12FD40B9185EEB5E0041A84E /* string.cpp in Sources */,
|
||||
12FD40EF186641510041A84E /* transitions.cpp in Sources */,
|
||||
12FD40BA185EEB5E0041A84E /* char_class.cpp in Sources */,
|
||||
12FD40BB185EEB5E0041A84E /* blank.cpp in Sources */,
|
||||
12FD40F4186641C00041A84E /* char_match.cpp in Sources */,
|
||||
12FD40BD185EEB5E0041A84E /* choice.cpp in Sources */,
|
||||
12FD40DF1860064C0041A84E /* tree.c in Sources */,
|
||||
12FD40BF185EEB5E0041A84E /* c_code.cpp in Sources */,
|
||||
|
|
@ -479,7 +479,7 @@
|
|||
12FD40C3185EEB5E0041A84E /* grammar.cpp in Sources */,
|
||||
12FD40C6185EEB5E0041A84E /* repeat.cpp in Sources */,
|
||||
12FD40C7185EEB5E0041A84E /* item_set.cpp in Sources */,
|
||||
12FD40C8185EEB5E0041A84E /* char.cpp in Sources */,
|
||||
12FD40C8185EEB5E0041A84E /* character.cpp in Sources */,
|
||||
12FD40C9185EEB5E0041A84E /* symbol.cpp in Sources */,
|
||||
12FD40CA185EEB5E0041A84E /* rule.cpp in Sources */,
|
||||
12FD40EE186641430041A84E /* rules.cpp in Sources */,
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@ Describe(item_sets) {
|
|||
AssertThat(
|
||||
set.char_transitions(grammar),
|
||||
Equals(transition_map<rules::Rule, ItemSet>({
|
||||
{ char_class(CharClassTypeWord), item_set({ Item("variable", choice({ repeat(char_class(CharClassTypeWord)), blank() }), 1) }) },
|
||||
{ char_class(CharClassTypeDigit), item_set({ Item("number", choice({ repeat(char_class(CharClassTypeDigit)), blank() }), 1) }) },
|
||||
{ character(CharClassWord), item_set({ Item("variable", choice({ repeat(character(CharClassWord)), blank() }), 1) }) },
|
||||
{ character(CharClassDigit), item_set({ Item("number", choice({ repeat(character(CharClassDigit)), blank() }), 1) }) },
|
||||
{ character('('), item_set({ Item("left_paren", blank(), 1) }) }
|
||||
})));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,9 +21,9 @@ Describe(pattern_rules) {
|
|||
AssertThat(
|
||||
rule.to_rule_tree()->to_string(),
|
||||
Equals(seq({
|
||||
char_class(CharClassTypeWord),
|
||||
character(CharClassWord),
|
||||
character('-'),
|
||||
char_class(CharClassTypeDigit)
|
||||
character(CharClassDigit)
|
||||
})->to_string()));
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ Describe(Rules) {
|
|||
}
|
||||
|
||||
It(handles_character_classes) {
|
||||
auto rule = rules::char_class(rules::CharClassTypeDigit);
|
||||
auto rule = rules::character(CharClassDigit);
|
||||
AssertThat(
|
||||
rules::transitions(rule),
|
||||
Equals(transition_map<rules::Rule, rules::Rule>({
|
||||
|
|
|
|||
62
src/compiler/char_match.cpp
Normal file
62
src/compiler/char_match.cpp
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
#include "char_match.h"
|
||||
|
||||
using std::string;
|
||||
|
||||
namespace tree_sitter {
|
||||
CharMatch CharMatchSpecific(char value) {
|
||||
CharMatch result = { .type = CharMatchTypeSpecific };
|
||||
result.value.character = value;
|
||||
return result;
|
||||
}
|
||||
|
||||
CharMatch CharMatchClass(CharClass value) {
|
||||
CharMatch result = { .type = CharMatchTypeSpecific };
|
||||
result.value.character = value;
|
||||
return result;
|
||||
}
|
||||
|
||||
CharMatch CharMatchRange(char min, char max) {
|
||||
CharMatch result = { .type = CharMatchTypeSpecific };
|
||||
result.value.range.min_character = min;
|
||||
result.value.range.max_character = max;
|
||||
return result;
|
||||
}
|
||||
|
||||
string CharMatchToString(CharMatch match) {
|
||||
switch (match.type) {
|
||||
case CharMatchTypeClass:
|
||||
switch (match.value.character_class) {
|
||||
case CharClassDigit:
|
||||
return "<digit>";
|
||||
case CharClassWord:
|
||||
return "<word>";
|
||||
}
|
||||
case CharMatchTypeSpecific:
|
||||
return string("'") + string(&match.value.character) + "'";
|
||||
case CharMatchTypeRange:
|
||||
return (
|
||||
string("'") +
|
||||
string(&match.value.range.min_character) + "-" +
|
||||
string(&match.value.range.max_character) + "'");
|
||||
}
|
||||
}
|
||||
|
||||
bool operator==(const CharMatch &left, const CharMatch &right) {
|
||||
if (left.type != right.type)
|
||||
return false;
|
||||
switch (left.type) {
|
||||
case CharMatchTypeClass:
|
||||
return (left.value.character_class == right.value.character_class);
|
||||
case CharMatchTypeSpecific:
|
||||
return (left.value.character == right.value.character);
|
||||
case CharMatchTypeRange:
|
||||
return (
|
||||
left.value.range.min_character == right.value.range.min_character &&
|
||||
left.value.range.max_character == right.value.range.max_character);
|
||||
}
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& stream, const CharMatch &match) {
|
||||
return stream << CharMatchToString(match);
|
||||
}
|
||||
}
|
||||
39
src/compiler/char_match.h
Normal file
39
src/compiler/char_match.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
#ifndef __TreeSitter__char_match__
|
||||
#define __TreeSitter__char_match__
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace tree_sitter {
|
||||
typedef enum {
|
||||
CharMatchTypeSpecific,
|
||||
CharMatchTypeClass,
|
||||
CharMatchTypeRange,
|
||||
} CharMatchType;
|
||||
|
||||
typedef enum {
|
||||
CharClassWord,
|
||||
CharClassDigit
|
||||
} CharClass;
|
||||
|
||||
struct CharMatch {
|
||||
CharMatchType type;
|
||||
union {
|
||||
CharClass character_class;
|
||||
char character;
|
||||
struct {
|
||||
char min_character;
|
||||
char max_character;
|
||||
} range;
|
||||
} value;
|
||||
};
|
||||
|
||||
CharMatch CharMatchSpecific(char);
|
||||
CharMatch CharMatchClass(CharClass);
|
||||
CharMatch CharMatchRange(char, char);
|
||||
std::string CharMatchToString(CharMatch);
|
||||
|
||||
bool operator==(const CharMatch &, const CharMatch &);
|
||||
std::ostream& operator<<(std::ostream& stream, const CharMatch &rule);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
#include "rules.h"
|
||||
#include "transition_map.h"
|
||||
|
||||
using std::string;
|
||||
|
||||
namespace tree_sitter {
|
||||
namespace rules {
|
||||
Char::Char(char value) : value(value) {};
|
||||
|
||||
bool Char::operator==(const Rule &rule) const {
|
||||
const Char *other = dynamic_cast<const Char *>(&rule);
|
||||
return other && (other->value == value);
|
||||
}
|
||||
|
||||
string Char::to_string() const {
|
||||
return string("'") + value + "'";
|
||||
}
|
||||
|
||||
void Char::accept(Visitor &visitor) const {
|
||||
visitor.visit(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
#include "rules.h"
|
||||
#include "transition_map.h"
|
||||
|
||||
using std::string;
|
||||
|
||||
namespace tree_sitter {
|
||||
namespace rules {
|
||||
CharClass::CharClass(CharClassType value) : value(value) {};
|
||||
|
||||
bool CharClass::operator==(const Rule &rule) const {
|
||||
const CharClass *other = dynamic_cast<const CharClass *>(&rule);
|
||||
return other && (other->value == value);
|
||||
}
|
||||
|
||||
string CharClass::to_string() const {
|
||||
switch (value) {
|
||||
case CharClassTypeDigit:
|
||||
return "<digit>";
|
||||
case CharClassTypeWord:
|
||||
return "<word>";
|
||||
}
|
||||
}
|
||||
|
||||
void CharClass::accept(Visitor &visitor) const {
|
||||
visitor.visit(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
#ifndef __tree_sitter__char_class__
|
||||
#define __tree_sitter__char_class__
|
||||
|
||||
#include "rule.h"
|
||||
|
||||
namespace tree_sitter {
|
||||
namespace rules {
|
||||
typedef enum {
|
||||
CharClassTypeWord,
|
||||
CharClassTypeDigit
|
||||
} CharClassType;
|
||||
|
||||
class CharClass : public Rule {
|
||||
public:
|
||||
CharClass(CharClassType type);
|
||||
bool operator==(const Rule& other) const;
|
||||
std::string to_string() const;
|
||||
void accept(Visitor &visitor) const;
|
||||
|
||||
const CharClassType value;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
25
src/compiler/rules/character.cpp
Normal file
25
src/compiler/rules/character.cpp
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#include "rules.h"
|
||||
#include "transition_map.h"
|
||||
|
||||
using std::string;
|
||||
|
||||
namespace tree_sitter {
|
||||
namespace rules {
|
||||
Character::Character(char value) : value(CharMatchSpecific(value)) {};
|
||||
Character::Character(CharClass value) : value(CharMatchClass(value)) {};
|
||||
Character::Character(char min, char max) : value(CharMatchRange(min, max)) {};
|
||||
|
||||
bool Character::operator==(const Rule &rule) const {
|
||||
const Character *other = dynamic_cast<const Character *>(&rule);
|
||||
return other && (other->value == value);
|
||||
}
|
||||
|
||||
string Character::to_string() const {
|
||||
return CharMatchToString(value);
|
||||
}
|
||||
|
||||
void Character::accept(Visitor &visitor) const {
|
||||
visitor.visit(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,17 +2,20 @@
|
|||
#define __tree_sitter__char__
|
||||
|
||||
#include "rule.h"
|
||||
#include "char_match.h"
|
||||
|
||||
namespace tree_sitter {
|
||||
namespace rules {
|
||||
class Char : public Rule {
|
||||
class Character : public Rule {
|
||||
public:
|
||||
Char(char value);
|
||||
Character(char character);
|
||||
Character(CharClass character_class);
|
||||
Character(char min_character, char max_character);
|
||||
bool operator==(const Rule& other) const;
|
||||
std::string to_string() const;
|
||||
void accept(Visitor &visitor) const;
|
||||
|
||||
const char value;
|
||||
const CharMatch value;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -71,9 +71,9 @@ namespace tree_sitter {
|
|||
case ')':
|
||||
return character(value);
|
||||
case 'w':
|
||||
return char_class(CharClassTypeWord);
|
||||
return character(CharClassWord);
|
||||
case 'd':
|
||||
return char_class(CharClassTypeDigit);
|
||||
return character(CharClassDigit);
|
||||
default:
|
||||
error("unrecognized escape sequence");
|
||||
return rule_ptr();
|
||||
|
|
|
|||
|
|
@ -11,13 +11,13 @@ namespace tree_sitter {
|
|||
}
|
||||
|
||||
rule_ptr character(char value) {
|
||||
return make_shared<Char>(value);
|
||||
return make_shared<Character>(value);
|
||||
}
|
||||
|
||||
rule_ptr char_class(CharClassType type) {
|
||||
return make_shared<CharClass>(type);
|
||||
|
||||
rule_ptr character(CharClass value) {
|
||||
return make_shared<Character>(value);
|
||||
}
|
||||
|
||||
|
||||
rule_ptr choice(const initializer_list<rule_ptr> &rules) {
|
||||
rule_ptr result;
|
||||
for (auto rule : rules)
|
||||
|
|
|
|||
|
|
@ -8,8 +8,7 @@
|
|||
#include "seq.h"
|
||||
#include "string.h"
|
||||
#include "pattern.h"
|
||||
#include "char.h"
|
||||
#include "char_class.h"
|
||||
#include "character.h"
|
||||
#include "repeat.h"
|
||||
#include "visitor.h"
|
||||
|
||||
|
|
@ -17,7 +16,8 @@ namespace tree_sitter {
|
|||
namespace rules {
|
||||
rule_ptr blank();
|
||||
rule_ptr character(char value);
|
||||
rule_ptr char_class(CharClassType value);
|
||||
rule_ptr character(char min, char max);
|
||||
rule_ptr character(CharClass value);
|
||||
rule_ptr choice(const std::initializer_list<rule_ptr> &rules);
|
||||
rule_ptr pattern(const std::string &value);
|
||||
rule_ptr repeat(const rule_ptr content);
|
||||
|
|
|
|||
|
|
@ -11,12 +11,8 @@ namespace tree_sitter {
|
|||
value = transition_map<Rule, Rule>();
|
||||
}
|
||||
|
||||
void visit(const CharClass *rule) {
|
||||
value = transition_map<Rule, Rule>({{ char_class(rule->value), blank() }});
|
||||
}
|
||||
|
||||
void visit(const Char *rule) {
|
||||
value = transition_map<Rule, Rule>({{ character(rule->value), blank() }});
|
||||
void visit(const Character *rule) {
|
||||
value = transition_map<Rule, Rule>({{ std::make_shared<Character>(*rule), blank() }});
|
||||
}
|
||||
|
||||
void visit(const Symbol *rule) {
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ namespace tree_sitter {
|
|||
namespace rules {
|
||||
void Visitor::visit(const Blank *rule) {}
|
||||
void Visitor::visit(const Symbol *rule) {}
|
||||
void Visitor::visit(const Char *rule) {}
|
||||
void Visitor::visit(const CharClass *rule) {}
|
||||
void Visitor::visit(const Character *rule) {}
|
||||
void Visitor::visit(const Choice *rule) {}
|
||||
void Visitor::visit(const Repeat *rule) {}
|
||||
void Visitor::visit(const Seq *rule) {}
|
||||
|
|
|
|||
|
|
@ -9,8 +9,7 @@ namespace tree_sitter {
|
|||
public:
|
||||
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 Character *rule);
|
||||
virtual void visit(const Choice *rule);
|
||||
virtual void visit(const Repeat *rule);
|
||||
virtual void visit(const Seq *rule);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue