コード例 #1
0
 public object visitTernaryExpr(Expr.TernaryExpr ternaryExpr)
 {
     resolve(ternaryExpr.comparisonExpression);
     resolve(ternaryExpr.falseExpression);
     resolve(ternaryExpr.trueExpression);
     return(null);
 }
コード例 #2
0
        public object visitTernaryExpr(Expr.TernaryExpr ternaryExpr)
        {
            bool comparisonExpression = (bool)evaluate(ternaryExpr.comparisonExpression);

            if (comparisonExpression)
            {
                return(evaluate(ternaryExpr.trueExpression));
            }
            else
            {
                return(evaluate(ternaryExpr.falseExpression));
            }
        }
コード例 #3
0
        private Expr ternaryExpression()
        {
            Expr expr = isNull(); //Comparison expression
            Expr trueExpression;  //Result if comparison is true

            if (match(TokenType.TERNARY_QUESTION))
            {
                trueExpression = isNull();
                if (match(TokenType.TERNARY_COLON))
                {
                    Expr falseExpression = isNull(); //Result if comparison is false.
                    Expr temp            = expr;
                    expr = new Expr.TernaryExpr(temp, trueExpression, falseExpression);
                }
            }

            return(expr);
        }
コード例 #4
0
        private Expr call()
        {
            Expr expr = primary();

            while (true)
            {
                if (match(TokenType.LEFT_PAREN))
                {
                    expr = finishCall(expr);
                }
                else if (match(TokenType.DOT))
                {
                    Token name = consume(TokenType.IDENTIFIER, "Expect property name after '.'.");
                    expr = new Expr.Get(expr, name, false);
                }
                else if (match(TokenType.QUESTION_DOT))
                {
                    Token nil           = new Token(TokenType.NIL, "nil", null, -1, -1);
                    Expr  callIfNotNull = new Expr.Get(expr, consume(TokenType.IDENTIFIER, "Expect property after '?."), false);
                    if (match(TokenType.LEFT_PAREN))
                    {
                        callIfNotNull = finishCall(callIfNotNull);
                    }
                    expr = new Expr.TernaryExpr(
                        new Expr.BinaryExpr(expr, new Token(TokenType.EQUALS_EQUALS, "==", null, -1, -1), new Expr.Literal(null, nil)), // ?
                        new Expr.Literal(null, nil),                                                                                    // :
                        callIfNotNull);                                                                                                 // new Expr.Get(expr, consume(TokenType.IDENTIFIER, "Expect property after '?."), false));
                    ((Expr.TernaryExpr)expr).isNullAccessor = true;
                }
                else
                {
                    break;
                }
            }
            return(expr);
        }
コード例 #5
0
ファイル: AstPrinter.cs プロジェクト: NoahBPeterson/csLox
 public string visitTernaryExpr(Expr.TernaryExpr expr)
 {
     return(parenthesize("?:", new Expr[] { expr.comparisonExpression, expr.trueExpression, expr.falseExpression }));
 }