public override string Generate(CompileContext outer) { using (TextWriter writer = new StringWriter()) { bool first = true; foreach (var block in blocks) { EvaluationStack unhandled = null; if (block.condition != null) { string nothing = outer.GenerateWithoutWriting(block.condition.first, block.condition.last, ref unhandled); Debug.Assert(string.IsNullOrEmpty(nothing)); if (unhandled == null) { unhandled = outer.GetEvaluationStack(); } writer.WriteLine(CompileContext.Format(first ? "if({0} == 0)" : "else if({0} == 0)", unhandled.Pop())); } else { writer.WriteLine("else"); } writer.WriteLine(CompileContext.Format("{{{0}}}", outer.GenerateWithoutWriting(block.body.first, block.body.last, ref unhandled))); first = false; } return(writer.ToString()); } }
public override string Generate(CompileContext outer) { // Condition EvaluationStack unhandled = null; string nothing = outer.GenerateWithoutWriting(this.condition.first, this.condition.last, ref unhandled); Debug.Assert(string.IsNullOrEmpty(nothing)); if (unhandled == null) { unhandled = outer.GetEvaluationStack(); } var condition = unhandled.Pop(); string body = outer.GenerateWithoutWriting(this.body.first, this.body.last, ref unhandled); Debug.Assert(unhandled == null); return(CompileContext.Format("while({0} != 0) {{\n{1}\n}}\n", condition, body)); }