Beispiel #1
0
 /// <summary>
 /// restore
 /// </summary>
 /// <param name="s"></param>
 protected void doRestore(Statement s)
 {
     m_dataRegion.Restore();
 }
Beispiel #2
0
        protected void onParamCmd(Statement s)
        {
            if (s.m_symbol == "PLAY")
            {
                if (s.m_expressList.Count != 1)
                {
                    throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                }

                BaseData bd = calculateExp(s.m_expressList[0]).m_value;

                if (bd.TYPE != BaseData.TYPE_STRING)
                {
                    throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                }

                m_apiCall.Play(bd.STR_VAL);
            }
            else
            {
                List <int> indexs = expressListToIndexs(s.m_expressList);

                if (s.m_symbol == "LOCATE")
                {
                    if (indexs.Count != 2)
                    {
                        throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                    }

                    m_apiCall.Locate(indexs[0], indexs[1]);
                }
                else if (s.m_symbol == "BOX")
                {
                    if (indexs.Count == 4)
                    {
                        m_apiCall.Box(indexs[0], indexs[1], indexs[2], indexs[3], 0, 1);
                    }
                    else if (indexs.Count == 5)
                    {
                        m_apiCall.Box(indexs[0], indexs[1], indexs[2], indexs[3], indexs[4], 1);
                    }
                    else if (indexs.Count == 6)
                    {
                        m_apiCall.Box(indexs[0], indexs[1], indexs[2], indexs[3], indexs[4], indexs[5]);
                    }
                    else
                    {
                        throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                    }
                }
                else if (s.m_symbol == "DRAW")
                {
                    if (indexs.Count == 2)
                    {
                        m_apiCall.Draw(indexs[0], indexs[1], 1);
                    }
                    else if (indexs.Count == 3)
                    {
                        m_apiCall.Draw(indexs[0], indexs[1], indexs[2]);
                    }
                    else
                    {
                        throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                    }
                }
                else if (s.m_symbol == "CIRCLE")
                {
                    if (indexs.Count == 3)
                    {
                        m_apiCall.Circle(indexs[0], indexs[1], indexs[2], 0, 1);
                    }
                    else if (indexs.Count == 4)
                    {
                        m_apiCall.Circle(indexs[0], indexs[1], indexs[2], indexs[3], 0);
                    }
                    else if (indexs.Count == 5)
                    {
                        m_apiCall.Circle(indexs[0], indexs[1], indexs[2], indexs[3], indexs[4]);
                    }
                    else
                    {
                        throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                    }
                }
                else if (s.m_symbol == "ELLIPSE")
                {
                    if (indexs.Count == 4)
                    {
                        m_apiCall.Ellipse(indexs[0], indexs[1], indexs[2], indexs[3], 0, 1);
                    }
                    else if (indexs.Count == 5)
                    {
                        m_apiCall.Ellipse(indexs[0], indexs[1], indexs[2], indexs[3], indexs[4], 1);
                    }
                    else if (indexs.Count == 6)
                    {
                        m_apiCall.Ellipse(indexs[0], indexs[1], indexs[2], indexs[3], indexs[4], indexs[5]);
                    }
                    else
                    {
                        throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                    }
                }
                else if (s.m_symbol == "LINE")
                {
                    if (indexs.Count == 4)
                    {
                        m_apiCall.Line(indexs[0], indexs[1], indexs[2], indexs[3], 1);
                    }
                    else if (indexs.Count == 5)
                    {
                        m_apiCall.Line(indexs[0], indexs[1], indexs[2], indexs[3], indexs[4]);
                    }
                    else
                    {
                        throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                    }
                }
            }
        }
Beispiel #3
0
 /// <summary>
 /// data statement
 /// </summary>
 /// <param name="s"></param>
 protected void doData(Statement s)
 {
     m_dataRegion.AddDatas(s.m_dataList);
 }
Beispiel #4
0
 protected void onDefFn(Statement s)
 {
     m_symbolTable.Define(new FunSymbol(s.m_symbol, s.m_expressList[0]));
 }
Beispiel #5
0
 protected void onDim(Statement s)
 {
     m_symbolTable.Define(new ArraySymbol(s.m_symbol, s.m_arrayDimension));
 }
Beispiel #6
0
 protected void onGoSub(Statement s)
 {
     m_index = m_lineNumDic[s.m_intVal];
     m_goSubStack.Push(s.m_lineIndex);
 }
