public ProgramChunkBranch(Equality equality, ProgramChunkExpressionTerm termFirst, IProgramChunk trueChunk, ProgramChunkExpressionTerm termSecond, IProgramChunk falseChunk) { this.equality = equality; this.termFirst = termFirst; this.termSecond = termSecond; this.trueChunk = trueChunk; this.falseChunk = falseChunk; }
public string[] EmitChunk(IProgramChunk chunk) { string[] programLines; LinkedList<string> lines = new LinkedList<string>(); if (chunk is ProgramChunkJumpTarget) { //Form: (label): ProgramChunkJumpTarget activeChunk = (ProgramChunkJumpTarget)chunk; lines.AddLast(activeChunk.Label + ":"); } else if (chunk is ProgramChunkJumpUnconditional) { //Form: goto (label) ProgramChunkJumpUnconditional activeChunk = (ProgramChunkJumpUnconditional)chunk; lines.AddLast("goto " + activeChunk.Target.Label + ";"); } else if (chunk is ProgramChunkAssignment) { //Form: (Var) (assign) (term op term) ProgramChunkAssignment activeChunk = (ProgramChunkAssignment)chunk; //1) determine the variable that will recieve this assignment. //2) emit the code that will assign the expression to the variable. //3) determine the expression that will that variable will be assigned to. lines.AddLast(activeChunk.Variable.Name + " = " + EmitExpression(activeChunk.Expression) + ";"); } else if (chunk is ProgramChunkLoop) { ProgramChunkLoop activeChunk = (ProgramChunkLoop)chunk; lines.AddLast("while (true)"); foreach(string line in EmitBlock(activeChunk.InnerCode)) lines.AddLast(line); } else if (chunk is ProgramChunkBranch) { ProgramChunkBranch activeChunk = (ProgramChunkBranch)chunk; //beq $a1 0 finish string line = "if("; //first term if (activeChunk.TermFirst is BlockConstant) line += ((BlockConstant)activeChunk.TermFirst).Constant.ToString(); else line += ((BlockVariable)activeChunk.TermFirst).Name; //equality if (activeChunk.EqualityChecked == Equality.EQUAL) line += " == "; else if (activeChunk.EqualityChecked == Equality.NOT_EQUAL) line += " != "; else line += " ?? "; //second term if (activeChunk.TermSecond is BlockConstant) line += ((BlockConstant)activeChunk.TermSecond).Constant.ToString(); else line += ((BlockVariable)activeChunk.TermSecond).Name; line += ")"; lines.AddLast(line); if (EmitChunk(activeChunk.TrueChunk).Length == 1) lines.AddLast(EmitChunk(activeChunk.TrueChunk)[0]); else { lines.AddLast("{"); foreach (string programLine in EmitChunk(activeChunk.TrueChunk)) lines.AddLast(programLine); lines.AddLast("}"); } if(!(activeChunk.FalseChunk is ProgramChunkNoOperation)) throw new Exception("BackendC - Unimplemented false branch."); } else { UtilDebugConsole.AddException(new ExceptionWarning("BackendC - No operation IProgramChunk found, emitting NOP.")); lines.AddLast("//NOP"); } programLines = new string[lines.Count]; lines.CopyTo(programLines, 0); return programLines; }