Manage lookahead symbol correctly after a reduction

This commit is contained in:
Max Brunsfeld 2014-01-22 23:04:29 -08:00
parent e174b89133
commit 8a317f6918
3 changed files with 22 additions and 5 deletions

View file

@ -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

View file

@ -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))))"));
});
});

View file

@ -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());