Beispiel #1
0
// 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;
}