public override void MakeByteCode(ArrayList bytecodeList) { JmpTarget saveNextJmpTarget = SymbolTable.nextJmpTarget; JmpTarget saveQuitJmpTarget = SymbolTable.quitJmpTarget; JmpTarget nextJmpTarget = SymbolTable.nextJmpTarget = new JmpTarget(); JmpTarget quitJmpTarget = SymbolTable.quitJmpTarget = new JmpTarget(); int saveCaseNesting = SymbolTable.caseNesting; SymbolTable.caseNesting = 0; bytecodeList.Add(new SourceReference(this.Token, this.EndLineNumber)); if (type == RepeatType.Plain) // REPEAT { SymbolTable.insidePlainRepeat = true; bytecodeList.Add(nextJmpTarget); foreach (Stmt s in statementsList) { s.MakeByteCode(bytecodeList); } JmpStart jmpUp = new JmpStart(0x04, nextJmpTarget); // GOTO bytecodeList.Add(jmpUp); bytecodeList.Add(quitJmpTarget); } else if (type == RepeatType.NTimes) // REPEAT n { SymbolTable.insidePlainRepeat = false; repeatExpr.MakeByteCode(true, bytecodeList); JmpStart jmpDown = new JmpStart(0x08, quitJmpTarget); // LOOPJPF bytecodeList.Add(jmpDown); JmpTarget repeatJmpTarget = new JmpTarget(); bytecodeList.Add(repeatJmpTarget); foreach (Stmt s in statementsList) { s.MakeByteCode(bytecodeList); } bytecodeList.Add(nextJmpTarget); JmpStart jmpUp = new JmpStart(0x09, repeatJmpTarget); // LOOPRPT bytecodeList.Add(jmpUp); bytecodeList.Add(quitJmpTarget); } else if (type == RepeatType.WhileLoop) // REPEAT WHILE/UNTIL <cond> <stmts> { SymbolTable.insidePlainRepeat = true; bytecodeList.Add(nextJmpTarget); repeatExpr.MakeByteCode(true, bytecodeList); byte opcode = whileNotUntil ? (byte)0x0a : (byte)0x0b; // JPF | JPT JmpStart jmpDown = new JmpStart(opcode, quitJmpTarget); bytecodeList.Add(jmpDown); foreach (Stmt s in statementsList) { s.MakeByteCode(bytecodeList); } JmpStart jmpUp = new JmpStart(0x04, nextJmpTarget); // GOTO bytecodeList.Add(jmpUp); bytecodeList.Add(quitJmpTarget); } else // REPEAT <stmts> WHILE/UNTIL <cond> { JmpTarget topTarget = new JmpTarget(); bytecodeList.Add(topTarget); foreach (Stmt s in statementsList) { s.MakeByteCode(bytecodeList); } bytecodeList.Add(nextJmpTarget); repeatExpr.MakeByteCode(true, bytecodeList); byte opcode = whileNotUntil ? (byte)0x0b : (byte)0x0a; // JPT | JPF JmpStart jmpUp = new JmpStart(opcode, topTarget); bytecodeList.Add(jmpUp); bytecodeList.Add(quitJmpTarget); } SymbolTable.caseNesting = saveCaseNesting; SymbolTable.nextJmpTarget = saveNextJmpTarget; SymbolTable.quitJmpTarget = saveQuitJmpTarget; }
public override void MakeByteCode(ArrayList bytecodeList) { bytecodeList.Add(new SourceReference(this.Token, this.EndLineNumber)); condExpr.MakeByteCode(true, bytecodeList); byte jmpOpcode = Token.Text.ToUpper().EndsWith("NOT") ? (byte)0x0b : (byte)0x0a; // JPT/JPF JmpTarget ifTarget = new JmpTarget(); JmpStart ifJmp = new JmpStart(jmpOpcode, ifTarget); bytecodeList.Add(ifJmp); foreach (Stmt s in ifStatementsList) { s.MakeByteCode(bytecodeList); } if (elseStatementsList == null) { bytecodeList.Add(ifTarget); } else { if (this.elseToken != null) bytecodeList.Add(new SourceReference(this.elseToken, this.elseEndLineNumber)); JmpTarget elseTarget = new JmpTarget(); JmpStart elseJmp = new JmpStart((byte)0x04, elseTarget); // GOTO bytecodeList.Add(elseJmp); bytecodeList.Add(ifTarget); foreach (Stmt s in elseStatementsList) { s.MakeByteCode(bytecodeList); } bytecodeList.Add(elseTarget); } }