コード例 #1
0
        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);
        }
コード例 #2
0
        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>");
        }