Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }