Slightly improved error recovery

This commit is contained in:
Hackerpilot 2013-08-31 14:10:27 +00:00
parent f8c128aff1
commit ce53b1643b
1 changed files with 26 additions and 7 deletions

View File

@ -112,7 +112,7 @@ struct Parser
* *
* $(GRAMMAR $(RULEDEF aliasDeclaration): * $(GRAMMAR $(RULEDEF aliasDeclaration):
* $(LITERAL 'alias') $(RULE aliasInitializer) $(LPAREN)$(LITERAL ',') $(RULE aliasInitializer)$(RPAREN)* * $(LITERAL 'alias') $(RULE aliasInitializer) $(LPAREN)$(LITERAL ',') $(RULE aliasInitializer)$(RPAREN)*
* | $(LITERAL 'alias') $(RULE type) $(LITERAL identifier) $(LITERAL ';') * | $(LITERAL 'alias') $(RULE type) $(LITERAL identifier) $(LITERAL ';')
* ;) * ;)
*/ */
AliasDeclaration parseAliasDeclaration() AliasDeclaration parseAliasDeclaration()
@ -137,10 +137,10 @@ struct Parser
else else
{ {
if ((node.type = parseType()) is null) return null; if ((node.type = parseType()) is null) return null;
auto ident = expect(TokenType.identifier); auto ident = expect(TokenType.identifier);
if (ident is null) if (ident is null)
return null; return null;
node.name = *ident; node.name = *ident;
} }
if (expect(TokenType.semicolon) is null) return null; if (expect(TokenType.semicolon) is null) return null;
return node; return node;
@ -2159,6 +2159,11 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
node.increment = parseExpression(); node.increment = parseExpression();
if (expect(TokenType.rParen) is null) return null; if (expect(TokenType.rParen) is null) return null;
if (currentIs(TokenType.rBrace))
{
error("Statement expected", false);
return node; // this line makes DCD better
}
node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault(); node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault();
if (node.statementNoCaseNoDefault is null) return null; if (node.statementNoCaseNoDefault is null) return null;
return node; return node;
@ -2208,6 +2213,11 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
node.foreachTypeList = feType; node.foreachTypeList = feType;
} }
if (expect(TokenType.rParen) is null) return null; if (expect(TokenType.rParen) is null) return null;
if (currentIs(TokenType.rBrace))
{
error("Statement expected", false);
return node; // this line makes DCD better
}
node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault(); node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault();
if (node.statementNoCaseNoDefault is null) return null; if (node.statementNoCaseNoDefault is null) return null;
return node; return node;
@ -2696,7 +2706,11 @@ body {} // six
} }
if (expect(TokenType.rParen) is null) return null; if (expect(TokenType.rParen) is null) return null;
if (currentIs(TokenType.rBrace)) return node; // this line makes DCD better if (currentIs(TokenType.rBrace))
{
error("Statement expected", false);
return node; // this line makes DCD better
}
node.thenStatement = parseDeclarationOrStatement(); node.thenStatement = parseDeclarationOrStatement();
if (currentIs(TokenType.else_)) if (currentIs(TokenType.else_))
{ {
@ -5870,6 +5884,11 @@ q{doStuff(5)}c;
expect(TokenType.lParen); expect(TokenType.lParen);
node.expression = parseExpression(); node.expression = parseExpression();
expect(TokenType.rParen); expect(TokenType.rParen);
if (currentIs(TokenType.rBrace))
{
error("Statement expected", false);
return node; // this line makes DCD better
}
node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault(); node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault();
return node; return node;
} }
@ -5931,7 +5950,7 @@ q{doStuff(5)}c;
*/ */
void function(string, int, int, string) messageFunction; void function(string, int, int, string) messageFunction;
bool isSliceExpression() bool isSliceExpression()
{ {
mixin(traceEnterAndExit!(__FUNCTION__)); mixin(traceEnterAndExit!(__FUNCTION__));
if (startsWith(TokenType.lBracket, TokenType.rBracket)) if (startsWith(TokenType.lBracket, TokenType.rBracket))