diff --git a/parser.cpp b/parser.cpp index 7dbe98a..fdf1dfb 100644 --- a/parser.cpp +++ b/parser.cpp @@ -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(m_pos); // create new token to return @@ -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 diff --git a/parser.h b/parser.h index 4d2c82c..82ef16f 100644 --- a/parser.h +++ b/parser.h @@ -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; diff --git a/test_ibcp.cpp b/test_ibcp.cpp index 36582f4..570aba7 100644 --- a/test_ibcp.cpp +++ b/test_ibcp.cpp @@ -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); } diff --git a/translator.cpp b/translator.cpp index f078c32..6a67f60 100644 --- a/translator.cpp +++ b/translator.cpp @@ -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);