Skip to content

Commit

Permalink
parser: changed state enumeration to number
Browse files Browse the repository at this point in the history
changed the state enumeration to number enumeration with yes and no
enumerator since this is really what this argument is telling parser
(to allow numbers or not)

changes made to get token function of translator:
- added data type not equal to string for setting parser number argument
  since numeric constants are not allowed when looking for a string
- removed check to set the token length to one upon error when there
  was number error when not looking for a number or looking for a string
  (these won't occur so no need to check)
- simplified check when returned and expected expression error to
  checking if data type is not blank and not none and unknown token
  error was returned
- removed local state/number variable (only used for parse argument)
  • Loading branch information
thunder422 committed Oct 24, 2014
1 parent 04c4fea commit 5690b1b
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 21 deletions.
4 changes: 2 additions & 2 deletions parser.cpp
Expand Up @@ -42,7 +42,7 @@ Parser::Parser(const QString &input) :
// - after at time of return, member token is released (set to null)
// - the token may contain an error message if an error was found

TokenPtr Parser::operator()(State state)
TokenPtr Parser::operator()(Number number)
{
skipWhitespace();
m_token = std::make_shared<Token>(m_pos); // create new token to return
Expand All @@ -51,7 +51,7 @@ TokenPtr Parser::operator()(State state)
{
m_table.setToken(m_token, EOL_Code);
}
else if (!getIdentifier() && (state == State::Operator || !getNumber())
else if (!getIdentifier() && (number == Number::No || !getNumber())
&& !getString() && !getOperator())
{
// not a valid token, create error token
Expand Down
8 changes: 4 additions & 4 deletions parser.h
Expand Up @@ -36,11 +36,11 @@ class Parser
{
public:
explicit Parser(const QString &input);
enum class State {
Operator,
Operand
enum class Number {
No,
Yes
};
TokenPtr operator()(State state);
TokenPtr operator()(Number state);
Status errorStatus()
{
return m_errorStatus;
Expand Down
2 changes: 1 addition & 1 deletion test_ibcp.cpp
Expand Up @@ -481,7 +481,7 @@ void Tester::parseInput(const std::string &testInput)
Parser parse {testInput.c_str()};
do
{
TokenPtr token {parse(Parser::State::Operand)};
TokenPtr token {parse(Parser::Number::Yes)};
more = printToken(token, parse.errorStatus(), true)
&& !token->isCode(EOL_Code);
}
Expand Down
18 changes: 4 additions & 14 deletions translator.cpp
Expand Up @@ -551,22 +551,12 @@ Status Translator::getOperand(TokenPtr &token, DataType dataType,
Status Translator::getToken(TokenPtr &token, DataType dataType)
{
// if data type is not none, then getting an operand token
Parser::State state {dataType != DataType{}
? Parser::State::Operand : Parser::State::Operator};
token = (*m_parse)(state);
token = (*m_parse)(dataType != DataType{} && dataType != DataType::String
? Parser::Number::Yes : Parser::Number::No);
if (token->isType(Token::Type::Error))
{
if ((state == Parser::State::Operator
&& token->dataType() == DataType::Double)
|| dataType == DataType::String)
{
// only do this for non-operand number constant errors
token->setLength(1); // just point to first character
token->setDataType(DataType::None); // indicate not a number error
}
if (state == Parser::State::Operand
&& ((token->dataType() != DataType::Double
&& dataType != DataType::None) || dataType == DataType::String))
if (dataType != DataType{} && dataType != DataType::None
&& m_parse->errorStatus() == Status::UnknownToken)
{
// non-number constant error, return expected expression error
return expectedErrStatus(dataType);
Expand Down

0 comments on commit 5690b1b

Please sign in to comment.