Beispiel #7
0
 /// <summary>
 /// do end
 /// </summary>
 /// <param name="s"></param>
 protected void doEnd(Statement s)
 {
     m_isRunning = false;
 }
Beispiel #8
0
 /// <summary>
 /// do goto statement
 /// </summary>
 /// <param name="s"></param>
 protected void doGoto(Statement s)
 {
     m_index = m_lineNumDic[s.m_intVal];
 }
Beispiel #9
0
        /// <summary>
        /// if statement ( including if...then && if...goto )
        /// </summary>
        /// <returns></returns>
        protected Statement ifStatement()
        {
            Statement ifS = new Statement(Statement.TYPE_IF);

            eatToken(Token.IF);
            ifS.m_expressList = new List <Expression>();
            ifS.m_statements  = new List <Statement>();

            ifS.m_expressList.Add(expression());

            int tt = lookAhead();

            if (tt != Token.THEN && tt != Token.GOTO)
            {
                throw new ErrorCode(ErrorCode.ERROR_CODE_02);
            }

            eatToken(tt);

            Token            tok = null;
            List <Statement> s   = new List <Statement>();
            Statement        ss  = null;

            if (lookAhead() == Token.INT)
            {
                tok = eatToken(Token.INT);

                ss          = new Statement(Statement.TYPE_GOTO);
                ss.m_intVal = tok.m_intVal;
                s.Add(ss);
            }
            else
            {
                if (tt == Token.GOTO)
                {
                    throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                }

                s = statements();
            }

            ifS.m_statements = s;

            // else case
            if (lookAhead() == Token.ELSE)
            {
                eatToken(Token.ELSE);

                s = new List <Statement>();

                if (lookAhead() == Token.INT)
                {
                    tok = eatToken(Token.INT);

                    ss          = new Statement(Statement.TYPE_GOTO);
                    ss.m_intVal = tok.m_intVal;
                    s.Add(ss);
                }
                else
                {
                    s = statements();
                }

                ifS.m_elseStatements = s;
            }
            else
            {
                ifS.m_elseStatements = new List <Statement>();
            }

            return(ifS);
        }
Beispiel #10
0
        /// <summary>
        /// statement
        /// </summary>
        /// <returns></returns>
        protected List <Statement> statements()
        {
            List <Statement> statements = new List <Statement>();

            while (true)
            {
                int       tt = lookAhead();
                Statement ss = null;

                switch (tt)
                {
                case Token.PRINT:
                    ss = print();
                    break;

                case Token.LET:
                    ss = assignLet();
                    break;

                case Token.SYMBOL:
                    ss = assign();
                    break;

                case Token.DATA:
                    ss = data();
                    break;

                case Token.READ:
                    ss = read();
                    break;

                case Token.RESTORE:
                    ss = restore();
                    break;

                case Token.IF:
                    ss = ifStatement();
                    break;

                case Token.FOR:
                    ss = forBegin();
                    break;

                case Token.NEXT:
                    ss = forEnd();
                    break;

                case Token.WHILE:
                    ss = whileStatement();
                    break;

                case Token.WEND:
                    ss = wend();
                    break;

                case Token.GOTO:
                    ss = gotoStatement();
                    break;

                case Token.ON:
                    ss = onStatement();
                    break;

                case Token.GOSUB:
                    ss = gosubStatement();
                    break;

                case Token.RETURN:
                    ss = returnStatement();
                    break;

                case Token.POP:
                    ss = popStatement();
                    break;

                case Token.DIM:
                    ss = dimStatement();
                    break;

                case Token.DEF:
                    ss = defFnStatement();
                    break;

                case Token.SWAP:
                    ss = swapStatement();
                    break;

                case Token.INPUT:
                    ss = inputStatement();
                    break;

                case Token.SIMPLE_CMD:
                    ss = simpleCommand();
                    break;

                case Token.PARAM_CMD:
                    ss = paramCommand();
                    break;

                case Token.END:
                    ss = endStatement();
                    break;

                default:
                    throw new ErrorCode(ErrorCode.ERROR_CODE_02);
                }

                // process the ss and count the INKEY$
                countInkey(ss);

                statements.Add(ss);

                if (lookAhead() == Token.COLON)
                {
                    eatToken(Token.COLON);
                }
                else
                {
                    break;
                }
            }

            return(statements);
        }