// INPUT command translate function TokenStatus inputTranslate(Translator &translator, Token *commandToken, Token *&token) { TokenStatus status; int indexBegin; bool done; Token *inputToken; if (commandToken->isCode(Input_Code)) { token = translator.table().newToken(InputBegin_Code); } else // InputPrompt_Code { token = NULL; status = translator.getExpression(token, String_DataType); if (status != Done_TokenStatus) { if (status == Parser_TokenStatus && token->isDataType(None_DataType)) { status = ExpSemiOrComma_TokenStatus; } delete commandToken; return status; } translator.doneStackDrop(); if (token->isCode(Comma_Code)) { token->addSubCode(Option_SubCode); } else if (!token->isCode(SemiColon_Code)) { delete commandToken; return ExpOpSemiOrComma_TokenStatus; } token->setCode(InputBeginStr_Code); } // save index where to insert input parse codes and append input begin indexBegin = translator.outputCount(); translator.outputAppend(token); // loop to read input variables do { // get variable reference token = NULL; if ((status = translator.getOperand(token, Any_DataType, Translator::Variable_Reference)) != Good_TokenStatus) { break; } // get and check next token if ((status = translator.getToken(token)) != Good_TokenStatus) { status = ExpCommaSemiOrEnd_TokenStatus; break; } if (token->isCode(Comma_Code)) { done = false; inputToken = token; } else if (token->isCode(SemiColon_Code)) { commandToken->addSubCode(Option_SubCode); done = true; inputToken = token; // get and check next token if ((status = translator.getToken(token)) != Good_TokenStatus) { status = ExpEndStmt_TokenStatus; break; } } else // possible end-of-statement (checked below) { done = true; inputToken = new Token; } // change token to appropriate assign code and append to output translator.table().setToken(inputToken, InputAssign_Code); status = translator.processFinalOperand(inputToken); if (status != Good_TokenStatus) { break; } // create and insert input parse code at beginning // (inserted in reverse order for each input variable) translator.outputInsert(indexBegin, translator.table() .newToken(translator.table() .secondAssociatedCode(inputToken->code()))); } while (!done); if (status != Good_TokenStatus) { delete commandToken; return status; } translator.outputAppend(commandToken); // check terminating token for end-of-statement if (!translator.table().hasFlag(token, EndStmt_Flag)) { return ExpCommaSemiOrEnd_TokenStatus; } return Done_TokenStatus; }