예제 #1
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
             *
             */
        }
        public ControlFlowDesigner(ILGenerator ilGenerator)
        {
            _ilEmitter = new CilEmitter(ilGenerator);

            IntoBranch      = false;
            _endBranchLabel = _ilEmitter.DefineLabel();
        }
예제 #3
0
 public ArrayDesigner(CilEmitter ilEmitter, Type elementType, int elementsCount)
 {
     _ilEmitter = ilEmitter;
     _ilEmitter
     .Emit(OpCodes.Ldc_I4, elementsCount)
     .Emit(OpCodes.Newarr, elementType);
 }
 protected override void DoGenerate(CilEmitter emitter)
 {
     callExpr.EmitRValue(emitter);
     if (callExpr.ReturnType != typeof(void))
     {
         emitter.EmitPop();
     }
 }
예제 #5
0
        public override void EmitRValue(CilEmitter emitter)
        {
            expression.EmitRValue(emitter);

            emitter.EmitUnaryOp("-");

            throw new NotImplementedException();
        }
예제 #6
0
 public override void EmitRValue(CilEmitter emitter)
 {
     foreach (Expression param in parameters)
     {
         param.EmitRValue(emitter);     // Make sure the parameters are on the stack.
     }
     symbol.Function.EmitCall();
 }
예제 #7
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            expression.EmitRValue(emitter);

            if (expression.ReturnType != typeof(void))
            {
                emitter.EmitPop();
            }
        }
예제 #8
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            printInt.Function   = emitter.GetWriteFunction(typeof(int));
            printFloat.Function = emitter.GetWriteFunction(typeof(float));
            printChar.Function  = emitter.GetWriteFunction(typeof(char));
            printBool.Function  = emitter.GetWriteFunction(typeof(bool));

            scanF.Function = emitter.GetReadLineFunction();
        }
예제 #9
0
        public override void EmitRValue(CilEmitter emitter)
        {
            if (symbol.Variable == null)
            {
                Error("Use of undeclared variable");
            }

            symbol.Variable.EmitValue();
        }
예제 #10
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            valueExpr.EmitRValue(emitter);
            if (valueExpr.ReturnType == typeof(string))
            {
                emitter.EmitParse(variableUseExpr.ReturnType);
            }

            variableUseExpr.EmitAssignment();
        }
예제 #11
0
        public override void EmitRValue(CilEmitter emitter)
        {
            valueExpr.EmitRValue(emitter);
            if (valueExpr.ReturnType == typeof(string))
            {
                emitter.EmitParse(variableUseExpr.ReturnType);
            }

            variableUseExpr.EmitAssignment();
            variableUseExpr.EmitRValue(emitter);
        }
예제 #12
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();
        }
예제 #14
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();
        }
예제 #15
0
        private void PerformTranslation(LexicalAnalyser lexer, CilEmitter emitter, ILogger treeLogger) {
           
            using (lexer) {
                
                Parser parser = new Parser(lexer);

                SyntaxTree syntaxTree = parser.Parse();
                
                syntaxTree.Log(treeLogger);
                
                syntaxTree.Generate(emitter);
            }
        }
예제 #16
0
        public ImmutableArray <Diagnostic> Emit(string moduleName, string[] references, string outputPath)
        {
            var parseDiagnostics = this.SyntaxTrees.SelectMany(st => st.Diagnostics);
            var diagnostics      = parseDiagnostics.Concat(this.GlobalScope.Diagnostics).ToImmutableArray();

            if (diagnostics.Any())
            {
                return(diagnostics);
            }

            var program = this.GetProgram();

            return(CilEmitter.Emit(program, moduleName, references, outputPath));
        }
예제 #17
0
        protected override void DoGenerate(CilEmitter emitter)
        {
            symbol.Variable = emitter.EmitLocalVarDeclaration(symbol.Name, symbol.VariableType);

            if (initialValue != null)
            {
                initialValue.EmitRValue(emitter);
                if (initialValue.ReturnType == typeof(string))
                {
                    emitter.EmitParse(symbol.VariableType);
                }
                symbol.Variable.EmitAssignment();
            }
        }
예제 #18
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);
        }
예제 #19
0
        public override void EmitRValue(CilEmitter emitter)
        {
            if (!prefix)
            {
                variableExpr.EmitRValue(emitter);
            }

            variableExpr.EmitRValue(emitter);
            emitter.EmitInt32(1);
            emitter.EmitBinaryOperator(add ? "+" : "-");
            variableExpr.EmitAssignment();

            if (prefix)
            {
                variableExpr.EmitRValue(emitter);
            }
        }
예제 #20
0
        public void Translate() {

            ILogger lexicalLogger = CreateLogger(LogLexer);
            ILogger treeLogger = CreateLogger(LogSyntaxTree);

            LexicalAnalyser lexer = new LexicalAnalyser(sourceFilepath, lexicalLogger);
            CilEmitter emitter = new CilEmitter(programName);

            try {
                PerformTranslation(lexer, emitter, treeLogger);
            }
            catch (ParseException exc) {
                Console.WriteLine("Error during translation : \n" + exc.Message);
            }
            finally {
                lexicalLogger.Flush();
                treeLogger.Flush();
            }
        }
예제 #21
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
             *
             */
        }
예제 #22
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);
            }
        }
예제 #23
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);
             *
             */
        }
예제 #24
0
 public override void EmitRValue(CilEmitter emitter)
 {
     emitter.EmitDouble(value);
 }
예제 #25
0
 protected override void EmitOperator(CilEmitter emitter)
 {
     emitter.EmitComparison(comparisonOperator);
 }
예제 #26
0
 protected abstract void EmitOperator(CilEmitter emitter);
예제 #27
0
 public override void EmitRValue(CilEmitter emitter)
 {
     lhs.EmitRValue(emitter);
     rhs.EmitRValue(emitter);
     EmitOperator(emitter);
 }
예제 #28
0
 public abstract void EmitRValue(CilEmitter emitter);
예제 #29
0
 protected virtual void DoGenerate(CilEmitter emitter)
 {
 }
예제 #30
0
 public void Generate(CilEmitter emitter, ILabel begin, ILabel after)
 {
     this.begin = begin;
     this.after = after;
     DoGenerate(emitter);
 }