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;
 }
Example #2
0
        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;
        }