diff options
Diffstat (limited to 'src/libs/glsl/glsl.g')
-rw-r--r-- | src/libs/glsl/glsl.g | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/libs/glsl/glsl.g b/src/libs/glsl/glsl.g index 91b2674831..ccd80ae8f1 100644 --- a/src/libs/glsl/glsl.g +++ b/src/libs/glsl/glsl.g @@ -519,9 +519,13 @@ AST *Parser::parse(int startToken) _recovered = false; _tos = -1; _startToken.kind = startToken; + int recoveryAttempts = 0; + do { - again: + recoveryAttempts = 0; + + againAfterRecovery: if (unsigned(++_tos) == _stateStack.size()) { _stateStack.resize(_tos * 2); _locationStack.resize(_tos * 2); @@ -564,6 +568,7 @@ AST *Parser::parse(int startToken) reduce(ruleno); action = nt_action(_stateStack[_tos], lhs[ruleno] - TERMINAL_COUNT); } else if (action == 0) { + ++recoveryAttempts; const int line = _tokens[yyloc].line + 1; QString message = QLatin1String("Syntax error"); if (yytoken != -1) { @@ -574,7 +579,7 @@ AST *Parser::parse(int startToken) for (; _tos; --_tos) { const int state = _stateStack[_tos]; - static int tks[] = { + static int tks1[] = { T_RIGHT_BRACE, T_RIGHT_PAREN, T_RIGHT_BRACKET, T_SEMICOLON, T_COLON, T_COMMA, T_NUMBER, T_TYPE_NAME, T_IDENTIFIER, @@ -582,6 +587,16 @@ AST *Parser::parse(int startToken) T_WHILE, 0 }; + static int tks2[] = { + T_RIGHT_BRACE, T_RIGHT_PAREN, T_RIGHT_BRACKET, + T_SEMICOLON, T_COLON, T_COMMA, + 0 + }; + int *tks; + if (recoveryAttempts < 2) + tks = tks1; + else + tks = tks2; // Avoid running into an endless loop for e.g.: for(int x=0; x y for (int *tptr = tks; *tptr; ++tptr) { const int next = t_action(state, *tptr); @@ -604,7 +619,7 @@ AST *Parser::parse(int startToken) yytoken = -1; action = next; - goto again; + goto againAfterRecovery; } } } |