Remove subclasses of Symbol for terminals and non-terminals

This commit is contained in:
Max Brunsfeld 2014-01-04 15:01:06 -08:00
parent ed80d9cf52
commit 29c81167c0
23 changed files with 88 additions and 191 deletions

View file

@ -21,11 +21,11 @@ describe("preparing a grammar", []() {
AssertThat(result.first, Equals(Grammar({
{ "rule1", seq({
token("1"),
sym("1"),
seq({
sym("rule2"),
sym("rule3") }),
token("1") }) }
sym("1") }) }
})));
AssertThat(result.second, Equals(Grammar("", {

View file

@ -14,19 +14,19 @@ describe("building parse and lex tables", []() {
{ "expression", choice({
seq({
sym("term"),
token("plus-token"),
sym("plus-token"),
sym("term") }),
sym("term") }) },
{ "term", choice({
sym("variable"),
sym("number"),
seq({
token("left-paren-token"),
sym("left-paren-token"),
sym("expression"),
token("right-paren-token")
sym("right-paren-token")
}) }) },
{ "variable", token("variable-token") },
{ "number", token("number-token") }
{ "variable", sym("variable-token") },
{ "number", sym("number-token") }
});
Grammar lex_grammar({
@ -64,8 +64,8 @@ describe("building parse and lex tables", []() {
AssertThat(lex_state(0).actions, Equals(unordered_map<CharMatch, lex_actions>({
{ CharMatchSpecific('('), lex_actions({ LexAction::Advance(1) }) },
{ CharMatchClass(CharClassWord), lex_actions({ LexAction::Advance(2) }) },
{ CharMatchClass(CharClassDigit), lex_actions({ LexAction::Advance(3) }) },
{ CharMatchClass(CharClassDigit), lex_actions({ LexAction::Advance(2) }) },
{ CharMatchClass(CharClassWord), lex_actions({ LexAction::Advance(3) }) },
})));
});

View file

@ -20,19 +20,19 @@ static void ts_lex(TSParser *parser) {
START_LEXER();
switch (LEX_STATE()) {
case 0:
if (isalnum(LOOKAHEAD_CHAR()))
ADVANCE(2);
if (isdigit(LOOKAHEAD_CHAR()))
ADVANCE(3);
if (LOOKAHEAD_CHAR() == '(')
ADVANCE(2);
if (isalnum(LOOKAHEAD_CHAR()))
ADVANCE(1);
LEX_ERROR();
case 1:
ACCEPT_TOKEN(ts_symbol_2);
case 2:
if (isalnum(LOOKAHEAD_CHAR()))
ADVANCE(2);
ADVANCE(1);
ACCEPT_TOKEN(ts_symbol_1);
case 2:
ACCEPT_TOKEN(ts_symbol_2);
case 3:
if (isdigit(LOOKAHEAD_CHAR()))
ADVANCE(3);

View file

@ -19,7 +19,7 @@ namespace tree_sitter {
return value;
} else {
string token_name = add_token(rule);
return rules::token(token_name);
return rules::sym(token_name);
}
}

View file

@ -38,6 +38,10 @@ namespace tree_sitter {
return true;
}
bool Grammar::has_definition(const rules::Symbol &symbol) const {
return rules.find(symbol.name) != rules.end();
}
std::ostream& operator<<(std::ostream &stream, const Grammar &grammar) {
stream << string("#<grammar: ");
bool started = false;

View file

@ -15,6 +15,7 @@ namespace tree_sitter {
const std::string start_rule_name;
std::vector<std::string> rule_names() const;
bool operator==(const Grammar &other) const;
bool has_definition(const rules::Symbol &symbol) const;
const std::unordered_map<std::string, const rules::rule_ptr> rules;
};

View file

@ -28,10 +28,10 @@ namespace tree_sitter {
});
};
vector<rules::NonTerminal> Item::next_symbols() const {
vector<rules::NonTerminal> result;
vector<rules::Symbol> Item::next_symbols() const {
vector<rules::Symbol> result;
for (auto pair : lr::transitions(rule)) {
auto sym = dynamic_pointer_cast<const rules::NonTerminal>(pair.first);
auto sym = dynamic_pointer_cast<const rules::Symbol>(pair.first);
if (sym) result.push_back(*sym);
}
return result;
@ -40,24 +40,24 @@ namespace tree_sitter {
bool Item::operator==(const Item &other) const {
bool rule_names_eq = other.rule_name == rule_name;
bool rules_eq = (*other.rule == *rule);
return rule_names_eq && rules_eq;
bool consumed_sym_counts_eq = (other.consumed_sym_count == consumed_sym_count);
return rule_names_eq && rules_eq && consumed_sym_counts_eq;
}
bool Item::is_done() const {
for (auto pair : transitions()) {
if (*pair.first == rules::Blank()) return true;
}
for (auto pair : transitions())
if (*pair.first == rules::Blank())
return true;
return false;
}
std::ostream& operator<<(ostream &stream, const Item &item) {
stream <<
return stream <<
string("#<item '") <<
item.rule_name <<
string("' ") <<
*item.rule <<
string(">");
return stream;
}
}
}

View file

@ -3,7 +3,7 @@
#include <string>
#include "rule.h"
#include "non_terminal.h"
#include "symbol.h"
#include "transition_map.h"
namespace tree_sitter {
@ -20,7 +20,7 @@ namespace tree_sitter {
static Item at_beginning_of_token(const std::string &rule_name, const Grammar &grammar);
transition_map<rules::Rule, Item> transitions() const;
std::vector<rules::NonTerminal> next_symbols() const;
std::vector<rules::Symbol> next_symbols() const;
bool operator==(const Item &other) const;
bool is_done() const;

View file

@ -1,10 +1,12 @@
#include "item_set.h"
using std::vector;
using std::set;
using std::initializer_list;
using std::dynamic_pointer_cast;
using std::ostream;
using std::string;
using std::make_shared;
namespace tree_sitter {
namespace lr {
@ -18,9 +20,11 @@ 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::NonTerminal rule : item.next_symbols()) {
Item next_item = Item::at_beginning_of_rule(rule.name, grammar);
add_item(vector, next_item, grammar);
for (rules::Symbol rule : item.next_symbols()) {
if (grammar.has_definition(rule)) {
Item next_item = Item::at_beginning_of_rule(rule.name, grammar);
add_item(vector, next_item, grammar);
}
}
}
}
@ -33,17 +37,35 @@ namespace tree_sitter {
ItemSet::ItemSet(const Item &item, const Grammar &grammar) : contents(closure_in_grammar(item, grammar)) {}
transition_map<rules::Rule, ItemSet> ItemSet::all_transitions(const Grammar &grammar) const {
transition_map<rules::Rule, ItemSet> result;
for (auto item : *this) {
auto item_transitions = item.transitions();
for (auto pair : item_transitions) {
result.add(pair.first, std::make_shared<ItemSet>(*pair.second, grammar));
template<typename RuleClass>
transition_map<RuleClass, ItemSet> transitions(const ItemSet *item_set, const Grammar &grammar) {
transition_map<RuleClass, ItemSet> result;
for (Item item : *item_set) {
for (auto transition : item.transitions()) {
auto rule = dynamic_pointer_cast<const RuleClass>(transition.first);
if (rule.get()) result.add(rule, make_shared<ItemSet>(*transition.second, grammar));
}
}
return result;
}
transition_map<rules::Character, ItemSet> ItemSet::char_transitions(const Grammar &grammar) const {
return transitions<rules::Character>(this, grammar);
}
transition_map<rules::Symbol, ItemSet> ItemSet::sym_transitions(const Grammar &grammar) const {
return transitions<rules::Symbol>(this, grammar);
}
set<rules::Symbol> ItemSet::next_terminal_symbols(const Grammar &grammar) const {
set<rules::Symbol> result;
for (Item item : *this)
for (rules::Symbol symbol : item.next_symbols())
if (!grammar.has_definition(symbol))
result.insert(symbol);
return result;
}
bool ItemSet::operator==(const tree_sitter::lr::ItemSet &other) const {
return contents == other.contents;
}
@ -66,12 +88,9 @@ namespace tree_sitter {
ostream& operator<<(ostream &stream, const ItemSet &item_set) {
stream << string("#<item_set ");
for (Item item : item_set) {
stream << item;
stream << string(" ");
}
stream << string(">");
return stream;
for (Item item : item_set)
stream << item << string(" ");
return stream << string(">");
}
}
}

View file

@ -3,6 +3,7 @@
#include "item.h"
#include "grammar.h"
#include <set>
namespace tree_sitter {
namespace lr {
@ -22,26 +23,10 @@ namespace tree_sitter {
const_iterator end() const;
size_t size() const;
transition_map<rules::Rule, ItemSet> all_transitions(const Grammar &grammar) const;
template<typename RuleClass>
transition_map<RuleClass, ItemSet> transitions(const Grammar &grammar) const {
transition_map<RuleClass, ItemSet> result;
for (auto transition : all_transitions(grammar)) {
auto rule = std::dynamic_pointer_cast<const RuleClass>(transition.first);
if (rule.get()) result.add(rule, transition.second);
}
return result;
}
template<typename RuleClass>
std::vector<RuleClass> next_inputs(const Grammar &grammar) const {
std::vector<RuleClass> result;
for (auto pair : transitions<RuleClass>(grammar))
result.push_back(*pair.first);
return result;
}
transition_map<rules::Character, ItemSet> char_transitions(const Grammar &grammar) const;
transition_map<rules::Symbol, ItemSet> sym_transitions(const Grammar &grammar) const;
std::set<rules::Symbol> next_terminal_symbols(const Grammar &grammar) const;
bool operator==(const ItemSet &other) const;
};

View file

@ -32,7 +32,9 @@ namespace tree_sitter {
}
void add_shift_actions(const ItemSet &item_set, size_t state_index) {
for (auto transition : item_set.transitions<rules::Symbol>(grammar)) {
auto x = item_set.sym_transitions(grammar);
for (auto transition : x) {
rules::Symbol symbol = *transition.first;
ItemSet item_set = *transition.second;
size_t new_state_index = add_parse_state(item_set);
@ -41,7 +43,7 @@ namespace tree_sitter {
}
void add_advance_actions(const ItemSet &item_set, size_t state_index) {
for (auto transition : item_set.transitions<rules::Character>(grammar)) {
for (auto transition : item_set.char_transitions(grammar)) {
rules::Character rule = *transition.first;
ItemSet item_set = *transition.second;
size_t new_state_index = add_lex_state(item_set);
@ -82,8 +84,8 @@ namespace tree_sitter {
ItemSet lex_item_set_for_parse_item_set(const ItemSet &parse_item_set) {
vector<Item> items;
for (rules::Token token : parse_item_set.next_inputs<rules::Token>(grammar))
items.push_back(Item::at_beginning_of_token(token.name, lex_grammar));
for (rules::Symbol symbol : parse_item_set.next_terminal_symbols(grammar))
items.push_back(Item::at_beginning_of_token(symbol.name, lex_grammar));
return ItemSet(items);
}

View file

@ -21,10 +21,6 @@ namespace tree_sitter {
value = transition_map<Rule, Rule>({{ rule->copy(), blank() }});
}
void visit(const Token *rule) {
value = transition_map<Rule, Rule>({{ rule->copy(), blank() }});
}
void visit(const Choice *rule) {
value = transitions(rule->left);
value.merge(transitions(rule->right), [&](rule_ptr left, rule_ptr right) -> rule_ptr {

View file

@ -1,28 +0,0 @@
#include "rules.h"
#include "transition_map.h"
using std::string;
using std::hash;
namespace tree_sitter {
namespace rules {
NonTerminal::NonTerminal(const std::string &name) : Symbol(name) {};
bool NonTerminal::operator==(const Rule &rule) const {
const NonTerminal *other = dynamic_cast<const NonTerminal *>(&rule);
return other && (other->name == name);
}
rule_ptr NonTerminal::copy() const {
return std::make_shared<NonTerminal>(*this);
}
string NonTerminal::to_string() const {
return string("#<non-terminal '") + name + "'>";
}
void NonTerminal::accept(Visitor &visitor) const {
visitor.visit(this);
}
}
}

View file

@ -1,20 +0,0 @@
#ifndef __tree_sitter__non_terminal__
#define __tree_sitter__non_terminal__
#include "symbol.h"
namespace tree_sitter {
namespace rules {
class NonTerminal : public Symbol {
public:
NonTerminal(const std::string &name);
bool operator==(const Rule& other) const;
rule_ptr copy() const;
std::string to_string() const;
void accept(Visitor &visitor) const;
};
}
}
#endif

View file

@ -47,11 +47,7 @@ namespace tree_sitter {
}
sym_ptr sym(const string &name) {
return make_shared<NonTerminal>(name);
}
rule_ptr token(const std::string &name) {
return make_shared<Token>(name);
return make_shared<Symbol>(name);
}
}
}

View file

@ -4,14 +4,12 @@
#include "rule.h"
#include "blank.h"
#include "symbol.h"
#include "token.h"
#include "choice.h"
#include "seq.h"
#include "string.h"
#include "pattern.h"
#include "character.h"
#include "repeat.h"
#include "non_terminal.h"
#include "visitor.h"
namespace tree_sitter {
@ -26,7 +24,6 @@ namespace tree_sitter {
rule_ptr seq(const std::initializer_list<rule_ptr> &rules);
rule_ptr str(const std::string &value);
sym_ptr sym(const std::string &name);
rule_ptr token(const std::string &name);
}
}

View file

@ -25,6 +25,10 @@ namespace tree_sitter {
return string("#<sym '") + name + "'>";
}
bool Symbol::operator<(const Symbol &other) const {
return name < other.name;
}
void Symbol::accept(Visitor &visitor) const {
visitor.visit(this);
}

View file

@ -14,6 +14,7 @@ namespace tree_sitter {
rule_ptr copy() const;
std::string to_string() const;
void accept(Visitor &visitor) const;
bool operator<(const Symbol &other) const;
const std::string name;
};
@ -22,4 +23,10 @@ namespace tree_sitter {
}
}
namespace std {
template<>
struct hash<tree_sitter::rules::Symbol> : hash<tree_sitter::rules::Rule> {};
}
#endif

View file

@ -1,28 +0,0 @@
#include "rules.h"
#include "transition_map.h"
using std::string;
using std::hash;
namespace tree_sitter {
namespace rules {
Token::Token(const std::string &name) : Symbol(name) {};
bool Token::operator==(const Rule &rule) const {
const Token *other = dynamic_cast<const Token *>(&rule);
return other && (other->name == name);
}
rule_ptr Token::copy() const {
return std::make_shared<Token>(*this);
}
string Token::to_string() const {
return string("#<token '") + name + "'>";
}
void Token::accept(Visitor &visitor) const {
visitor.visit(this);
}
}
}

View file

@ -1,20 +0,0 @@
#ifndef __tree_sitter__token__
#define __tree_sitter__token__
#include "symbol.h"
namespace tree_sitter {
namespace rules {
class Token : public Symbol {
public:
Token(const std::string &name);
bool operator==(const Rule& other) const;
rule_ptr copy() const;
std::string to_string() const;
void accept(Visitor &visitor) const;
};
}
}
#endif

View file

@ -11,6 +11,5 @@ namespace tree_sitter {
void Visitor::visit(const Seq *rule) { default_visit(rule); }
void Visitor::visit(const String *rule) { default_visit(rule); }
void Visitor::visit(const Pattern *rule) { default_visit(rule); }
void Visitor::visit(const Token *rule) { default_visit(rule); }
}
}

View file

@ -16,7 +16,6 @@ namespace tree_sitter {
virtual void visit(const Seq *rule);
virtual void visit(const String *rule);
virtual void visit(const Pattern *rule);
virtual void visit(const Token *rule);
};
}
}

View file

@ -16,14 +16,10 @@
1213061B182C84DF00FCF928 /* item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130619182C84DF00FCF928 /* item.cpp */; };
12130622182C85D300FCF928 /* item_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130620182C85D300FCF928 /* item_set.cpp */; };
1214930E181E200B008E9BDA /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121492E9181E200B008E9BDA /* main.cpp */; };
121D8B2E187763F3003CF44B /* non_terminal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121D8B2C187763F3003CF44B /* non_terminal.cpp */; };
121D8B2F1877AD1C003CF44B /* non_terminal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121D8B2C187763F3003CF44B /* non_terminal.cpp */; };
1225CC6418765693000D4723 /* prepare_grammar_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1225CC6318765693000D4723 /* prepare_grammar_spec.cpp */; };
1225CC6718765737000D4723 /* prepare_grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1225CC6518765737000D4723 /* prepare_grammar.cpp */; };
1225CC6A187661C7000D4723 /* extract_tokens.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1225CC68187661C7000D4723 /* extract_tokens.cpp */; };
1225CC6D18766969000D4723 /* search_for_symbols.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1225CC6B18766969000D4723 /* search_for_symbols.cpp */; };
1225CC701876AFFF000D4723 /* token.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1225CC6E1876AFFF000D4723 /* token.cpp */; };
1225CC711876B103000D4723 /* token.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1225CC6E1876AFFF000D4723 /* token.cpp */; };
1251209B1830145300C9B56A /* rule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1251209A1830145300C9B56A /* rule.cpp */; };
125120A018307DEC00C9B56A /* parse_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1251209E18307DEC00C9B56A /* parse_table.cpp */; };
125120A4183083BD00C9B56A /* arithmetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 125120A3183083BD00C9B56A /* arithmetic.cpp */; };
@ -113,8 +109,6 @@
12130621182C85D300FCF928 /* item_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = item_set.h; sourceTree = "<group>"; };
121492E9181E200B008E9BDA /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = spec/main.cpp; sourceTree = SOURCE_ROOT; };
121492EA181E200B008E9BDA /* rules_spec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rules_spec.cpp; path = spec/compiler/rules/rules_spec.cpp; sourceTree = SOURCE_ROOT; };
121D8B2C187763F3003CF44B /* non_terminal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = non_terminal.cpp; sourceTree = "<group>"; };
121D8B2D187763F3003CF44B /* non_terminal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = non_terminal.h; sourceTree = "<group>"; };
1225CC6318765693000D4723 /* prepare_grammar_spec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = prepare_grammar_spec.cpp; sourceTree = "<group>"; };
1225CC6518765737000D4723 /* prepare_grammar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = prepare_grammar.cpp; sourceTree = "<group>"; };
1225CC6618765737000D4723 /* prepare_grammar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prepare_grammar.h; sourceTree = "<group>"; };
@ -122,8 +116,6 @@
1225CC69187661C7000D4723 /* extract_tokens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = extract_tokens.h; sourceTree = "<group>"; };
1225CC6B18766969000D4723 /* search_for_symbols.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = search_for_symbols.cpp; sourceTree = "<group>"; };
1225CC6C18766969000D4723 /* search_for_symbols.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = search_for_symbols.h; sourceTree = "<group>"; };
1225CC6E1876AFFF000D4723 /* token.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = token.cpp; sourceTree = "<group>"; };
1225CC6F1876AFFF000D4723 /* token.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = token.h; sourceTree = "<group>"; };
12512092182F307C00C9B56A /* table_builder_spec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = table_builder_spec.cpp; path = spec/compiler/lr/table_builder_spec.cpp; sourceTree = SOURCE_ROOT; };
1251209A1830145300C9B56A /* rule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rule.cpp; sourceTree = "<group>"; };
1251209E18307DEC00C9B56A /* parse_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parse_table.cpp; sourceTree = "<group>"; };
@ -208,12 +200,8 @@
12130616182C3D2900FCF928 /* string.h */,
12130609182C389100FCF928 /* symbol.cpp */,
1213060A182C389100FCF928 /* symbol.h */,
1225CC6E1876AFFF000D4723 /* token.cpp */,
1225CC6F1876AFFF000D4723 /* token.h */,
12FD40E618639B910041A84E /* visitor.cpp */,
12FD40E41862B3530041A84E /* visitor.h */,
121D8B2C187763F3003CF44B /* non_terminal.cpp */,
121D8B2D187763F3003CF44B /* non_terminal.h */,
);
path = rules;
sourceTree = "<group>";
@ -487,7 +475,6 @@
files = (
12FD40D7185FEEDB0041A84E /* item_spec.cpp in Sources */,
12130614182C3A1700FCF928 /* seq.cpp in Sources */,
121D8B2E187763F3003CF44B /* non_terminal.cpp in Sources */,
1225CC6A187661C7000D4723 /* extract_tokens.cpp in Sources */,
129D242C183EB1EB00FE9F71 /* table_builder.cpp in Sources */,
125120A4183083BD00C9B56A /* arithmetic.cpp in Sources */,
@ -499,7 +486,6 @@
1213060E182C398300FCF928 /* choice.cpp in Sources */,
12F9A64E182DD5FD00FAF50C /* spec_helper.cpp in Sources */,
12FD40F7186A16020041A84E /* lex_table.cpp in Sources */,
1225CC701876AFFF000D4723 /* token.cpp in Sources */,
12FD40E918641FB70041A84E /* rules.cpp in Sources */,
12FD4061185E68470041A84E /* c_code.cpp in Sources */,
12FD40D8185FEEDF0041A84E /* rules_spec.cpp in Sources */,
@ -530,13 +516,11 @@
12FD40B3185EEB5E0041A84E /* seq.cpp in Sources */,
12FD40B4185EEB5E0041A84E /* table_builder.cpp in Sources */,
12FD40B6185EEB5E0041A84E /* arithmetic.cpp in Sources */,
121D8B2F1877AD1C003CF44B /* non_terminal.cpp in Sources */,
12FD40DD185FF12C0041A84E /* parser.c in Sources */,
12FD40B8185EEB5E0041A84E /* item.cpp in Sources */,
12FD40B9185EEB5E0041A84E /* string.cpp in Sources */,
12FD40EF186641510041A84E /* transitions.cpp in Sources */,
12FD40BB185EEB5E0041A84E /* blank.cpp in Sources */,
1225CC711876B103000D4723 /* token.cpp in Sources */,
12FD40F4186641C00041A84E /* char_match.cpp in Sources */,
12FD40BD185EEB5E0041A84E /* choice.cpp in Sources */,
12FD40DF1860064C0041A84E /* tree.c in Sources */,