コード例 #1
0
        public Item Compile(ByteCodeGenerator generator)
        {
            var type = node.GetType(generator);

            var lhs = new TranslationCompiler(node.LeftChild, type).Compile(generator);
            var rhs = new TranslationCompiler(node.RightChild, type).Compile(generator);

            if (!type.Primitive)
            {
                throw new InvalidOperationException();
            }

            lhs.Load();
            rhs.Load();

            if (node is MultiplicativeNode.MultiplicativeMultiplyNode)
            {
                CompileMultiplication(generator, type);
            }
            else if (node is MultiplicativeNode.MultiplicativeDivideNode)
            {
                CompileDivide(generator, type);
            }
            else if (node is MultiplicativeNode.MultiplicativeModNode)
            {
                CompileMod(generator, type);
            }

            return new StackItem(generator, type);
        }
コード例 #2
0
        public Item Compile(ByteCodeGenerator generator)
        {
            if (node.Value == null)
            {
                if (generator.Method.ReturnType != PrimativeTypes.Void)
                {
                    throw new InvalidOperationException();
                }

                generator.Emit(OpCodeValue.@return);

                return new VoidItem(generator);
            }

            var value = new TranslationCompiler(node.Value, generator.Method.ReturnType).Compile(generator);
            value.Load();

            CompileReturn(generator, value.Type);

            return new VoidItem(generator);
        }
コード例 #3
0
        public Item Compile(ByteCodeGenerator generator)
        {
            var type = node.GetType(generator);

            var lhs = new TranslationCompiler(node.LeftChild, type).Compile(generator);
            var rhs = new TranslationCompiler(node.RightChild, type).Compile(generator);

            lhs.Load();
            rhs.Load();

            if ((!lhs.Type.Primitive || !rhs.Type.Primitive) && (lhs.Type.Primitive || rhs.Type.Primitive))
            {
                throw new InvalidOperationException();
            }

            OpCodeValue opcode;
            if (node is EqualityNode.EqualityEqualNode)
            {
                if (type.Primitive)
                {
                    opcode = OpCodeValue.if_icmpeq;
                }
                else
                {
                    opcode = OpCodeValue.if_acmpeq;
                }
            }
            else if (node is EqualityNode.EqualityNotEqualNode)
            {
                opcode = type.Primitive ? OpCodeValue.if_icmpne : OpCodeValue.if_acmpne;
            }
            else
            {
                throw new NotImplementedException();
            }

            return new ConditionalItem(generator, opcode);
        }