Example #1
0
        public void Compile()
        {
            CEnv      env       = new CEnv(globals, functions);
            Generator gen       = new Generator();
            String    mainLabel = env.GetFun("main");

            foreach (VarDecl varDecl in globals.Values)
            {
                env.CompileAndDeclare(gen, varDecl);
            }
            gen.Emit(new CALL(0, mainLabel));
            gen.Emit(Instruction.STOP);
            foreach (FunDecl funDecl in functions.Values)
            {
                funDecl.Compile(new CEnv(env), gen);
            }
            gen.PrintCode();
            int[] bytecode = gen.ToBytecode();
            using (TextWriter wr = new StreamWriter("a.out")) {
                foreach (int b in bytecode)
                {
                    wr.Write(b);
                    wr.Write(" ");
                }
            }
        }
Example #2
0
 public void Compile(CEnv env, Generator gen)
 {
     env.PushEnv();
     foreach (VarDecl parameter in parameters)
     {
         env.DeclareLocal(parameter);
     }
     gen.Label(env.GetFun(name));
     body.Compile(env, gen);
     gen.Emit(new RET(parameters.Length - 1));
     env.PopEnv();
 }
Example #3
0
        public override void Compile(CEnv env, Generator gen)
        {
            int n = arguments.Length;

            for (int i = 0; i < n; i++)
            {
                arguments[i].Compile(env, gen);
            }
            String funLabel = env.GetFun(funName);

            gen.Emit(new CALL(n, funLabel));
        }