private static ListSyntax ParseExplicitBlock(ParserContext context) { var token = context.Tokens.Dequeue(); var span = token.Span; var list = new ListSyntax(); SkipWhitespaceTokens(context); if (context.Tokens.Peek().Type == TokenType.CurlyClose) { context.Tokens.Dequeue(); list.Span = span; return(list); } while (token.Type != TokenType.None) { if (token.Type == TokenType.CurlyClose) { context.Tokens.Dequeue(); break; } list.Add(ParseBlock(context)); token = context.Tokens.Peek(); } list.Span = span.WithEnd(token.Span.End); return(list); }
private static ListSyntax <ArgumentSyntax> ParseArguments(ParserContext context) { var token = context.Tokens.Dequeue(); var span = token.Span; var list = new ListSyntax <ArgumentSyntax>(); SkipWhitespaceTokens(context); if (context.Tokens.Peek().Type == TokenType.ParenthesesClose) { context.Tokens.Dequeue(); list.Span = span; return(list); } while (token.Type != TokenType.None) { if (token.Type == TokenType.ParenthesesClose) { context.Tokens.Dequeue(); break; } else if (token.Type == TokenType.Semicolon) { context.Tokens.Dequeue(); } list.Add(ParseArgument(context)); token = context.Tokens.Peek(); } for (int i = 0; i < list.Count; i++) { list[i].Position = i; } list.Span = span.WithEnd(token.Span.End); return(list); }
private static ObjectSyntax ParseObject(ParserContext context) { var token = context.Tokens.Dequeue(); var span = token.Span; var obj = new ObjectSyntax(); var list = new ListSyntax <FieldSyntax>(); obj.Fields = list; SkipWhitespaceTokens(context); if (context.Tokens.Peek().Type == TokenType.CurlyClose) { context.Tokens.Dequeue(); list.Span = span; return(obj); } while (token.Type != TokenType.None) { if (token.Type == TokenType.CurlyClose) { context.Tokens.Dequeue(); break; } var field = ParseField(context); if (field != null) { list.Add(field); } token = context.Tokens.Peek(); } list.Span = span.WithEnd(token.Span.End); return(obj); }
private static ListSyntax ParseBlock(ParserContext context, params TokenType[] stop) { var token = context.Tokens.Peek(); var span = token !.Span; var list = new ListSyntax(); bool continueParsing = true; SyntaxNode?outNode = null; while (continueParsing && token.Type != TokenType.None) { continueParsing = ParseElement(context, stop, out outNode); if (outNode != null) { list.Add(outNode); } token = context.Tokens.Peek(); } token = context.Tokens.Peek(); list.Span = span.WithEnd(token.Span.End); context.Tokens.SkipWhile(e => e.Type == TokenType.Newline); return(list); }