From ceee7eefd05866f2ca78facd97d812e409d1e4f1 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 20 Feb 2014 18:38:31 -0800 Subject: [PATCH] Don't store text on documents --- include/tree_sitter/parser.h | 2 +- include/tree_sitter/runtime.h | 11 ++++++----- spec/runtime/json_spec.cpp | 4 ++++ src/runtime/document.cpp | 8 +++++--- src/runtime/error.cpp | 9 +++++---- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/include/tree_sitter/parser.h b/include/tree_sitter/parser.h index 7dc2f636..025d4cf5 100644 --- a/include/tree_sitter/parser.h +++ b/include/tree_sitter/parser.h @@ -123,9 +123,9 @@ static void TSParserReduce(ts_parser *parser, ts_symbol symbol, int immediate_ch static void TSParserError(ts_parser *parser, size_t count, const char **expected_inputs) { ts_error *error = &parser->result.error; error->position = parser->position; + error->lookahead_char = TSParserLookaheadChar(parser); error->expected_input_count = count; error->expected_inputs = expected_inputs; - error->lookahead_sym = TSParserLookaheadSym(parser); } static int TSParserHasError(const ts_parser *parser) { diff --git a/include/tree_sitter/runtime.h b/include/tree_sitter/runtime.h index ffa7193f..eba8e7c3 100644 --- a/include/tree_sitter/runtime.h +++ b/include/tree_sitter/runtime.h @@ -6,15 +6,15 @@ extern "C" { #endif #include - + typedef struct { - const char **expected_inputs; - size_t expected_input_count; size_t position; - long lookahead_sym; + char lookahead_char; + size_t expected_input_count; + const char **expected_inputs; } ts_error; -const char * ts_error_string(const ts_error *error, const char *input_string, const char **symbol_names); +const char * ts_error_string(const ts_error *error); typedef size_t ts_symbol; @@ -46,6 +46,7 @@ typedef struct { typedef struct ts_document ts_document; ts_document * ts_document_make(); +void ts_document_free(ts_document *); void ts_document_set_parser(ts_document *document, ts_parse_config config); void ts_document_set_text(ts_document *document, const char *text); ts_tree * ts_document_tree(const ts_document *document); diff --git a/spec/runtime/json_spec.cpp b/spec/runtime/json_spec.cpp index 19f5fa4f..5ef47abb 100644 --- a/spec/runtime/json_spec.cpp +++ b/spec/runtime/json_spec.cpp @@ -12,6 +12,10 @@ describe("json", []() { ts_document_set_parser(document, ts_parse_config_json); }); + after_each([&]() { + ts_document_free(document); + }); + it("parses strings", [&]() { ts_document_set_text(document, "\"\""); AssertThat(string(ts_document_string(document)), Equals("(value (string))")); diff --git a/src/runtime/document.cpp b/src/runtime/document.cpp index 8e0069ba..c5fdeb35 100644 --- a/src/runtime/document.cpp +++ b/src/runtime/document.cpp @@ -3,7 +3,6 @@ struct ts_document { ts_parse_fn *parse_fn; const char **symbol_names; - const char *text; ts_error error; ts_tree *tree; }; @@ -12,6 +11,10 @@ ts_document * ts_document_make() { return new ts_document(); } +void ts_document_free(ts_document *document) { + delete document; +} + void ts_document_set_parser(ts_document *document, ts_parse_config config) { document->parse_fn = config.parse_fn; document->symbol_names = config.symbol_names; @@ -19,7 +22,6 @@ void ts_document_set_parser(ts_document *document, ts_parse_config config) { void ts_document_set_text(ts_document *document, const char *text) { ts_parse_result result = document->parse_fn(text); - document->text = text; document->tree = result.tree; document->error = result.error; } @@ -30,7 +32,7 @@ ts_tree * ts_document_tree(const ts_document *document) { const char * ts_document_string(const ts_document *document) { if (document->error.expected_inputs != NULL) { - return ts_error_string(&document->error, document->text, document->symbol_names); + return ts_error_string(&document->error); } else { return ts_tree_string(document->tree, document->symbol_names); } diff --git a/src/runtime/error.cpp b/src/runtime/error.cpp index 78c171fc..e945cbb5 100644 --- a/src/runtime/error.cpp +++ b/src/runtime/error.cpp @@ -4,10 +4,11 @@ using std::string; -const char * ts_error_string(const ts_error *error, const char *input_string, const char **symbol_names) { - string result = string("Unexpected character '") + input_string[error->position] + "'. Expected: "; - for (int i = 0; i < error->expected_input_count; i++) - result += string(error->expected_inputs[i]) + " "; +const char * ts_error_string(const ts_error *error) { + string result = string("Unexpected character '") + error->lookahead_char + "'. 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());