From ddd52f169d14da4c8c66d526b07252673bc58a82 Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Sun, 1 Apr 2018 16:43:56 +0200 Subject: [PATCH] Parse optional comma(s) after switch expression --- Parser/MParser.cs | 12 +++++++++++- Parser/SyntaxFactory.cs | 9 ++++++++- Parser/SyntaxNode.cs | 5 ++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Parser/MParser.cs b/Parser/MParser.cs index ea2d15c..6dec931 100644 --- a/Parser/MParser.cs +++ b/Parser/MParser.cs @@ -594,6 +594,15 @@ namespace Parser { var switchKeyword = EatIdentifier("switch"); var expression = ParseExpression(); + var commas = new List(); + while (CurrentToken.Kind == TokenKind.Comma) + { + commas.Add(Factory.Token(EatToken())); + } + if (commas.Count == 0) + { + commas = null; + } var casesList = new List(); while (CurrentToken.Kind == TokenKind.Identifier && CurrentToken.PureToken.LiteralText == "case") @@ -606,7 +615,8 @@ namespace Parser Factory.Token(switchKeyword), expression, casesList, - Factory.Token(endKeyword)); + Factory.Token(endKeyword), + commas); } public ExpressionStatementNode ParseExpressionStatement() diff --git a/Parser/SyntaxFactory.cs b/Parser/SyntaxFactory.cs index 1d278ca..7c65d14 100644 --- a/Parser/SyntaxFactory.cs +++ b/Parser/SyntaxFactory.cs @@ -123,9 +123,15 @@ namespace Parser ExpressionNode switchExpression, List cases, TokenNode endKeyword, + List optionalCommasAfterExpression, TokenNode semicolonOrComma = null) { var children = new List { switchKeyword, switchExpression }; + if (optionalCommasAfterExpression != null) + { + children.AddRange(optionalCommasAfterExpression); + } + children.AddRange(cases); children.Add(endKeyword); if (semicolonOrComma != null) @@ -139,7 +145,8 @@ namespace Parser switchExpression, cases, endKeyword, - semicolonOrComma); + semicolonOrComma, + optionalCommasAfterExpression); SetParent(result); return result; } diff --git a/Parser/SyntaxNode.cs b/Parser/SyntaxNode.cs index 1c2c69f..57ecadf 100644 --- a/Parser/SyntaxNode.cs +++ b/Parser/SyntaxNode.cs @@ -219,6 +219,7 @@ namespace Parser { public TokenNode SwitchKeyword { get; } public ExpressionNode SwitchExpression { get; } + public List OptionalCommasAfterExpression { get; } public List Cases { get; } public TokenNode EndKeyword { get; } @@ -228,11 +229,13 @@ namespace Parser ExpressionNode switchExpression, List cases, TokenNode endKeyword, - TokenNode semicolonOrComma + TokenNode semicolonOrComma, + List optionalCommasAfterExpression = null ) : base(children, semicolonOrComma) { SwitchKeyword = switchKeyword; SwitchExpression = switchExpression; + OptionalCommasAfterExpression = optionalCommasAfterExpression; Cases = cases; EndKeyword = endKeyword; }