// PRINT command translate function TokenStatus printTranslate(Translator &translator, Token *commandToken, Token *&token) { TokenStatus status; Token *lastSemiColon = NULL; bool separator = false; bool printFunction = false; forever { if ((status = translator.getExpression(token, None_DataType)) != Done_TokenStatus) { if (status == Parser_TokenStatus && token->isDataType(None_DataType)) { if (translator.doneStackEmpty()) { status = ExpExprCommaPfnOrEnd_TokenStatus; } // change parser error if not inside paren else if (translator.doneStackTopToken() ->isDataType(None_DataType)) { status = ExpSemiCommaOrEnd_TokenStatus; } else // not a print function { status = ExpOpSemiCommaOrEnd_TokenStatus; } } break; } if (!translator.doneStackEmpty()) { if (translator.doneStackTopToken()->isDataType(None_DataType)) { translator.doneStackDrop(); // print function printFunction = true; } else // append appropriate print code for done stack top item { Token *printToken = translator.table().newToken(PrintDbl_Code); translator.processFinalOperand(printToken); printFunction = false; } separator = true; delete lastSemiColon; lastSemiColon = NULL; } if (token->isCode(Comma_Code)) { if (lastSemiColon != NULL) { status = ExpExprPfnOrEnd_TokenStatus; break; } translator.outputAppend(token); delete lastSemiColon; lastSemiColon = NULL; } else if (token->isCode(SemiColon_Code)) { if (!separator) { status = lastSemiColon == NULL ? ExpExprCommaPfnOrEnd_TokenStatus : ExpExprPfnOrEnd_TokenStatus; break; } delete lastSemiColon; lastSemiColon = token; } else // some other token, maybe end-of-statement { break; // exit loop } separator = false; token = NULL; } if (status != Done_TokenStatus) { delete lastSemiColon; delete commandToken; return status; } if (lastSemiColon != NULL) { // append last semicolon token as command token delete commandToken; commandToken = lastSemiColon; } translator.outputAppend(commandToken); if (!translator.table().hasFlag(token, EndStmt_Flag)) { return printFunction ? ExpSemiCommaOrEnd_TokenStatus : ExpOpSemiCommaOrEnd_TokenStatus; } return Done_TokenStatus; }