From 6bb8139f406c2292f2deacfcd8bd429a2e295aeb Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 25 Nov 2018 19:45:10 +0100 Subject: [PATCH] Break several while loop if tokens are not consumed --- Upsilon/Parser/Parser.cs | 41 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/Upsilon/Parser/Parser.cs b/Upsilon/Parser/Parser.cs index 8329115..57c69de 100644 --- a/Upsilon/Parser/Parser.cs +++ b/Upsilon/Parser/Parser.cs @@ -102,8 +102,14 @@ namespace Upsilon.Parser private StatementSyntax ParseBlockStatement(SyntaxKind[] endTokens) { var statements = ImmutableArray.CreateBuilder(); + SyntaxToken current = null; while (!endTokens.Contains(Current.Kind)) { + if (current == Current) + { + break; + } + current = Current; var next = ParseStatement(); statements.Add(next); } @@ -177,7 +183,7 @@ namespace Upsilon.Parser { var identifier = MatchToken(SyntaxKind.Identifier); arr.Add((IdentifierToken) identifier); - if (Current.Kind == SyntaxKind.InKeyword) + if (Current.Kind == SyntaxKind.InKeyword || Current.Kind == SyntaxKind.EndOfFile) break; MatchToken(SyntaxKind.Comma); } @@ -196,9 +202,15 @@ namespace Upsilon.Parser var functionToken = MatchToken(SyntaxKind.FunctionKeyword); var openParenthesis = MatchToken(SyntaxKind.OpenParenthesis); var variableBuilder = ImmutableArray.CreateBuilder(); + IdentifierToken lastIdentifier = null; while (Current.Kind != SyntaxKind.CloseParenthesis) { var variableIdentifier = (IdentifierToken)MatchToken(SyntaxKind.Identifier); + if (lastIdentifier == variableIdentifier) + { + break; + } + lastIdentifier = variableIdentifier; variableBuilder.Add(variableIdentifier); if (Current.Kind == SyntaxKind.Comma) NextToken(); @@ -221,10 +233,16 @@ namespace Upsilon.Parser var identifier = MatchToken(SyntaxKind.Identifier); var openParenthesis = MatchToken(SyntaxKind.OpenParenthesis); var variableBuilder = ImmutableArray.CreateBuilder(); + IdentifierToken lastIdentifier = null; while (Current.Kind != SyntaxKind.CloseParenthesis || Current.Kind == SyntaxKind.EndOfFile) { - var variableIdentifier = MatchToken(SyntaxKind.Identifier); - variableBuilder.Add((IdentifierToken) variableIdentifier); + var variableIdentifier =(IdentifierToken) MatchToken(SyntaxKind.Identifier); + if (lastIdentifier == variableIdentifier) + { + break; + } + lastIdentifier = variableIdentifier; + variableBuilder.Add( variableIdentifier); if (Current.Kind == SyntaxKind.Comma) NextToken(); } @@ -275,9 +293,13 @@ namespace Upsilon.Parser private ExpressionSyntax HandleComplexExpression(ExpressionSyntax baseExpression) { + SyntaxToken current = null; while (Current.Kind == SyntaxKind.OpenBracket || Current.Kind == SyntaxKind.OpenParenthesis || Current.Kind == SyntaxKind.FullStop) { + if (Current == current) + break; + current = Current; if (Current.Kind == SyntaxKind.OpenBracket) baseExpression = ParseIndexExpression(baseExpression); else if (Current.Kind == SyntaxKind.OpenParenthesis) @@ -406,8 +428,14 @@ namespace Upsilon.Parser { var openParenthesis = MatchToken(SyntaxKind.OpenParenthesis); var parameters = ImmutableArray.CreateBuilder(); + SyntaxToken current = null; while (Current.Kind != SyntaxKind.CloseParenthesis) { + if (Current == current) + { + break; + } + current = Current; var exp = ParseExpression(); parameters.Add(exp); if (Current.Kind == SyntaxKind.Comma) @@ -471,10 +499,17 @@ namespace Upsilon.Parser var openBrace = MatchToken(SyntaxKind.OpenBrace); var arrBuilder = ImmutableArray.CreateBuilder(); bool lastCommaFound = true; + SyntaxToken current = null; while (Current.Kind != SyntaxKind.CloseBrace) { if (!lastCommaFound) break; + if (Current == current) + { + break; + } + + current = Current; var parsed = ParseStatement(); SyntaxNode node = parsed; arrBuilder.Add(node);