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(" "); } } }
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(); }
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)); }