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