/// <summary> /// restore /// </summary> /// <param name="s"></param> protected void doRestore(Statement s) { m_dataRegion.Restore(); }
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); } } } }
/// <summary> /// data statement /// </summary> /// <param name="s"></param> protected void doData(Statement s) { m_dataRegion.AddDatas(s.m_dataList); }
protected void onDefFn(Statement s) { m_symbolTable.Define(new FunSymbol(s.m_symbol, s.m_expressList[0])); }
protected void onDim(Statement s) { m_symbolTable.Define(new ArraySymbol(s.m_symbol, s.m_arrayDimension)); }
protected void onGoSub(Statement s) { m_index = m_lineNumDic[s.m_intVal]; m_goSubStack.Push(s.m_lineIndex); }
/// <summary> /// do end /// </summary> /// <param name="s"></param> protected void doEnd(Statement s) { m_isRunning = false; }
/// <summary> /// do goto statement /// </summary> /// <param name="s"></param> protected void doGoto(Statement s) { m_index = m_lineNumDic[s.m_intVal]; }
/// <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); }
/// <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); }