コード例 #1
0
        public bool VisitIfStatement(Stmt.If statement)
        {
            bool result = true;

            var cg = Examine(statement.Condition);

            if (cg.Type != TypeEnum.BOOL)
            {
                result = false;
                Console.WriteLine("Not a boolean value in if condition");
            }

            bool ms = Examine(statement.MainBlock);

            if (!ms)
            {
                result = false;
                Console.WriteLine("If statement main block is bad");
            }

            if (statement.ElseBlock != null)
            {
                bool es = Examine(statement.ElseBlock);

                if (!es)
                {
                    result = false;
                    Console.WriteLine("If statement else block is bad");
                }
            }

            return(result);
        }
コード例 #2
0
ファイル: AstPrinter.cs プロジェクト: jonnyboyC/cs-Lox
        public IEnumerable <string> VisitIfStmt(Stmt.If stmt)
        {
            string[] ifBody = PrintStmt(stmt.ThenBranch).ToArray();
            yield return($"if ({PrintExpr(stmt.Condition)}) {ifBody[0]}");

            foreach (string print in ifBody.Skip(1))
            {
                yield return(print);
            }

            string[] elseBody = stmt.ElseBranch.Match(
                some: elseStmt => PrintStmt(elseStmt).ToArray(),
                none: () => new string[0]
                );

            if (elseBody.Any())
            {
                yield return($"else {elseBody[0]}");

                foreach (string print in elseBody.Skip(1))
                {
                    yield return(print);
                }
            }
        }
コード例 #3
0
        public LoxVoid VisitIfStmt(Stmt.If stmt)
        {
            Resolve(stmt.Condition);
            Resolve(stmt.ThenBranch);

            stmt.ElseBranch.MatchSome(elseBranch => Resolve(elseBranch));
            return(null);
        }
コード例 #4
0
ファイル: AstPrinter.cs プロジェクト: perlang-org/perlang
        public string VisitIfStmt(Stmt.If stmt)
        {
            if (stmt.ElseBranch == null)
            {
                return(Parenthesize2("if", stmt.Condition, stmt.ThenBranch));
            }

            return(Parenthesize2("if-else", stmt.Condition, stmt.ThenBranch, stmt.ElseBranch));
        }
コード例 #5
0
 public object visitIfStmt(Stmt.If stmt)
 {
     resolve(stmt.condition);
     resolve(stmt.thenBranch);
     if (stmt.elseBranch != null)
     {
         resolve(stmt.elseBranch);
     }
     return(null);
 }
コード例 #6
0
ファイル: Resolver.cs プロジェクト: sisakat/cslox
 public object VisitIfStmt(Stmt.If stmt)
 {
     Resolve(stmt.Condition);
     Resolve(stmt.ThenBranch);
     if (stmt.ElseBranch != null)
     {
         Resolve(stmt.ElseBranch);
     }
     return(null);
 }
コード例 #7
0
 public Unit VisitIfStmt(Stmt.If stmt)
 {
     Resolve(stmt.Condition);
     Resolve(stmt.ThenBranch);
     if (stmt.ElseBranch != null)
     {
         Resolve(stmt.ElseBranch);
     }
     return(new Unit());
 }
コード例 #8
0
 object Stmt.Visitor <object> .VisitIfStmt(Stmt.If stmt)
 {
     if (IsTruthy(Evaluate(stmt.condition)))
     {
         Execute(stmt.thenBranch);
     }
     else if (stmt.elseBranch != null)
     {
         Execute(stmt.elseBranch);
     }
     return(null);
 }
コード例 #9
0
 public object visitIfStmt(Stmt.If stmt)
 {
     if (isTruthy(evaluate(stmt.condition)))
     {
         execute(stmt.thenBranch);
     }
     else if (stmt.elseBranch != null)
     {
         execute(stmt.elseBranch);
     }
     return(null);
 }
コード例 #10
0
ファイル: Resolver.cs プロジェクト: jukaLang/Juka
        public object VisitIfStmt(Stmt.If stmt)
        {
            Resolve(stmt.condition);
            Resolve(stmt.thenBranch);

            if (stmt.elseBranch != null)
            {
                Resolve(stmt.elseBranch);
            }

            return(new Stmt.DefaultStatement());
        }
コード例 #11
0
        public object VisitIfStmt(Stmt.If stmt)
        {
            if (IsTruthy(Evaluate(stmt.condition)))
            {
                Execute(stmt.thenBranch);
            }
            else if (stmt.elseBranch is not null)
            {
                Execute(stmt.elseBranch);
            }

            return(null);
        }
コード例 #12
0
ファイル: Interpreter.cs プロジェクト: HereIsKevin/SharpLox
    public object VisitIfStmt(Stmt.If stmt)
    {
        if (IsTruthy(Evaluate(stmt.Condition)))
        {
            Execute(stmt.ThenBranch);
        }
        else if (stmt.ElseBranch != null)
        {
            Execute(stmt.ElseBranch);
        }

        return(null);
    }
コード例 #13
0
ファイル: Interpreter.cs プロジェクト: jonnyboyC/cs-Lox
        public LoxVoid VisitIfStmt(Stmt.If stmt)
        {
            if (IsTruthy(Evalutate(stmt.Condition)))
            {
                Execute(stmt.ThenBranch);
            }
            else
            {
                stmt.ElseBranch.MatchSome((elseBranch) => Execute(elseBranch));
            }

            return(null);
        }
コード例 #14
0
        public override VoidObject VisitIfStmt(Stmt.If stmt)
        {
            base.VisitIfStmt(stmt);

            if (stmt.Condition.TypeReference.ClrType != typeof(bool))
            {
                TypeValidationErrorCallback(new TypeValidationError(
                                                (stmt.Condition as ITokenAware)?.Token,
                                                $"'{stmt.Condition.TypeReference.ClrType.ToTypeKeyword()}' is not a valid 'if' condition."
                                                ));
            }

            return(VoidObject.Void);
        }
