CompileBlock() публичный Метод

public CompileBlock ( ) : Block
Результат AjTalk.Language.Block
Пример #1
0
 protected override object Evaluate(string text, Machine machine)
 {
     Parser parser = new Parser(text);
     Block block = parser.CompileBlock();
     Process process = new Process(block, null, machine);
     return process.Execute();
 }
Пример #2
0
        public void CompileBlock()
        {
            Parser compiler = new Parser("nil ifFalse: [self halt]");
            Block block = compiler.CompileBlock();

            Assert.IsNotNull(block);
            Assert.AreEqual(1, block.NoConstants);
            Assert.AreEqual(0, block.NoLocals);
            Assert.IsNotNull(block.ByteCodes);
            Assert.AreEqual(11, block.ByteCodes.Length);
            Assert.AreEqual(0, block.Arity);

            object constant = block.GetConstant(0);

            Assert.IsNotNull(constant);
            Assert.IsInstanceOfType(constant, typeof(Block));

            var newblock = (Block)constant;
            Assert.AreEqual(0, newblock.Arity);
            Assert.AreEqual(0, newblock.NoLocals);
            Assert.IsNotNull(newblock.ByteCodes);
            Assert.AreEqual(4, newblock.ByteCodes.Length);

            BlockDecompiler decompiler = new BlockDecompiler(block);
            var result = decompiler.Decompile();

            Assert.IsNotNull(result);
            Assert.AreEqual("GetNil", result[0]);
            Assert.AreEqual("JumpIfFalse 8", result[1]);
            Assert.AreEqual("GetNil", result[2]);
            Assert.AreEqual("Jump 11", result[3]);
            Assert.AreEqual("GetBlock { GetSelf; Send halt 0 }", result[4]);
        }
Пример #3
0
 public void CompileAndExecuteTwoSimpleCommand()
 {
     Parser compiler = new Parser("a := 1. b := 2");
     Block block = compiler.CompileBlock();
     Machine machine = new Machine();
     block.Execute(machine, null);
     Assert.AreEqual(1, machine.GetGlobalObject("a"));
     Assert.AreEqual(2, machine.GetGlobalObject("b"));
 }
Пример #4
0
        public void CompileExpressions()
        {
            IList<ExpressionResult> results = ExpressionResult.LoadExpressionResults("Expressions.txt");

            foreach (var result in results)
            {
                Parser parser = new Parser(result.Text);
                var block = parser.CompileBlock();
                Assert.IsNotNull(block);
                result.ValidateBlock(block);
            }
        }
