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