Parse optional comma(s) after switch expression

This commit is contained in:
Alexander Luzgarev 2018-04-01 16:43:56 +02:00
parent ffb8b3009d
commit ddd52f169d
3 changed files with 23 additions and 3 deletions

View File

@ -594,6 +594,15 @@ namespace Parser
{
var switchKeyword = EatIdentifier("switch");
var expression = ParseExpression();
var commas = new List<TokenNode>();
while (CurrentToken.Kind == TokenKind.Comma)
{
commas.Add(Factory.Token(EatToken()));
}
if (commas.Count == 0)
{
commas = null;
}
var casesList = new List<SwitchCaseNode>();
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()

View File

@ -123,9 +123,15 @@ namespace Parser
ExpressionNode switchExpression,
List<SwitchCaseNode> cases,
TokenNode endKeyword,
List<TokenNode> optionalCommasAfterExpression,
TokenNode semicolonOrComma = null)
{
var children = new List<SyntaxNode> { 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;
}

View File

@ -219,6 +219,7 @@ namespace Parser
{
public TokenNode SwitchKeyword { get; }
public ExpressionNode SwitchExpression { get; }
public List<TokenNode> OptionalCommasAfterExpression { get; }
public List<SwitchCaseNode> Cases { get; }
public TokenNode EndKeyword { get; }
@ -228,11 +229,13 @@ namespace Parser
ExpressionNode switchExpression,
List<SwitchCaseNode> cases,
TokenNode endKeyword,
TokenNode semicolonOrComma
TokenNode semicolonOrComma,
List<TokenNode> optionalCommasAfterExpression = null
) : base(children, semicolonOrComma)
{
SwitchKeyword = switchKeyword;
SwitchExpression = switchExpression;
OptionalCommasAfterExpression = optionalCommasAfterExpression;
Cases = cases;
EndKeyword = endKeyword;
}