Пример #5
0
        private void DoIt()
        {
            if (String.IsNullOrEmpty(txtInput.SelectedText))
                return;

            string text = txtInput.SelectedText;
            Parser parser = new Parser(text);

            try
            {
                Block block = parser.CompileBlock();
                object result = block.Execute(this.machine, null);
                if (result != null)
                    MessageBox.Show(result.ToString(), "Result");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Пример #6
0
        public object Evaluate(string command)
        {
            Machine current = Machine.Current;
            object result = null;

            try
            {
                this.machine.SetCurrent();
                Parser parser = new Parser(command);

                Block block = parser.CompileBlock();

                if (block != null)
                    result = block.Execute(this.machine, null);

                return result;
            }
            finally
            {
                Machine.SetCurrent(current);
            }
        }
Пример #7
0
 public void CompileSubClassDefinition()
 {
     Parser compiler = new Parser("nil subclass: #Object");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(2, block.NoConstants);
     Assert.AreEqual(0, block.NoGlobalNames);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(6, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #8
0
 public void CompileSimpleSum()
 {
     Parser compiler = new Parser("1 + 2");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(7, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
     BlockDecompiler decompiler = new BlockDecompiler(block);
     var result = decompiler.Decompile();
     Assert.IsNotNull(result);
     Assert.AreEqual(3, result.Count);
     Assert.AreEqual("GetConstant 1", result[0]);
     Assert.AreEqual("GetConstant 2", result[1]);
     Assert.AreEqual("Send + 1", result[2]);
 }
Пример #9
0
 public void CompileSimpleSetExpression()
 {
     Parser parser = new Parser("a := 1");
     var result = parser.CompileBlock();
     Assert.IsNotNull(result);
     Assert.IsNotNull(result.ByteCodes);
     Assert.AreEqual(ByteCode.SetGlobalVariable, (ByteCode)result.ByteCodes[2]);
     BlockDecompiler decompiler = new BlockDecompiler(result);
     var ops = decompiler.Decompile();
     Assert.IsNotNull(ops);
     Assert.AreEqual("SetGlobalVariable a", ops[1]);
 }
Пример #10
0
 public void CompileSimpleSendToSelf()
 {
     Parser compiler = new Parser("self invokeWith: 10");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(2, block.NoConstants);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(6, block.ByteCodes.Length);
     Assert.AreEqual(ByteCode.GetSelf, (ByteCode)block.ByteCodes[0]);
     Assert.AreEqual(0, block.Arity);
 }
Пример #11
0
 public void CompileSimpleAssingWithEqual()
 {
     Parser parser = new Parser("result := value = value");
     var result = parser.CompileBlock();
     Assert.IsNotNull(result);
     Assert.IsNotNull(result.ByteCodes);
     BlockDecompiler decompiler = new BlockDecompiler(result);
     var ops = decompiler.Decompile();
     Assert.IsNotNull(ops);
     Assert.AreEqual(4, ops.Count);
     Assert.AreEqual("GetGlobalVariable value", ops[0]);
     Assert.AreEqual("GetGlobalVariable value", ops[1]);
     Assert.AreEqual("Send = 1", ops[2]);
     Assert.AreEqual("SetGlobalVariable result", ops[3]);
 }
Пример #12
0
 public void CompileTwoCommandsUsingSemicolon()
 {
     Parser compiler = new Parser("nil invokeWith: 10; invokeWith: 20");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(3, block.NoConstants);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(12, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #13
0
 public void CompileSymbolArray()
 {
     Parser parser = new Parser("#(a b c)");
     var result = parser.CompileBlock();
     Assert.IsNotNull(result);
     Assert.IsNotNull(result.ByteCodes);
     BlockDecompiler decompiler = new BlockDecompiler(result);
     var ops = decompiler.Decompile();
     Assert.IsNotNull(ops);
     Assert.AreEqual(1, ops.Count);
     Assert.IsTrue(ops[0].StartsWith("GetConstant "));
 }
Пример #14
0
 public void CompileSimpleExpressionInParenthesisUsingYourself()
 {
     Parser compiler = new Parser("(1+2;yourself)");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(0, block.NoLocals);
     Assert.AreEqual(4, block.NoConstants);
     Assert.AreEqual(0, block.NoGlobalNames);
     BlockDecompiler decompiler = new BlockDecompiler(block);
     var result = decompiler.Decompile();
     Assert.IsNotNull(result);
     Assert.AreEqual(5, result.Count);
     Assert.AreEqual("GetConstant 1", result[0]);
     Assert.AreEqual("GetConstant 2", result[1]);
     Assert.AreEqual("Send + 1", result[2]);
     Assert.AreEqual("ChainedSend", result[3]);
     Assert.AreEqual("Send yourself 0", result[4]);
 }
Пример #15
0
 public void CompileSimpleExpressionInParenthesis()
 {
     Parser compiler = new Parser("(1+2)");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(0, block.NoLocals);
     Assert.AreEqual(3, block.NoConstants);
     Assert.AreEqual(0, block.NoGlobalNames);
     BlockDecompiler decompiler = new BlockDecompiler(block);
     var result = decompiler.Decompile();
     Assert.IsNotNull(result);
     Assert.AreEqual(3, result.Count);
     Assert.AreEqual("GetConstant 1", result[0]);
     Assert.AreEqual("GetConstant 2", result[1]);
     Assert.AreEqual("Send + 1", result[2]);
 }
Пример #16
0
 public void CompileSimpleCommandWithParenthesisAndBangKeyword()
 {
     Parser compiler = new Parser("a := b with: (anObject !nativeMethod: 1)");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(3, block.NoGlobalNames);
     Assert.AreEqual(3, block.NoConstants);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(14, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #17
0
 public void CompileSimpleCommandWithParenthesis()
 {
     Parser compiler = new Parser("a := b with: (anObject class)");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(1, block.NoConstants);
     Assert.AreEqual(3, block.NoGlobalNames);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(10, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #18
0
 public void CompileSimpleCommand()
 {
     Parser compiler = new Parser("nil invokeWith: 10");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(2, block.NoConstants);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(6, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #19
0
 public void CompileNumericPrimitiveWithError()
 {
     Parser parser = new Parser("<primitive: 60 error:ec>");
     var result = parser.CompileBlock();
     Assert.IsNotNull(result);
     Assert.IsNotNull(result.ByteCodes);
     BlockDecompiler decompiler = new BlockDecompiler(result);
     var ops = decompiler.Decompile();
     Assert.IsNotNull(ops);
     Assert.AreEqual(1, ops.Count);
     Assert.AreEqual("PrimitiveError 60 ec", ops[0]);
 }
Пример #20
0
 public void CompileSubClassDefinitionWithInstances()
 {
     Parser compiler = new Parser("nil subclass: #Object instanceVariables: 'a b c'");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(3, block.NoConstants);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(8, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #21
0
 public void CompileSumWithNegativeNumber()
 {
     Parser parser = new Parser("-1 + 0");
     var result = parser.CompileBlock();
     Assert.IsNotNull(result);
     Assert.IsNotNull(result.ByteCodes);
     BlockDecompiler decompiler = new BlockDecompiler(result);
     var ops = decompiler.Decompile();
     Assert.IsNotNull(ops);
     Assert.AreEqual(4, ops.Count);
     Assert.AreEqual("GetConstant 1", ops[0]);
     Assert.AreEqual("Send minus 0", ops[1]);
     Assert.AreEqual("GetConstant 0", ops[2]);
     Assert.AreEqual("Send + 1", ops[3]);
 }
Пример #22
0
 public void CompileWhileTrue()
 {
     Parser compiler = new Parser(":arg | [arg < 3] whileTrue: [arg := arg + 1]");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(13, block.Bytecodes.Length);
     var decompiler = new BlockDecompiler(block);
     var steps = decompiler.Decompile();
     Assert.IsNotNull(steps);
     Assert.AreEqual(7, steps.Count);
     Assert.AreEqual("GetBlock { GetArgument arg; GetConstant 3; Send < 1 }", steps[0]);
     Assert.AreEqual("Value", steps[1]);
     Assert.AreEqual("JumpIfFalse 13", steps[2]);
     Assert.AreEqual("GetBlock { GetArgument arg; GetConstant 1; Send + 1; SetArgument arg }", steps[3]);
     Assert.AreEqual("Value", steps[4]);
     Assert.AreEqual("Pop", steps[5]);
     Assert.AreEqual("Jump 0", steps[6]);
 }
Пример #23
0
 public void CompileTwoCommands()
 {
     Parser compiler = new Parser("nil invokeWith: 10. Global := 20");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(3, block.NoConstants);
     Assert.AreEqual(1, block.NoGlobalNames);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(10, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #24
0
        public void ExecuteBasicInstSizeInRectangle()
        {
            Machine machine = new Machine();
            IClass cls = CompileClass(
                "Rectangle",
                new string[] { "x", "y" },
                new string[] { "x ^x", "x: newX x := newX", "y ^y", "y: newY y := newY" });

            machine.SetGlobalObject("aRectangle", cls.NewObject());

            Parser compiler = new Parser("^aRectangle basicInstSize");
            Block block = compiler.CompileBlock();

            Assert.IsNotNull(block);

            object result = block.Execute(machine, null);

            Assert.AreEqual(2, result);
        }
Пример #25
0
 public void CompileTwoSimpleCommand()
 {
     Parser compiler = new Parser("a := 1. b := 2");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(2, block.NoConstants);
     Assert.AreEqual(0, block.NoLocals);
     Assert.AreEqual(2, block.NoGlobalNames);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(8, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #26
0
 public void CompileSimpleArithmeticWithParenthesis()
 {
     Parser compiler = new Parser("1 * (2 + 3)");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(5, block.NoConstants);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(12, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }
Пример #27
0
        public void ExecuteBasicInstSize()
        {
            Machine machine = new Machine();

            object nil = machine.UndefinedObjectClass;

            Assert.IsNotNull(nil);
            Assert.IsInstanceOfType(nil, typeof(IClass));

            Parser compiler = new Parser("^UndefinedObject new basicInstSize");
            Block block = compiler.CompileBlock();

            Assert.IsNotNull(block);

            object result = block.Execute(machine, null);

            Assert.AreEqual(0, result);
        }
Пример #28
0
 public void CompileSimpleOr()
 {
     Parser parser = new Parser("1 | 0");
     var result = parser.CompileBlock();
     Assert.IsNotNull(result);
     Assert.IsNotNull(result.ByteCodes);
     BlockDecompiler decompiler = new BlockDecompiler(result);
     var ops = decompiler.Decompile();
     Assert.IsNotNull(ops);
     Assert.AreEqual(3, ops.Count);
     Assert.AreEqual("GetConstant 1", ops[0]);
     Assert.AreEqual("GetConstant 0", ops[1]);
     Assert.AreEqual("Send | 1", ops[2]);
 }
Пример #29
0
        public void ExecuteBasicInstVarAtPut()
        {
            Machine machine = new Machine();
            IClass cls = CompileClass(
                "Rectangle",
                new string[] { "x", "y" },
                new string[] { "x ^x", "x: newX x := newX", "y ^y", "y: newY y := newY" });

            IObject iobj = (IObject)cls.NewObject();

            machine.SetGlobalObject("aRectangle", iobj);

            Parser compiler = new Parser("aRectangle basicInstVarAt: 1 put: 200");
            Block block = compiler.CompileBlock();

            Assert.IsNotNull(block);

            block.Execute(machine, null);

            Assert.AreEqual(200, iobj[0]);
            Assert.IsNull(iobj[1]);
        }
Пример #30
0
 public void CompileSimpleRealSum()
 {
     Parser compiler = new Parser("1.2 + 3.4");
     Block block = compiler.CompileBlock();
     Assert.IsNotNull(block);
     Assert.AreEqual(3, block.NoConstants);
     Assert.AreEqual(0, block.NoLocals);
     Assert.IsNotNull(block.ByteCodes);
     Assert.AreEqual(7, block.ByteCodes.Length);
     Assert.AreEqual(0, block.Arity);
 }