예제 #1
0
        // Traverses the tree and generates output code
        public void Generate(CilEmitter emitter)
        {
            emitter.BeginProgram();

            ILabel begin = emitter.GenerateLabel();
            ILabel end   = emitter.GenerateLabel();

            begin.Emit();
            root.Generate(emitter, begin, end);
            end.Emit();

            emitter.WriteExecutable();
        }
예제 #2
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            ILabel ifLabel   = emitter.GenerateLabel();
            ILabel elseLabel = emitter.GenerateLabel();

            logicalExpression.EmitRValue(emitter);

            elseLabel.EmitJumpIfFalse();

            ifLabel.Emit();
            ifStatement.Generate(emitter, ifLabel, after);
            after.EmitJump();

            elseLabel.Emit();
            elseStatement.Generate(emitter, elseLabel, after);
        }
예제 #3
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            ILabel whileLabel = emitter.GenerateLabel();

            logicalExpr.EmitRValue(emitter);

            after.EmitJumpIfFalse();
            whileLabel.Emit();

            statement.Generate(emitter, whileLabel, begin);

            begin.EmitJump();

            /*
             *
             * logicalExpression.jumping(0, after)
             *
             * create label
             *
             * emit label
             *
             * stmt.Gen(label, begin)
             *
             * emit goto begin
             *
             */
        }
예제 #4
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            ILabel comparisonLabel = emitter.GenerateLabel();
            ILabel contentsLabel   = emitter.GenerateLabel();

            variable = emitter.EmitLocalVarDeclaration("STEPS_LOOP_VAR" + stepCountExpr.lexline + "_" + stepCountExpr.lexline, typeof(int));
            stepCountExpr.EmitRValue(emitter);
            variable.EmitAssignment();

            comparisonLabel.Emit();

            variable.EmitValue();
            emitter.EmitInt32(0);
            emitter.EmitComparison(">");

            after.EmitJumpIfFalse();
            contentsLabel.Emit();

            statement.Generate(emitter, contentsLabel, comparisonLabel);

            variable.EmitValue();
            emitter.EmitInt32(1);
            emitter.EmitBinaryOperator("-");
            variable.EmitAssignment();

            comparisonLabel.EmitJump();

            /*
             *
             * logicalExpression.jumping(0, after)
             *
             * create label
             *
             * emit label
             *
             * stmt.Gen(label, begin)
             *
             * emit goto begin
             *
             */
        }
예제 #5
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            ILabel doEnd = emitter.GenerateLabel();

            statement.Generate(emitter, begin, doEnd);

            doEnd.Emit();

            logicalExpr.EmitRValue(emitter);

            begin.EmitJumpIfTrue();
        }
        protected override void DoGenerate(CilEmitter emitter)
        {
            ILabel contentsLabel = emitter.GenerateLabel();

            emitter.EmitBool(true);
            after.EmitJumpIfFalse();
            contentsLabel.Emit();

            contents.Generate(emitter, contentsLabel, begin);

            begin.EmitJump();
        }
예제 #7
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            if (first == Statement.Null)
            {
                second.Generate(emitter, begin, after);
            }
            else if (second == Statement.Null)
            {
                first.Generate(emitter, begin, after);
            }
            else
            {
                // Create new label between the two statements
                ILabel midpoint = emitter.GenerateLabel();

                first.Generate(emitter, begin, midpoint);

                midpoint.Emit();

                second.Generate(emitter, midpoint, after);
            }
        }
예제 #8
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            ILabel contentsLabel = emitter.GenerateLabel();

            logicalExpr.EmitRValue(emitter); // Generate rvalue from logical expression.

            after.EmitJumpIfFalse();         // Skip the if body if false

            contentsLabel.Emit();

            contents.Generate(emitter, contentsLabel, after);

            /*
             * generate new label
             *
             * call logicalExpr.Jumping(0, after) to have it generate the jumping code.
             *
             * emitLabel(new label);
             *
             * stmt.Gen(label, after);
             *
             */
        }