예제 #1
0
        public void PrintExpressionTest()
        {
            IKernel kernel = TestModule.GetTestKernel ();
            IExecutorFactory factory = kernel.Get<IExecutorFactory> ();
            Print print = new Print ( factory.GetPrintExecutor() );
            print.Expr = new ArithExpr
            {
                Left = new StringLiteral
                {
                    Value = "Yo "
                },
                Right = new StringLiteral
                {
                    Value = "planet!"
                },
                Op = ArithOp.Add
            };

            Block statements = new Block ();
            statements.Add ( print );

            new Executor ( statements );

            StandardOutDummy output = kernel.Get<IStandardOut> () as StandardOutDummy;
            Assert.AreEqual ( "Yo planet!", output.Text );
        }
예제 #2
0
        public void ParseBlock( Block block, Tokens tokens )
        {
            bool enclosed = false;
            if ( tokens.PeekToken () == BeginBlock )
            {
                enclosed = true;
                tokens.RemoveNextToken ( BeginBlock );
            }

            while ( !tokens.AtEnd () )
            {
                if ( enclosed && tokens.PeekToken () == EndBlock )
                {
                    tokens.RemoveNextToken ( EndBlock );
                    break;
                }

                bool parsed = false;
                foreach ( IStatementParser parser in _parsers )
                {
                    IStatement nextStatement;
                    if ( parser.TryParse( tokens, block.Scope, out nextStatement ) )
                    {
                        block.Add ( nextStatement );
                        parsed = true;
                        break;
                    }
                }

                if (!parsed)
                    throw new Exception("Unable to parse token " + tokens.PeekToken() );
            }
        }
예제 #3
0
        public Block GetBlock( IScope scope, Tokens tokens )
        {
            Block newBlock = new Block ();
            newBlock.Scope = scope;
            ParseBlock ( newBlock, tokens );

            return newBlock;
        }
예제 #4
0
        public void TestAccessArray()
        {
            IKernel kernel = TestModule.GetTestKernel ();
            var factory = kernel.Get<IExecutorFactory>();

            Block statements = new Block ();
            statements.Scope = new Scope ();

            ArrayExpr array = new ArrayExpr(factory.GetArrayExecutor());
            array.Scope = statements.Scope;

            array.Elements.Add(new StringLiteral {
                Value = "yay"
            });

            array.Elements.Add(new StringLiteral {
                Value = "boo"
            });

            Assign assign = new Assign(factory.GetAssignExecutor())
            {
                Ident = new Variable ( factory.GetVariableExecutor ())
                {
                    Scope = statements.Scope,
                    Ident = "x"
                },
                Expr = array,
                Scope = statements.Scope
            };

            Print print = new Print(factory.GetPrintExecutor());
            print.Expr = new Variable( factory.GetVariableExecutor())
            {
                Scope = statements.Scope,
                Ident = "x",
                Indexer = new NumberLiteral()
                {
                    Value = 1
                }
            };

            statements.Add ( assign );
            statements.Add ( print );

            statements.Execute();

            StandardOutDummy output = kernel.Get<IStandardOut> () as StandardOutDummy;
            Assert.AreEqual ( "boo", output.Text );
        }
예제 #5
0
        public void ExecuteBlockTest()
        {
            IKernel kernel = TestModule.GetTestKernel ();
            Assign assign = kernel.Get<Assign> ();
            assign.Ident = "x";

            Block block = new Block();
            Print print = kernel.Get<Print> ();
            print.Expr = new StringLiteral { Value = "Yo planet!" };
            block.Add(print);

            assign.Expr = block;

            Block statements = new Block ();
            statements.Add ( assign );
            Variable variable = kernel.Get<Variable> ();
            variable.Ident = "x";
            statements.Add ( variable );

            Executor target = new Executor ( statements );

            StandardOutDummy output = kernel.Get<IStandardOut> () as StandardOutDummy;
            Assert.AreEqual ( "Yo planet!", output.Text );
        }
