예제 #1
0
파일: Exprs.cs 프로젝트: ZiCog/HomeSpun
        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;
        }
예제 #2
0
파일: Exprs.cs 프로젝트: ZiCog/HomeSpun
        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);
            }
        }