Refactor parser error messages

- move message generation to TSParseError,
  so that Parser doesn’t need to import <string>, and can
  be compiled as plain C.
This commit is contained in:
Max Brunsfeld 2014-01-11 17:59:45 -08:00
parent f342067293
commit 7a3092b765
9 changed files with 91 additions and 90 deletions

View file

@ -3,11 +3,26 @@
#include "tree.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
TSParseErrorTypeNone,
TSParseErrorTypeLexical,
TSParseErrorTypeSyntactic,
} TSParseErrorType;
typedef struct {
const char *message;
TSParseErrorType type;
const char **expected_inputs;
size_t expected_input_count;
size_t position;
long lookahead_sym;
} TSParseError;
const char * TSParseErrorToString(const TSParseError *error, const char *input_string, const char **symbol_names);
typedef struct {
TSParseError error;
TSTree *tree;
@ -20,4 +35,7 @@ typedef struct {
const char **symbol_names;
} TSParseConfig;
#ifdef __cplusplus
}
#endif
#endif

View file

@ -12,14 +12,13 @@ extern "C" {
typedef int TSState;
typedef struct TSStackEntry TSStackEntry;
typedef struct TSParser {
TSTree *tree;
const char *input;
const char *error_message;
size_t position;
TSTree *lookahead_node;
TSState lex_state;
TSStackEntry *stack;
size_t stack_size;
TSParseResult result;
} TSParser;
TSParser TSParserMake(const char *input);

View file

@ -5,7 +5,7 @@
START_TEST
describe("code generation", []() {
describe("compiling grammars", []() {
string test_parser_dir = src_dir() + "/spec/fixtures/parsers";
it("works for the arithmetic grammar", [&]() {

View file

@ -1,5 +1,5 @@
#ifndef TreeSitter_SpecHelper_h
#define TreeSitter_SpecHelper_h
#ifndef __tree_sitter_spec_helper_h__
#define __tree_sitter_spec_helper_h__
#include "bandit/bandit.h"
#include <iostream>

View file

@ -4,7 +4,7 @@ struct TSDocument {
TSParseFn *parse_fn;
const char **symbol_names;
const char *text;
const char *error_message;
TSParseError error;
TSTree *tree;
};
@ -22,7 +22,7 @@ void TSDocumentSetText(TSDocument *document, const char *text) {
document->text = text;
TSParseResult result = document->parse_fn(text);
document->tree = result.tree;
document->error_message = result.error.message;
document->error = result.error;
}
TSTree * TSDocumentTree(const TSDocument *document) {
@ -30,10 +30,11 @@ TSTree * TSDocumentTree(const TSDocument *document) {
}
const char * TSDocumentToString(const TSDocument *document) {
if (document->error_message) {
return document->error_message;
} else if (document->tree)
if (document->error.type != TSParseErrorTypeNone) {
return TSParseErrorToString(&document->error, document->text, document->symbol_names);
} else if (document->tree) {
return TSTreeToString(document->tree, document->symbol_names);
else
} else {
return "#<null tree>";
}
}

View file

@ -0,0 +1,27 @@
#include "parse_config.h"
#include <string>
using std::string;
static const char * EMPTY = "";
const char * TSParseErrorToString(const TSParseError *error, const char *input_string, const char **symbol_names) {
string result;
switch (error->type) {
case TSParseErrorTypeSyntactic:
result = string("Unexpected token ") + symbol_names[error->lookahead_sym] + ". ";
break;
case TSParseErrorTypeLexical:
result = string("Unexpected character '") + (input_string + error->position) + "'. ";
break;
default:
return EMPTY;
}
result += "Expected: ";
for (int i = 0; i < error->expected_input_count; i++)
result += string(" '") + error->expected_inputs[i] + "'";
char *stuff = (char *)malloc(result.size() * sizeof(char));
strcpy(stuff, result.c_str());
return stuff;
}

View file

@ -1,9 +1,5 @@
#include "parser.h"
#include <stdio.h>
#include <string>
using std::string;
using std::to_string;
#define TS_DEBUG_PARSE
#define TS_DEBUG_LEX
@ -29,14 +25,20 @@ struct TSStackEntry {
TSParser TSParserMake(const char *input) {
TSParser result = {
.tree = NULL,
.input = input,
.error_message = NULL,
.position = 0,
.lookahead_node = NULL,
.lex_state = 0,
.stack = (TSStackEntry *)calloc(INITIAL_STACK_SIZE, sizeof(TSStackEntry)),
.stack = calloc(INITIAL_STACK_SIZE, sizeof(TSStackEntry)),
.stack_size = 0,
.result = {
.tree = NULL,
.error = {
.type = TSParseErrorTypeNone,
.expected_inputs = NULL,
.expected_input_count = 0
},
},
};
return result;
}
@ -53,7 +55,7 @@ void TSParserShift(TSParser *parser, TSState parse_state) {
void TSParserReduce(TSParser *parser, TSSymbol symbol, int child_count) {
parser->stack_size -= child_count;
TSTree **children = (TSTree **)malloc(child_count * sizeof(TSTree *));
TSTree **children = malloc(child_count * sizeof(TSTree *));
for (int i = 0; i < child_count; i++) {
children[i] = parser->stack[parser->stack_size + i].node;
}
@ -63,23 +65,19 @@ void TSParserReduce(TSParser *parser, TSSymbol symbol, int child_count) {
}
void TSParserError(TSParser *parser, size_t count, const char **expected_inputs) {
string result = "Unexpected token " + to_string(TSParserLookaheadSym(parser)) + ". ";
result += "Expected tokens:";
for (int i = 0; i < count; i++)
result += string(" '") + expected_inputs[i] + "'";
char *stuff = (char *)malloc(result.size() * sizeof(char));
strcpy(stuff, result.c_str());
parser->error_message = stuff;
TSParseError *error = &parser->result.error;
error->type = TSParseErrorTypeSyntactic;
error->expected_input_count = count;
error->expected_inputs = expected_inputs;
error->lookahead_sym = TSParserLookaheadSym(parser);
}
void TSParserLexError(TSParser *parser, size_t count, const char **expected_inputs) {
string result = string("Unexpected character '") + TSParserLookaheadChar(parser) + "'. ";
result += "Expected characters:";
for (int i = 0; i < count; i++)
result += string(" ") + expected_inputs[i] + "";
char *stuff = (char *)malloc(result.size() * sizeof(char));
strcpy(stuff, result.c_str());
parser->error_message = stuff;
TSParseError *error = &parser->result.error;
error->type = TSParseErrorTypeLexical;
error->expected_input_count = count;
error->expected_inputs = expected_inputs;
error->lookahead_sym = TSParserLookaheadSym(parser);
}
void TSParserAdvance(TSParser *parser, TSState lex_state) {
@ -115,13 +113,9 @@ void TSParserSetLexState(TSParser *parser, TSState lex_state) {
}
void TSParserAcceptInput(TSParser *parser) {
parser->tree = parser->stack[parser->stack_size - 1].node;
parser->result.tree = parser->stack[parser->stack_size - 1].node;
}
TSParseResult TSParserResult(TSParser *parser) {
TSParseResult result = {
.tree = parser->tree,
.error = { .position = parser->position, .message = parser->error_message }
};
return result;
return parser->result;
}

View file

@ -17,17 +17,13 @@
1225CC6418765693000D4723 /* prepare_grammar_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1225CC6318765693000D4723 /* prepare_grammar_spec.cpp */; };
1251209B1830145300C9B56A /* rule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1251209A1830145300C9B56A /* rule.cpp */; };
125120A4183083BD00C9B56A /* arithmetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 125120A3183083BD00C9B56A /* arithmetic.cpp */; };
12BC470518822B27005AC502 /* parse_config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12BC470318822A17005AC502 /* parse_config.cpp */; };
12D136A4183678A2005F3369 /* repeat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A2183678A2005F3369 /* repeat.cpp */; };
12EDCF8A187B498C005A7A07 /* tree_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCF89187B498C005A7A07 /* tree_spec.cpp */; };
12EDCF8D187C6282005A7A07 /* document.c in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCF8C187C6282005A7A07 /* document.c */; };
12EDCF981881FCD5005A7A07 /* extract_tokens.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCF8F1881FCCA005A7A07 /* extract_tokens.cpp */; };
12EDCF991881FCD9005A7A07 /* perform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCF911881FCCA005A7A07 /* perform.cpp */; };
12EDCF9A1881FCD9005A7A07 /* search_for_symbols.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCF931881FCCA005A7A07 /* search_for_symbols.cpp */; };
12EDCF9F18820116005A7A07 /* parse_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCF9D18820116005A7A07 /* parse_table.cpp */; };
12EDCFA818820137005A7A07 /* item_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCFA018820137005A7A07 /* item_set.cpp */; };
12EDCFA918820137005A7A07 /* item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCFA218820137005A7A07 /* item.cpp */; };
12EDCFAA18820137005A7A07 /* perform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCFA418820137005A7A07 /* perform.cpp */; };
12EDCFAB18820137005A7A07 /* rule_transitions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCFA618820137005A7A07 /* rule_transitions.cpp */; };
12EDCFAF18820387005A7A07 /* parse_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCF9D18820116005A7A07 /* parse_table.cpp */; };
12EDCFB018820392005A7A07 /* item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCFA218820137005A7A07 /* item.cpp */; };
12EDCFB118820395005A7A07 /* item_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12EDCFA018820137005A7A07 /* item_set.cpp */; };
@ -43,33 +39,17 @@
12F9A651182DD6BC00FAF50C /* grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F9A64F182DD6BC00FAF50C /* grammar.cpp */; };
12FD4061185E68470041A84E /* c_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD405F185E68470041A84E /* c_code.cpp */; };
12FD4064185E75290041A84E /* compile_fixtures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD4063185E75290041A84E /* compile_fixtures.cpp */; };
12FD40B3185EEB5E0041A84E /* seq.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130612182C3A1700FCF928 /* seq.cpp */; };
12FD40B6185EEB5E0041A84E /* arithmetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 125120A3183083BD00C9B56A /* arithmetic.cpp */; };
12FD40B9185EEB5E0041A84E /* string.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12130615182C3D2900FCF928 /* string.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 */; };
12FD40C2185EEB5E0041A84E /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121492E9181E200B008E9BDA /* main.cpp */; };
12FD40C3185EEB5E0041A84E /* grammar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12F9A64F182DD6BC00FAF50C /* grammar.cpp */; };
12FD40C6185EEB5E0041A84E /* repeat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A2183678A2005F3369 /* repeat.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 */; };
12FD40D2185EEB970041A84E /* arithmetic.c in Sources */ = {isa = PBXBuildFile; fileRef = 12FD4065185E7C2F0041A84E /* arithmetic.c */; };
12FD40D8185FEEDF0041A84E /* rules_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 121492EA181E200B008E9BDA /* rules_spec.cpp */; };
12FD40D9185FEEDF0041A84E /* pattern_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12D136A0183570F5005F3369 /* pattern_spec.cpp */; };
12FD40DB185FEF0D0041A84E /* arithmetic_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DA185FEF0D0041A84E /* arithmetic_spec.cpp */; };
12FD40DD185FF12C0041A84E /* parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DC185FF12C0041A84E /* parser.cpp */; };
12FD40DD185FF12C0041A84E /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DC185FF12C0041A84E /* parser.c */; };
12FD40DF1860064C0041A84E /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40DE1860064C0041A84E /* tree.c */; };
12FD40E718639B910041A84E /* visitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40E618639B910041A84E /* visitor.cpp */; };
12FD40E918641FB70041A84E /* rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40E818641FB70041A84E /* rules.cpp */; };
12FD40EE186641430041A84E /* rules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40E818641FB70041A84E /* rules.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 */; };
12FD40F7186A16020041A84E /* lex_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40F5186A16020041A84E /* lex_table.cpp */; };
12FD40F8186A16030041A84E /* lex_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12FD40F5186A16020041A84E /* lex_table.cpp */; };
27A343CA69E17E0F9EBEDF1C /* pattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27A340F3EEB184C040521323 /* pattern.cpp */; };
/* End PBXBuildFile section */
@ -115,6 +95,7 @@
1251209A1830145300C9B56A /* rule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rule.cpp; sourceTree = "<group>"; };
125120A218307FFD00C9B56A /* arithmetic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arithmetic.h; path = spec/fixtures/grammars/arithmetic.h; sourceTree = SOURCE_ROOT; };
125120A3183083BD00C9B56A /* arithmetic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arithmetic.cpp; path = spec/fixtures/grammars/arithmetic.cpp; sourceTree = SOURCE_ROOT; };
12BC470318822A17005AC502 /* parse_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parse_config.cpp; sourceTree = "<group>"; };
12C344421822F27700B07BE3 /* transition_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transition_map.h; path = ../build_tables/transition_map.h; sourceTree = "<group>"; };
12D1369E18342088005F3369 /* todo.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = todo.md; sourceTree = "<group>"; };
12D136A0183570F5005F3369 /* pattern_spec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pattern_spec.cpp; path = spec/compiler/rules/pattern_spec.cpp; sourceTree = SOURCE_ROOT; };
@ -153,8 +134,8 @@
12EDCFC218820A70005A7A07 /* item_set_transitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = item_set_transitions.h; sourceTree = "<group>"; };
12EDCFC41882153D005A7A07 /* next_symbols.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = next_symbols.cpp; sourceTree = "<group>"; };
12EDCFC51882153D005A7A07 /* next_symbols.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = next_symbols.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; };
12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = spec_helper.cpp; path = spec/spec_helper.cpp; sourceTree = SOURCE_ROOT; };
12F9A64D182DD5FD00FAF50C /* spec_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spec_helper.h; path = spec/spec_helper.h; sourceTree = SOURCE_ROOT; };
12F9A64F182DD6BC00FAF50C /* grammar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = grammar.cpp; path = src/compiler/grammar.cpp; sourceTree = SOURCE_ROOT; };
12F9A650182DD6BC00FAF50C /* grammar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = grammar.h; path = src/compiler/grammar.h; sourceTree = SOURCE_ROOT; };
12FD405F185E68470041A84E /* c_code.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = c_code.cpp; path = src/compiler/generate_code/c_code.cpp; sourceTree = SOURCE_ROOT; };
@ -164,7 +145,7 @@
12FD40D1185EEB5E0041A84E /* runtime_specs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = runtime_specs; sourceTree = BUILT_PRODUCTS_DIR; };
12FD40D4185FED9A0041A84E /* tree.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tree.h; sourceTree = "<group>"; };
12FD40DA185FEF0D0041A84E /* arithmetic_spec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = arithmetic_spec.cpp; sourceTree = "<group>"; };
12FD40DC185FF12C0041A84E /* parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser.cpp; sourceTree = "<group>"; };
12FD40DC185FF12C0041A84E /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parser.c; sourceTree = "<group>"; };
12FD40DE1860064C0041A84E /* tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tree.c; sourceTree = "<group>"; };
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>"; };
@ -310,6 +291,8 @@
12FD40AF185EE81D0041A84E /* fixtures */,
121492E9181E200B008E9BDA /* main.cpp */,
12FD40B0185EE97E0041A84E /* runtime */,
12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */,
12F9A64D182DD5FD00FAF50C /* spec_helper.h */,
);
path = spec;
sourceTree = "<group>";
@ -369,9 +352,10 @@
12FD40AD185EE5440041A84E /* runtime */ = {
isa = PBXGroup;
children = (
12FD40DC185FF12C0041A84E /* parser.cpp */,
12FD40DC185FF12C0041A84E /* parser.c */,
12FD40DE1860064C0041A84E /* tree.c */,
12EDCF8C187C6282005A7A07 /* document.c */,
12BC470318822A17005AC502 /* parse_config.cpp */,
);
path = runtime;
sourceTree = "<group>";
@ -383,8 +367,6 @@
12FD4063185E75290041A84E /* compile_fixtures.cpp */,
1225CC6318765693000D4723 /* prepare_grammar_spec.cpp */,
12D1369F18357066005F3369 /* rules */,
12F9A64C182DD5FD00FAF50C /* spec_helper.cpp */,
12F9A64D182DD5FD00FAF50C /* spec_helper.h */,
);
name = compiler;
sourceTree = "<group>";
@ -529,34 +511,14 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
12FD40B3185EEB5E0041A84E /* seq.cpp in Sources */,
12FD40B6185EEB5E0041A84E /* arithmetic.cpp in Sources */,
12FD40DD185FF12C0041A84E /* parser.cpp in Sources */,
12FD40DD185FF12C0041A84E /* parser.c in Sources */,
12EDCF8A187B498C005A7A07 /* tree_spec.cpp in Sources */,
12EDCFA918820137005A7A07 /* item.cpp in Sources */,
12EDCF8D187C6282005A7A07 /* document.c in Sources */,
12FD40B9185EEB5E0041A84E /* string.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 */,
12FD40F8186A16030041A84E /* lex_table.cpp in Sources */,
12FD40D2185EEB970041A84E /* arithmetic.c in Sources */,
12EDCFA818820137005A7A07 /* item_set.cpp in Sources */,
12FD40DB185FEF0D0041A84E /* arithmetic_spec.cpp in Sources */,
12FD40F01866415D0041A84E /* visitor.cpp in Sources */,
12EDCF9F18820116005A7A07 /* parse_table.cpp in Sources */,
12FD40C2185EEB5E0041A84E /* main.cpp in Sources */,
12FD40C3185EEB5E0041A84E /* grammar.cpp in Sources */,
12FD40C6185EEB5E0041A84E /* repeat.cpp in Sources */,
12FD40C8185EEB5E0041A84E /* character.cpp in Sources */,
12EDCFAB18820137005A7A07 /* rule_transitions.cpp in Sources */,
12FD40C9185EEB5E0041A84E /* symbol.cpp in Sources */,
12FD40CA185EEB5E0041A84E /* rule.cpp in Sources */,
12FD40EE186641430041A84E /* rules.cpp in Sources */,
12EDCFAA18820137005A7A07 /* perform.cpp in Sources */,
12FD40CB185EEB5E0041A84E /* pattern.cpp in Sources */,
12BC470518822B27005AC502 /* parse_config.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};