Exemple #1
0
 public IfElseExpressionFactory Consequence(BlockStatementParseResult consequenceParseResult)
 {
     consequence = new BlockStatement {
         Statements = consequenceParseResult.Statements
     };
     return(this);
 }
Exemple #2
0
 public FunctionExpressionFactory Body(BlockStatementParseResult bodyParseResult)
 {
     body = new BlockStatement {
         Statements = bodyParseResult.Statements
     };
     return(this);
 }
Exemple #3
0
                public IfElseExpressionFactory Alternative(BlockStatementParseResult alternativeParseResult)
                {
                    if (alternativeParseResult == default(BlockStatementParseResult))
                    {
                        return(this);
                    }

                    alternative = new BlockStatement {
                        Statements = alternativeParseResult.Statements
                    };
                    return(this);
                }
        private static ExpressionParseResult ParseIfElseExpression(ExpressionParseResult currentState)
        {
            BlockStatementParseResult alternativeParseResult = null;

            var conditionParseResult = ParseExpression(Factory.ExpressionParseResult()
                                                       .Assign(currentState)
                                                       .Position(currentState.Position + Skip.If)
                                                       .Precedence(Precedence.Lowest)
                                                       .Create()
                                                       );

            if (conditionParseResult.Errors.Count > 0)
            {
                return(conditionParseResult);
            }

            var consequenceParseResult = ParseBlockStatement(Factory.ExpressionParseResult()
                                                             .Assign(conditionParseResult)
                                                             .Position(conditionParseResult.Position + Skip.Brace)
                                                             .Create()
                                                             );

            if (consequenceParseResult.Errors.Count > 0)
            {
                return(Factory.ExpressionParseResult()
                       .Assign(currentState)
                       .Errors(consequenceParseResult.Errors)
                       .Create());
            }

            var elseToken = currentState.Tokens.Skip(consequenceParseResult.Position).Take(1).FirstOrDefault();

            if (elseToken != default(Token) && elseToken.Kind == SyntaxKind.Else)
            {
                alternativeParseResult = ParseBlockStatement(Factory.ExpressionParseResult()
                                                             .Assign(currentState)
                                                             .Position(consequenceParseResult.Position + Skip.Else + Skip.Brace)
                                                             .Create()
                                                             );

                if (alternativeParseResult.Errors.Count > 0)
                {
                    return(Factory.ExpressionParseResult()
                           .Assign(currentState)
                           .Errors(alternativeParseResult.Errors)
                           .Create());
                }
            }

            var expression = Factory.IfElseExpression()
                             .Condition(conditionParseResult)
                             .Consequence(consequenceParseResult)
                             .Alternative(alternativeParseResult)
                             .Create();

            var position = alternativeParseResult != default(BlockStatementParseResult) ?
                           alternativeParseResult.Position :
                           consequenceParseResult.Position;

            return(Factory.ExpressionParseResult()
                   .Assign(currentState)
                   .Expression(expression)
                   .Position(position)
                   .Precedence(Precedence.Lowest)
                   .Create());
        }