Exemple #1
0
 public IfNode(List <IfCase> ifCases, ElseCase elseCase)
 {
     IfCases  = ifCases;
     ElseCase = elseCase;
 }
Exemple #2
0
        private ParseResult IfExpr()
        {
            List <IfCase> cases    = new List <IfCase>();
            ElseCase      elseCase = null;
            var           start    = current_token.Pos_Start.Copy();

            Advance();
            var conditionResult = Expr();

            if (conditionResult.HasError())
            {
                return(conditionResult);
            }

            if (!current_token.Equals(new Token(TokenType.KEYWORD, "then")))
            {
                return(new InvalidSyntaxError("Expected 'then'", current_token.Pos_Start, current_token.Pos_End));
            }
            Advance();
            var ifResult = Expr();

            if (ifResult.HasError())
            {
                return(ifResult);
            }
            cases.Add(new IfCase(conditionResult.Node, ifResult.Node));

            while (current_token.Equals(new Token(TokenType.KEYWORD, "elif")))
            {
                Advance();
                var elifConditionResult = Expr();
                if (elifConditionResult.HasError())
                {
                    return(elifConditionResult);
                }

                if (!current_token.Equals(new Token(TokenType.KEYWORD, "then")))
                {
                    return(new InvalidSyntaxError("Expected 'then'", current_token.Pos_Start, current_token.Pos_End));
                }
                Advance();
                var elifResult = Expr();
                if (elifResult.HasError())
                {
                    return(elifResult);
                }
                cases.Add(new IfCase(elifConditionResult.Node, elifResult.Node));
            }

            if ((current_token.Equals(new Token(TokenType.KEYWORD, "else"))))
            {
                Advance();
                var elseResult = Expr();
                if (elseResult.HasError())
                {
                    return(elseResult);
                }
                elseCase = new ElseCase(elseResult.Node);
            }

            return(new IfNode(cases, elseCase).SetPos(start, elseCase?.Expr.Pos_End ?? cases[cases.Count - 1].Expr.Pos_End));
        }