diff --git a/spec/fixtures/corpus/javascript/control_flow.txt b/spec/fixtures/corpus/javascript/control_flow.txt index dd63a059..9cba9ebf 100644 --- a/spec/fixtures/corpus/javascript/control_flow.txt +++ b/spec/fixtures/corpus/javascript/control_flow.txt @@ -102,6 +102,24 @@ for (key in someObject) (identifier) (identifier) (expression_statement (function_call (identifier) (arguments))))) +========================================== +regular for loops beginning with an in-expression +========================================== + +for (key in something && i = 0; i < n; i++) { + doSomething(); +} + +--- + +(program (for_statement + (bool_op + (type_op (identifier) (identifier)) + (assignment (identifier) (number))) + (rel_op (identifier) (identifier)) + (math_op (identifier)) + (statement_block (expression_statement (function_call (identifier) (arguments)))))) + ========================================== while loops ========================================== diff --git a/src/runtime/parser.c b/src/runtime/parser.c index f8c8cefa..2a2b1f81 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -120,10 +120,21 @@ static void ts_parser__get_next_lookahead(TSParser *parser) { return; } - TSStateId parse_state = ts_stack_top_state(parser->stack, 0); - TSStateId lex_state = parser->language->lex_states[parse_state]; - DEBUG("lex state:%d", lex_state); - parser->lookahead = parser->language->lex_fn(&parser->lexer, lex_state); + TSLength position = parser->lexer.current_position; + for (size_t i = 0, count = ts_stack_head_count(parser->stack); i < count; i++) { + if (i > 0) { + ts_lexer_reset(&parser->lexer, position); + ts_tree_release(parser->lookahead); + } + + TSStateId parse_state = ts_stack_top_state(parser->stack, i); + TSStateId lex_state = parser->language->lex_states[parse_state]; + DEBUG("lex state:%d", lex_state); + parser->lookahead = parser->language->lex_fn(&parser->lexer, lex_state); + + if (parser->lookahead->symbol != ts_builtin_sym_error) + break; + } } /*