public void compileIfStatement() { string currentInstruction; finalInstructions.Add("<ifStatement>"); currentInstruction = printAndAdvance("XML"); finalInstructions.Add(currentInstruction); // if currentInstruction = printAndAdvance("XML"); finalInstructions.Add(currentInstruction); // ( List <string> expressionTermList = new List <string>(); finalInstructions.Add("<expression>"); compileTerm(); finalInstructions.Add("</expression>"); currentInstruction = printAndAdvance("XML"); finalInstructions.Add(currentInstruction); // ) currentVMWriter.WriteIf($"IF_TRUE{ifCount}"); currentVMWriter.WriteGoto($"IF_FALSE{ifCount}"); currentVMWriter.WriteLabel($"IF_TRUE{ifCount}"); int currentIfCount = ifCount; ifCount++; currentInstruction = printAndAdvance("XML"); finalInstructions.Add(currentInstruction); // { compileStatements(); currentInstruction = printAndAdvance("XML"); finalInstructions.Add(currentInstruction); // } //ifCount--; if (nextChar() == "else") { currentVMWriter.WriteGoto($"IF_END{currentIfCount}"); currentVMWriter.WriteLabel($"IF_FALSE{currentIfCount}"); currentInstruction = printAndAdvance("XML"); finalInstructions.Add(currentInstruction); // else currentInstruction = printAndAdvance("XML"); finalInstructions.Add(currentInstruction); // { compileStatements(); currentInstruction = printAndAdvance("XML"); finalInstructions.Add(currentInstruction); // } currentVMWriter.WriteLabel($"IF_END{currentIfCount}"); } else { currentVMWriter.WriteLabel($"IF_FALSE{currentIfCount}"); } finalInstructions.Add("</ifStatement>"); }
public void CompileWhile() { string secondLabel = "LABEL_" + labelIndex++; string firstLabel = "LABEL_" + labelIndex++; vmWriter.WriteLabel(firstLabel); jtoken.Advance(); CompileExpression(); jtoken.Advance(); vmWriter.WriteArithmetic("not"); vmWriter.WriteIf(secondLabel); jtoken.Advance(); CompileStatements(); vmWriter.WriteGoto(firstLabel); vmWriter.WriteLabel(secondLabel); }