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