Skip to content

Commit

Permalink
translator: changed get token to throw errors
Browse files Browse the repository at this point in the history
removed return value
removed creation of error token
removed good status enumerator since it is no longer needed
modified get expression function to create error token (temporary)
removed check for sub-string to pop upon error in let translate
  • Loading branch information
thunder422 committed Nov 27, 2014
1 parent cf45a8e commit 217de6d
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 50 deletions.
20 changes: 14 additions & 6 deletions basic/input.cpp
Expand Up @@ -74,10 +74,14 @@ void inputTranslate(Translator &translator, TokenPtr commandToken,
Translator::Reference::Variable);

// get and check next token
if ((status = translator.getToken(token)) != Status::Good)
try
{
status = Status::ExpCommaSemiOrEnd;
throw TokenError {status, token};
translator.getToken(token);
}
catch (TokenError &error)
{
error = Status::ExpCommaSemiOrEnd;
throw;
}

TokenPtr inputToken;
Expand All @@ -93,10 +97,14 @@ void inputTranslate(Translator &translator, TokenPtr commandToken,
inputToken = std::move(token);

// get and check next token
if ((status = translator.getToken(token)) != Status::Good)
try
{
translator.getToken(token);
}
catch (TokenError &error)
{
status = Status::ExpEndStmt;
throw TokenError {status, token};
error = Status::ExpEndStmt;
throw;
}
}
else // possible end-of-statement
Expand Down
26 changes: 15 additions & 11 deletions basic/let.cpp
Expand Up @@ -61,15 +61,16 @@ void letTranslate(Translator &translator, TokenPtr commandToken,
{
if (error.m_column == column) // at begin command?
{
// next token determines error
TokenPtr nextToken;
if (translator.getToken(nextToken) == Status::Good)
try
{
// next token determines error
TokenPtr nextToken;
translator.getToken(nextToken);
error = nextToken->isCode(Comma_Code)
|| nextToken->isCode(Eq_Code)
? Status::ExpAssignItem : Status::ExpCmdOrAssignItem;
}
else
catch (TokenError)
{
error = Status::ExpCmdOrAssignItem;
}
Expand All @@ -78,7 +79,15 @@ void letTranslate(Translator &translator, TokenPtr commandToken,
}

// get and check next token for comma or equal
status = translator.getToken(token);
try
{
translator.getToken(token);
}
catch (TokenError &error) // invalid token or parser error
{
error = Status::ExpEqualOrComma;
throw;
}
if (token->isCode(Comma_Code))
{
done = false;
Expand All @@ -87,13 +96,8 @@ void letTranslate(Translator &translator, TokenPtr commandToken,
{
done = true;
}
else // invalid token or parser error
else // invalid token
{
if (translator.table().hasFlag(translator.doneStackTopToken(),
SubStr_Flag))
{
translator.doneStackPop();
}
throw TokenError {Status::ExpEqualOrComma, token};
}

Expand Down
1 change: 0 additions & 1 deletion ibcp.h
Expand Up @@ -34,7 +34,6 @@
// parser and translator status codes
enum class Status
{
Good,
Done,
ExpCmdOrAssignItem,
ExpExpr,
Expand Down
2 changes: 0 additions & 2 deletions statusmessage.cpp
Expand Up @@ -30,8 +30,6 @@ const QString StatusMessage::text(Status status)
{
switch (status)
{
case Status::Good:
return tr("Good_TokenStatus (BUG)");
case Status::Done:
return tr("Done_TokenStatus (BUG)");
case Status::ExpCmdOrAssignItem:
Expand Down
70 changes: 41 additions & 29 deletions translator.cpp
Expand Up @@ -141,9 +141,14 @@ void Translator::getCommands(TokenPtr &token)
{
// get any reference token and ignore status
// if not a command token then let translate will handle token
if (getToken(token, DataType::Any, Reference::All) != Status::Good)
try
{
getToken(token, DataType::Any, Reference::All);
}
catch (TokenError &error)
{
throw TokenError {Status::ExpCmdOrAssignItem, token};
error = Status::ExpCmdOrAssignItem;
throw;
}

if (token->isCode(EOL_Code) && m_output.empty())
Expand Down Expand Up @@ -172,10 +177,14 @@ void Translator::getCommands(TokenPtr &token)
}
}
m_output.append(std::move(token)); // Rem or RemOp token
if (getToken(token) != Status::Good)
try
{
getToken(token);
}
catch (TokenError &error)
{
// parser problem, should be EOL
throw TokenError {Status::BUG_UnexpToken, token};
error = Status::BUG_UnexpToken; // parser problem, should be EOL
throw;
}
}

Expand All @@ -195,9 +204,15 @@ Status Translator::getExpression(TokenPtr &token, DataType dataType, int level)

forever
{
if (!token && (status = getToken(token, expectedDataType))
!= Status::Good)
if (!token)
try
{
getToken(token, expectedDataType);
}
catch (TokenError &error)
{
status = error();
token = std::make_shared<Token>(error.m_column, error.m_length);
break;
}

Expand Down Expand Up @@ -289,9 +304,15 @@ Status Translator::getExpression(TokenPtr &token, DataType dataType, int level)
if (!token)
{
// get binary operator or end-of-expression token
if ((status = getToken(token)) != Status::Good)
try
{
getToken(token);
}
catch (TokenError &error)
{
// if parser error then caller needs to handle it
status = error();
token = std::make_shared<Token>(error.m_column, error.m_length);
break;
}
if (doneStackTopToken()->isDataType(DataType::None)
Expand Down Expand Up @@ -376,13 +397,10 @@ Status Translator::getExpression(TokenPtr &token, DataType dataType, int level)
bool Translator::getOperand(TokenPtr &token, DataType dataType,
Reference reference)
{
Status status;

// get token if none was passed (no numbers for a reference)
if (!token && (status = getToken(token, dataType, reference))
!= Status::Good)
if (!token)
{
throw TokenError {status, token};
getToken(token, dataType, reference);
}

// set default data type for token if it has none
Expand Down Expand Up @@ -532,31 +550,25 @@ bool Translator::getOperand(TokenPtr &token, DataType dataType,
// - data type argument determines if number tokens are allowed
// - returns parser error if the parser returned an error exception

Status Translator::getToken(TokenPtr &token, DataType dataType,
void Translator::getToken(TokenPtr &token, DataType dataType,
Reference reference)
try
{
// if data type is not blank and not string, then allow a number token
token = (*m_parse)(dataType != DataType{} && dataType != DataType::String
&& reference == Reference::None
? Parser::Number::Yes : Parser::Number::No);
return Status::Good;
}
catch (TokenError &error)
{
// TODO for now, create an error token to return
token = std::make_shared<Token>(error.m_column, error.m_length);
if (dataType != DataType{} && dataType != DataType::None
&& error(Status::UnknownToken))
{
// non-number constant error, return expected expression error
return expectedErrStatus(dataType, reference);
}
else
{
// caller may need to convert this error to appropriate error
return error();
// non-number constant error, change to expected expression error
error = expectedErrStatus(dataType, reference);
}
// else caller may need to convert this error to appropriate error
throw;
}


Expand Down Expand Up @@ -622,11 +634,7 @@ void Translator::processInternalFunction(TokenPtr &token)
// will not return false (returns error if not reference)
getOperand(token, expectedDataType, Reference::VarDefFn);
// get next token (should be a comma)
if (getToken(token) != Status::Good
|| !token->isCode(Comma_Code))
{
throw TokenError {Status::UnknownToken, token};
}
getToken(token);
}
catch (TokenError &error)
{
Expand All @@ -636,6 +644,10 @@ void Translator::processInternalFunction(TokenPtr &token)
}
throw; // throws getOperand() errors as is
}
if (!token->isCode(Comma_Code))
{
throw TokenError {Status::ExpComma, token};
}
}
else
{
Expand Down
2 changes: 1 addition & 1 deletion translator.h
Expand Up @@ -59,7 +59,7 @@ class Translator
Status getExpression(TokenPtr &token, DataType dataType, int level = 0);
bool getOperand(TokenPtr &token, DataType dataType,
Reference reference = Reference::None);
Status getToken(TokenPtr &token, DataType dataType = DataType{},
void getToken(TokenPtr &token, DataType dataType = DataType{},
Reference reference = Reference::None);

// Public Processing Functions
Expand Down

0 comments on commit 217de6d

Please sign in to comment.