예제 #6
0
        public void ExecuteBlockTest()
        {
            IKernel kernel = TestModule.GetTestKernel ();
            IExecutorFactory factory = kernel.Get<IExecutorFactory> ();
            Block statements = new Block ();
            statements.Scope = new Scope();

            Assign assign = new Assign ( factory.GetAssignExecutor () );
            assign.Ident = new Variable ( factory.GetVariableExecutor () )
            {
                Ident = "x"
            };
            assign.Scope = statements.Scope;

            Block block = new Block();
            block.Scope = statements.Scope;

            Print print = new Print ( factory.GetPrintExecutor () );
            print.Scope = block.Scope;
            print.Expr = new StringLiteral { Value = "Yo planet!" };
            block.Add(print);

            assign.Expr = block;

            Assert.IsTrue ( assign.Scope != null );
            statements.Add ( assign );
            Variable variable = new Variable ( factory.GetVariableExecutor () );
            variable.Ident = "x";
            variable.Scope = statements.Scope;
            statements.Add ( variable );

            new Executor ( statements );

            StandardOutDummy output = kernel.Get<IStandardOut> () as StandardOutDummy;
            Assert.AreEqual ( "Yo planet!", output.Text );
        }
예제 #7
0
파일: Executor.cs 프로젝트: mdcuesta/Ongle
 public Executor( Block statements )
 {
     statements.Execute ();
 }
예제 #8
0
파일: Parser.cs 프로젝트: mdcuesta/Ongle
 public Parser( IKernel kernel )
 {
     MainBlock = new Block ();
     MainBlock.Scope = new Scope ();
     _kernel = kernel;
 }
예제 #9
0
        public void SimpleIfTest()
        {
            IKernel kernel = TestModule.GetTestKernel ();
            Block statements = new Block ();

            Assign assign = kernel.Get<Assign> ();
            assign.Ident = "x";
            assign.Expr = new NumberLiteral
            {
                Value = 5
            };
            statements.Add ( assign );

            If iif = kernel.Get<If> ();
            Variable variable = kernel.Get<Variable> ();
            ( variable as Variable ).Ident = "x";

            iif.Test = new ArithExpr
            {
                Left = variable,
                Op = ArithOp.Equality,
                Right = new NumberLiteral
                {
                    Value = 5
                }
            };

            iif.Body = new Block ();

            Print print = kernel.Get<Print> ();
            Variable call = kernel.Get<Variable> ();
            ( call as Variable ).Ident = "x";
            print.Expr = call;

            iif.Body.Add( print );
            statements.Add ( iif );

            Executor target = new Executor ( statements );

            StandardOutDummy output = kernel.Get<IStandardOut> () as StandardOutDummy;
            Assert.AreEqual ( "5", output.Text );
        }
예제 #10
0
        public void SimplePrintTest()
        {
            IKernel kernel = TestModule.GetTestKernel ();
            Print print = kernel.Get<Print> ();
            print.Expr = new StringLiteral {
                Value = "Yo planet!"
            };

            Block statements = new Block ();
            statements.Add ( print );

            Executor target = new Executor ( statements );

            StandardOutDummy output = kernel.Get<IStandardOut> () as StandardOutDummy;
            Assert.AreEqual( "Yo planet!", output.Text );
        }
예제 #11
0
        public void SimpleIfTest()
        {
            IKernel kernel = TestModule.GetTestKernel ();
            IExecutorFactory factory = kernel.Get<IExecutorFactory> ();
            Block statements = new Block ();
            statements.Scope = new Scope ();

            Assign assign = new Assign ( factory.GetAssignExecutor () );
            assign.Scope = statements.Scope;
            assign.Ident = new Variable ( factory.GetVariableExecutor () )
            {
                Ident = "x"
            };
            assign.Expr = new NumberLiteral
            {
                Value = 5
            };
            statements.Add ( assign );

            If iif = new If ( factory.GetIfExecutor() );
            Variable variable = new Variable ( factory.GetVariableExecutor () );
            ( variable as Variable ).Ident = "x";

            iif.Scope = statements.Scope;
            iif.Test = new ArithExpr
            {
                Scope = iif.Scope,
                Left = variable,
                Op = ArithOp.Equality,
                Right = new NumberLiteral
                {
                    Value = 5
                }
            };

            iif.Body = new Block ();
            iif.Body.Scope = statements.Scope;

            Print print = new Print ( factory.GetPrintExecutor () );
            Variable call = new Variable ( factory.GetVariableExecutor () );
            ( call as Variable ).Ident = "x";
            print.Expr = call;

            print.Scope = iif.Body.Scope;
            call.Scope = iif.Body.Scope;
            iif.Body.Add( print );
            statements.Add ( iif );

            new Executor ( statements );

            StandardOutDummy output = kernel.Get<IStandardOut> () as StandardOutDummy;
            Assert.AreEqual ( "5", output.Text );
        }