Esempio n. 1
0
        /// <summary>
        /// Parses a for loop.
        /// </summary>
        /// <remarks>
        /// Assumes the 'for' keyword has already been consumed.
        /// </remarks>
        internal static ExpressionBase Parse(PositionalTokenizer tokenizer, int line = 0, int column = 0)
        {
            ExpressionBase.SkipWhitespace(tokenizer);
            var keywordFor = new KeywordExpression("for", line, column);

            line   = tokenizer.Line;
            column = tokenizer.Column;
            var iteratorName = tokenizer.ReadIdentifier();

            if (iteratorName.IsEmpty)
            {
                return(ParseError(tokenizer, "Invalid function name", line, column));
            }
            var iterator = new VariableDefinitionExpression(iteratorName.ToString(), line, column);

            ExpressionBase.SkipWhitespace(tokenizer);

            line   = tokenizer.Line;
            column = tokenizer.Column;
            if (!tokenizer.Match("in"))
            {
                return(ParseError(tokenizer, "Expected 'in' after loop variable"));
            }
            var keywordIn = new KeywordExpression("in", line, column);

            var range = ExpressionBase.Parse(tokenizer);

            if (range.Type == ExpressionType.ParseError)
            {
                return(range);
            }

            var loop = new ForExpression(iterator, range);

            var error = ExpressionBase.ParseStatementBlock(tokenizer, loop.Expressions);

            if (error != null)
            {
                return(error);
            }

            loop._keywordFor = keywordFor;
            loop._keywordIn  = keywordIn;
            loop.Line        = keywordFor.Line;
            loop.Column      = keywordFor.Column;
            loop.EndLine     = tokenizer.Line;
            loop.EndColumn   = tokenizer.Column;

            return(loop);
        }
Esempio n. 2
0
        /// <summary>
        /// Parses a if definition.
        /// </summary>
        /// <remarks>
        /// Assumes the 'if' keyword has already been consumed.
        /// </remarks>
        internal static ExpressionBase Parse(PositionalTokenizer tokenizer, int line = 0, int column = 0)
        {
            ExpressionBase.SkipWhitespace(tokenizer);

            var condition = ExpressionBase.Parse(tokenizer);

            if (condition.Type == ExpressionType.ParseError)
            {
                return(condition);
            }

            if (condition.Type != ExpressionType.Conditional && condition.Type != ExpressionType.Comparison)
            {
                return(ParseError(tokenizer, "Expected conditional statement following if", condition));
            }

            var ifExpression = new IfExpression(condition);

            ifExpression._keyword = new KeywordExpression("if", line, column);

            var error = ExpressionBase.ParseStatementBlock(tokenizer, ifExpression.Expressions);

            if (error != null)
            {
                return(error);
            }

            ExpressionBase.SkipWhitespace(tokenizer);

            if (tokenizer.Match("else"))
            {
                error = ExpressionBase.ParseStatementBlock(tokenizer, ifExpression.ElseExpressions);
                if (error != null)
                {
                    return(error);
                }
            }

            return(ifExpression);
        }
Esempio n. 3
0
        /// <summary>
        /// Parses a if definition.
        /// </summary>
        /// <remarks>
        /// Assumes the 'if' keyword has already been consumed.
        /// </remarks>
        internal static ExpressionBase Parse(PositionalTokenizer tokenizer, int line = 0, int column = 0)
        {
            ExpressionBase.SkipWhitespace(tokenizer);

            var condition = ExpressionBase.Parse(tokenizer);

            if (condition.Type == ExpressionType.ParseError)
            {
                return(condition);
            }

            var ifExpression = new IfExpression(condition);

            ifExpression._keyword = new KeywordExpression("if", line, column);

            var error = ExpressionBase.ParseStatementBlock(tokenizer, ifExpression.Expressions);

            if (error != null)
            {
                return(error);
            }

            ExpressionBase.SkipWhitespace(tokenizer);

            line   = tokenizer.Line;
            column = tokenizer.Column;
            if (tokenizer.Match("else"))
            {
                ifExpression._elseKeyword = new KeywordExpression("else", line, column);

                error = ExpressionBase.ParseStatementBlock(tokenizer, ifExpression.ElseExpressions);
                if (error != null)
                {
                    return(error);
                }
            }

            return(ifExpression);
        }