コード例 #15
0
        public Stmt VisitIfStmt(Stmt.If stmt)
        {
            Stmt.DefaultStatement defaultStatement = new Stmt.DefaultStatement();

            if (IsTrue(Evaluate(stmt.condition)))
            {
                Execute(stmt.thenBranch);
            }
            else
            {
                Execute(stmt.elseBranch);
            }

            return(defaultStatement);
        }
コード例 #16
0
    public string VisitIfStmt(Stmt.If stmt)
    {
        var cond = evaluate(stmt.Condition);

        if (cond is bool)
        {
            if ((bool)cond)
            {
                execute(stmt.WhenTrue);
            }
            else if (stmt.WhenFalse != null)
            {
                execute(stmt.WhenFalse);
            }

            return("");
        }

        throw new RuntimeError("If statement condition not a boolean value");
    }
コード例 #17
0
        public static TrashObject IfStmt(this Interpreter interpreter, Stmt.If stmt)
        {
            var cond = interpreter.Evaluate(stmt.Condition).Access();

            if (cond is bool)
            {
                if ((bool)cond)
                {
                    interpreter.Execute(stmt.WhenTrue);
                }
                else if (stmt.WhenFalse != null)
                {
                    interpreter.Execute(stmt.WhenFalse);
                }

                return(null);
            }

            throw new Interpreter.RuntimeError("If statement condition not a boolean value");
        }
コード例 #18
0
        public object visitIfStmt(Stmt.If ifStmt)
        {
            compile(ifStmt.condition);

            int thenJump = emitJump((byte)OpCode.OP_JUMP_IF_FALSE);

            emitByte(OpCode.OP_POP);
            compile(ifStmt.thenBranch);

            int elseJump = emitJump((byte)OpCode.OP_JUMP);

            patchJump(thenJump);
            emitByte(OpCode.OP_POP);

            if (ifStmt.elseBranch != null)
            {
                compile(ifStmt.elseBranch);
            }

            patchJump(elseJump);

            return(null);
        }
コード例 #19
0
 public object VisitIfStmt(Stmt.If stmt, object options)
 {
     return(Parenthesize("if", stmt.value));
 }
コード例 #20
0
        public Stmt VisitIfStatement(Stmt.If statement)
        {
            Visit(statement.Condition);
            var conditionValue = _valueStack.Pop();
            var condition      = LLVM.BuildICmp(_builder, LLVMIntPredicate.LLVMIntNE, conditionValue, LLVM.ConstInt(LLVM.Int1Type(), 0, _lFalse), "cond");

            LLVMValueRef func = LLVM.GetBasicBlockParent(LLVM.GetInsertBlock(_builder));

            LLVMBasicBlockRef thenb = LLVM.AppendBasicBlock(func, "then");
            //LLVMBasicBlockRef elseb = LLVM.AppendBasicBlock(func, "else");
            LLVMBasicBlockRef merge = LLVM.AppendBasicBlock(func, "merge");

            if (statement.ElseBlock != null)
            {
                LLVMBasicBlockRef elseb = LLVM.AppendBasicBlock(func, "else");

                LLVM.BuildCondBr(_builder, condition, thenb, elseb);
                LLVM.PositionBuilderAtEnd(_builder, thenb);

                Visit(statement.MainBlock);

                LLVM.BuildBr(_builder, merge);
                thenb = LLVM.GetInsertBlock(_builder);

                LLVM.PositionBuilderAtEnd(_builder, elseb);

                Visit(statement.ElseBlock);

                LLVM.BuildBr(_builder, merge);
                elseb = LLVM.GetInsertBlock(_builder);

                LLVM.PositionBuilderAtEnd(_builder, merge);

                return(null);
            }
            else
            {
                LLVM.BuildCondBr(_builder, condition, thenb, merge);
                LLVM.PositionBuilderAtEnd(_builder, thenb);

                Visit(statement.MainBlock);

                LLVM.BuildBr(_builder, merge);
                thenb = LLVM.GetInsertBlock(_builder);

                //LLVM.PositionBuilderAtEnd(_builder, elseb);

                //Visit(statement.ElseBlock);

                //LLVM.BuildBr(_builder, merge);
                //elseb = LLVM.GetInsertBlock(_builder);

                LLVM.PositionBuilderAtEnd(_builder, merge);

                return(null);
            }

            /*LLVM.BuildCondBr(_builder, condition, thenb, elseb);
             * LLVM.PositionBuilderAtEnd(_builder, thenb);
             *
             * Visit(statement.MainBlock);
             *
             * LLVM.BuildBr(_builder, merge);
             * thenb = LLVM.GetInsertBlock(_builder);
             *
             * LLVM.PositionBuilderAtEnd(_builder, elseb);
             *
             * Visit(statement.ElseBlock);
             *
             * LLVM.BuildBr(_builder, merge);
             * elseb = LLVM.GetInsertBlock(_builder);
             *
             * LLVM.PositionBuilderAtEnd(_builder, merge);
             *
             * return null;*/
        }
コード例 #21
0
ファイル: Interpreter.cs プロジェクト: mlewicki12/trashml
 public TrashObject VisitIfStmt(Stmt.If stmt)
 {
     return(this.IfStmt(stmt));
 }
コード例 #22
0
ファイル: RoslynGenerate.cs プロジェクト: jukaLang/Juka
 public Stmt VisitIfStmt(Stmt.If stmt)
 {
     throw new NotImplementedException();
 }
コード例 #23
0
 public object VisitIfStmt(Stmt.If stmt, object options = null)
 {
     return(null);
 }