Esempio n. 1
0
 public void Compile(CompilationEnvironment compilationEnvironment, Generator generator)
 {
     compilationEnvironment.DeclareLocal(_argument.Item1); // Formal argument name points to top of stack
     generator.Label(compilationEnvironment.GetFunctionLabel(_name));
     _body.Compile(compilationEnvironment, generator);
     generator.Emit(new Return(1));
 }
Esempio n. 2
0
        public void Compile(Generator generator, string outputFile)
        {
            // Generate compiletime environment
            var labels = _functionEnvironment.GetFunctionNames().ToDictionary(funName => funName, funName => Label.Fresh());
            var compilationEnvironment = new CompilationEnvironment(labels);

            // Compile expression
            _expression.Compile(compilationEnvironment, generator);
            generator.Emit(Instruction.PrintI);
            generator.Emit(Instruction.Stop);

            // Compile functions
            foreach (var functionDefinition in _functionEnvironment.GetFunctions())
            {
                compilationEnvironment = new CompilationEnvironment(labels);
                functionDefinition.Compile(compilationEnvironment, generator);
            }

            //  Generate bytecode at and print to file
            generator.PrintCode();
            var bytecode = generator.ToBytecode();
            using (TextWriter writer = new StreamWriter(outputFile))
            {
                foreach (var b in bytecode)
                {
                    writer.Write(b);
                    writer.Write(" ");
                }
            }
        }
Esempio n. 3
0
        public override void Compile(CompilationEnvironment compilationEnvironment, Generator generator)
        {
            _e1.Compile(compilationEnvironment, generator);
            compilationEnvironment.PushTemporary();
            _e2.Compile(compilationEnvironment, generator);

            switch (_op)
            {
                case Operator.Add:
                    generator.Emit(Instruction.Add);
                    break;
                case Operator.Div:
                    generator.Emit(Instruction.Div);
                    break;
                case Operator.Mul:
                    generator.Emit(Instruction.Mul);
                    break;
                case Operator.Sub:
                    generator.Emit(Instruction.Sub);
                    break;
                case Operator.Eq:
                    generator.Emit(Instruction.Eq);
                    break;
                case Operator.Ne:
                    generator.Emit(Instruction.Eq);
                    generator.Emit(Instruction.Not);
                    break;
                case Operator.Ge:
                    generator.Emit(Instruction.LT);
                    generator.Emit(Instruction.Not);
                    break;
                case Operator.Gt:
                    generator.Emit(Instruction.Swap);
                    generator.Emit(Instruction.LT);
                    break;
                case Operator.Le:
                    generator.Emit(Instruction.Swap);
                    generator.Emit(Instruction.LT);
                    generator.Emit(Instruction.Not);
                    break;
                case Operator.Lt:
                    generator.Emit(Instruction.LT);
                    break;
                case Operator.And:
                    generator.Emit(Instruction.Mul);
                    break;
                case Operator.Or:
                    generator.Emit(Instruction.Add);
                    generator.Emit(new CstI(0));
                    generator.Emit(Instruction.Eq);
                    generator.Emit(Instruction.Not);
                    break;
                default:
                    throw new InvalidOperationException(string.Format("Unknown binary operator: {0}", _op));
            }
            compilationEnvironment.PopTemporary();
        }
Esempio n. 4
0
        public override void Compile(CompilationEnvironment env, Generator gen)
        {
            e1.Compile(env, gen);
            env.DeclareLocal(name);             // push the name variable to the stack<string> locals of CEnv

            //env.CompileVariable(gen, name); // get the array index of the variable name
            //gen.Emit(Instruction.LdI);      // load the variable name with the index which is on the top of the stack

            e2.Compile(env, gen);
            gen.Emit(Instruction.Swap);
            gen.Emit(new IncSp(-1));

            env.Pop();    // deallocate variable name
        }
Esempio n. 5
0
        public override void Compile(CompilationEnvironment env, Generator gen)
        {
            var l1 = Label.Fresh();
            var l2 = Label.Fresh();

            e1.Compile(env, gen);
            gen.Emit(new IfZero(l1));
            e2.Compile(env, gen);           // inside if
            gen.Emit(new Goto(l2));
            //generate flash labels: Label.Fresh()
            gen.Label(l1);        // add labels to the stack machine  L1 -else
            e3.Compile(env, gen); // inside else

            gen.Label(l2);        // L2
        }
