diff --git a/include/parser.h b/include/parser.h index 6ab8f294..5dcc671e 100644 --- a/include/parser.h +++ b/include/parser.h @@ -24,6 +24,7 @@ extern "C" { #endif static int INITIAL_STACK_SIZE = 100; +static const char *ts_symbol_names[]; typedef int TSState; @@ -36,6 +37,7 @@ typedef struct { const char *input; size_t position; TSTree *lookahead_node; + TSTree *prev_lookahead_node; TSState lex_state; TSStackEntry *stack; size_t stack_size; @@ -81,7 +83,8 @@ static void TSParserShift(TSParser *parser, TSState parse_state) { TSStackEntry *entry = (parser->stack + parser->stack_size); entry->state = parse_state; entry->node = parser->lookahead_node; - parser->lookahead_node = NULL; + parser->lookahead_node = parser->prev_lookahead_node; + parser->prev_lookahead_node = NULL; parser->stack_size++; } @@ -93,8 +96,9 @@ static void TSParserReduce(TSParser *parser, TSSymbol symbol, int child_count) { children[i] = parser->stack[parser->stack_size + i].node; } + parser->prev_lookahead_node = parser->lookahead_node; parser->lookahead_node = TSTreeMake(symbol, child_count, children); - DEBUG_PARSE("reduce: %ld, state: %u \n", symbol, TSParserParseState(parser)); + DEBUG_PARSE("reduce: %s, state: %u \n", ts_symbol_names[symbol], TSParserParseState(parser)); } static void TSParserError(TSParser *parser, size_t count, const char **expected_inputs) { @@ -132,6 +136,7 @@ static void TSParserSetLookaheadSym(TSParser *parser, TSSymbol symbol) { static void TSParserAcceptInput(TSParser *parser) { parser->result.tree = parser->stack[parser->stack_size - 1].node; + DEBUG_PARSE("accept \n"); } #pragma mark - DSL diff --git a/spec/runtime/arithmetic_spec.cpp b/spec/runtime/arithmetic_spec.cpp index 45fb64ef..a4cde825 100644 --- a/spec/runtime/arithmetic_spec.cpp +++ b/spec/runtime/arithmetic_spec.cpp @@ -15,12 +15,24 @@ describe("arithmetic", []() { it("parses variables", [&]() { TSDocumentSetText(document, "x"); - AssertThat(string(TSDocumentToString(document)), Equals("(expression (term (factor (variable))))")); + AssertThat(string(TSDocumentToString(document)), Equals( + "(expression (term (factor (variable))))")); }); it("parses products of variables", [&]() { TSDocumentSetText(document, "x*y"); - AssertThat(string(TSDocumentToString(document)), Equals("(expression (term (factor (variable)) (3) (factor (variable))))")); + AssertThat(string(TSDocumentToString(document)), Equals( + "(expression (term (factor (variable)) (3) (factor (variable))))")); + }); + + it("parses complex trees", [&]() { + TSDocumentSetText(document, "x*y+z*a"); + AssertThat(string(TSDocumentToString(document)), Equals( + "(expression (term (factor (variable)) (3) (factor (variable))) (4) (term (factor (variable)) (3) (factor (variable))))")); + + TSDocumentSetText(document, "x*(y+z)"); + AssertThat(string(TSDocumentToString(document)), Equals( + "(expression (term (factor (variable)) (3) (factor (1) (expression (term (factor (variable))) (4) (term (factor (variable)))) (2))))")); }); }); diff --git a/src/runtime/parse_config.cpp b/src/runtime/parse_config.cpp index bc5d9f62..4e33b8ed 100644 --- a/src/runtime/parse_config.cpp +++ b/src/runtime/parse_config.cpp @@ -19,7 +19,7 @@ const char * TSParseErrorToString(const TSParseError *error, const char *input_s result += "Expected: "; for (int i = 0; i < error->expected_input_count; i++) - result += error->expected_inputs[i]; + result += string(error->expected_inputs[i]) + " "; char *stuff = (char *)malloc(result.size() * sizeof(char)); strcpy(stuff, result.c_str());