Esempio n. 6
0
 public override void Compile(CompilationEnvironment compilationEnvironment, Generator generator)
 {
     _expression.Compile(compilationEnvironment, generator);
     switch (_op)
     {
         case Operator.Not:
             generator.Emit(Instruction.Not);
             break;
         case Operator.Neg:
             generator.Emit(new CstI(0));
             generator.Emit(Instruction.Swap);
             generator.Emit(Instruction.Sub);
             break;
         default:
             throw new InvalidOperationException(string.Format("Unknown unary operator: {0}", _op));
     }
 }
        public void Compile(CompilationEnvironment env, Generator gen)
        {
            foreach (Tuple <String, Type> arg in args)
            {
                env.DeclareLocal(arg.Item1);
            }

            gen.Label(env.GetFunctionLabel(fName));
            body.Compile(env, gen);
            gen.Emit(new Return(args.Count));

            /*
             * env.DeclareLocal(formArg.Fst); // Formal argument name points to top of stack
             * gen.Label(env.getFunctionLabel(fName));
             * body.Compile(env, gen);
             * gen.Emit(new RET(1));
             */
        }
Esempio n. 8
0
        public override void Compile(CompilationEnvironment compilationEnvironment, Generator generator)
        {
            _expression.Compile(compilationEnvironment, generator);
            switch (_op)
            {
            case Operator.Not:
                generator.Emit(Instruction.Not);
                break;

            case Operator.Neg:
                generator.Emit(new CstI(0));
                generator.Emit(Instruction.Swap);
                generator.Emit(Instruction.Sub);
                break;

            default:
                throw new InvalidOperationException(string.Format("Unknown unary operator: {0}", _op));
            }
        }
Esempio n. 9
0
        public override void Compile(CompilationEnvironment env, Generator gen)
        {
            foreach (Expression arg in _args)
            {
                arg.Compile(env, gen);
                env.PushTemporary();
            }

            String fLabel = env.GetFunctionLabel(fName);

            gen.Emit(new Call(_args.Count, fLabel));

            foreach (var arg in _args)
            {
                env.PopTemporary();
            }

            /*
             * arg.Compile(env, gen);
             * String fLabel = env.getFunctionLabel(fName);
             * gen.Emit(new CALL(1, fLabel));
             */
        }
Esempio n. 10
0
 public override void Compile(CompilationEnvironment compilationEnvironment, Generator generator)
 {
     _arg.Compile(compilationEnvironment, generator);
     var label = compilationEnvironment.GetFunctionLabel(_name);
     generator.Emit(new Call(1, label));
 }
        public override void Compile(CompilationEnvironment compilationEnvironment, Generator generator)
        {
            _e1.Compile(compilationEnvironment, generator);
            compilationEnvironment.PushTemporary();
            _e2.Compile(compilationEnvironment, generator);

            switch (_op)
            {
            case Operator.Mod:
                generator.Emit(Instruction.Mod);
                break;

            case Operator.Add:
                generator.Emit(Instruction.Add);
                break;

            case Operator.Div:
                generator.Emit(Instruction.Div);
                break;

            case Operator.Mul:
                generator.Emit(Instruction.Mul);
                break;

            case Operator.Sub:
                generator.Emit(Instruction.Sub);
                break;

            case Operator.Eq:
                generator.Emit(Instruction.Eq);
                break;

            case Operator.Ne:
                generator.Emit(Instruction.Eq);
                generator.Emit(Instruction.Not);
                break;

            case Operator.Ge:
                generator.Emit(Instruction.LT);
                generator.Emit(Instruction.Not);
                break;

            case Operator.Gt:
                generator.Emit(Instruction.Swap);
                generator.Emit(Instruction.LT);
                break;

            case Operator.Le:
                generator.Emit(Instruction.Swap);
                generator.Emit(Instruction.LT);
                generator.Emit(Instruction.Not);
                break;

            case Operator.Lt:
                generator.Emit(Instruction.LT);
                break;

            case Operator.And:
                generator.Emit(Instruction.Mul);
                break;

            case Operator.Or:
                generator.Emit(Instruction.Add);
                generator.Emit(new CstI(0));
                generator.Emit(Instruction.Eq);
                generator.Emit(Instruction.Not);
                break;

            default:
                throw new InvalidOperationException(string.Format("Unknown binary operator: {0}", _op));
            }
            compilationEnvironment.PopTemporary();
        }