Merge pull request #457 from VoR0220/tokenNameAndStringFix

Fix for Token::name and token::toString
This commit is contained in:
chriseth 2016-04-01 01:08:59 +02:00
commit 285fdf3b0a
5 changed files with 92 additions and 29 deletions

View File

@ -44,14 +44,29 @@ int ParserBase::endPosition() const
void ParserBase::expectToken(Token::Value _value) void ParserBase::expectToken(Token::Value _value)
{ {
if (m_scanner->currentToken() != _value) Token::Value tok = m_scanner->currentToken();
fatalParserError( if (tok != _value)
string("Expected token ") + {
string(Token::name(_value)) + if (Token::isElementaryTypeName(tok)) //for the sake of accuracy in reporting
string(" got '") + {
string(Token::name(m_scanner->currentToken())) + ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
string("'") fatalParserError(
); string("Expected token ") +
string(Token::name(_value)) +
string(" got '") +
elemTypeName.toString() +
string("'")
);
}
else
fatalParserError(
string("Expected token ") +
string(Token::name(_value)) +
string(" got '") +
string(Token::name(m_scanner->currentToken())) +
string("'")
);
}
m_scanner->next(); m_scanner->next();
} }
@ -59,23 +74,48 @@ Token::Value ParserBase::expectAssignmentOperator()
{ {
Token::Value op = m_scanner->currentToken(); Token::Value op = m_scanner->currentToken();
if (!Token::isAssignmentOp(op)) if (!Token::isAssignmentOp(op))
fatalParserError( {
string("Expected assignment operator, got '") + if (Token::isElementaryTypeName(op)) //for the sake of accuracy in reporting
string(Token::name(m_scanner->currentToken())) + {
string("'") ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
); fatalParserError(
string("Expected assignment operator, got '") +
elemTypeName.toString() +
string("'")
);
}
else
fatalParserError(
string("Expected assignment operator, got '") +
string(Token::name(m_scanner->currentToken())) +
string("'")
);
}
m_scanner->next(); m_scanner->next();
return op; return op;
} }
ASTPointer<ASTString> ParserBase::expectIdentifierToken() ASTPointer<ASTString> ParserBase::expectIdentifierToken()
{ {
if (m_scanner->currentToken() != Token::Identifier) Token::Value id = m_scanner->currentToken();
fatalParserError( if (id != Token::Identifier)
string("Expected identifier, got '") + {
string(Token::name(m_scanner->currentToken())) + if (Token::isElementaryTypeName(id)) //for the sake of accuracy in reporting
string("'") {
); ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
fatalParserError(
string("Expected identifier, got '") +
elemTypeName.toString() +
string("'")
);
}
else
fatalParserError(
string("Expected identifier, got '") +
string(Token::name(id)) +
string("'")
);
}
return getLiteralAndAdvance(); return getLiteralAndAdvance();
} }

View File

@ -119,6 +119,13 @@ public:
{ {
return m_currentToken.token; return m_currentToken.token;
} }
ElementaryTypeNameToken currentElementaryTypeNameToken()
{
unsigned firstSize;
unsigned secondSize;
std::tie(firstSize, secondSize) = m_currentToken.extendedTokenInfo;
return ElementaryTypeNameToken(m_currentToken.token, firstSize, secondSize);
}
SourceLocation currentLocation() const { return m_currentToken.location; } SourceLocation currentLocation() const { return m_currentToken.location; }
std::string const& currentLiteral() const { return m_currentToken.literal; } std::string const& currentLiteral() const { return m_currentToken.literal; }

View File

@ -155,16 +155,17 @@ tuple<Token::Value, unsigned int, unsigned int> Token::fromIdentifierOrKeyword(s
) { ) {
int n = parseSize(positionX + 1, _literal.end()); int n = parseSize(positionX + 1, _literal.end());
if ( if (
0 < m && m < 256 && 0 <= m && m <= 256 &&
0 < n && n < 256 && 0 <= n && n <= 256 &&
m + n > 0 &&
m + n <= 256 && m + n <= 256 &&
m % 8 == 0 && m % 8 == 0 &&
n % 8 == 0 n % 8 == 0
) { ) {
if (keyword == Token::UFixed) if (keyword == Token::UFixed)
return make_tuple(Token::UFixed, m, n); return make_tuple(Token::UFixedMxN, m, n);
else else
return make_tuple(Token::Fixed, m, n); return make_tuple(Token::FixedMxN, m, n);
} }
} }
} }

View File

@ -190,18 +190,18 @@ namespace solidity
K(After, "after", 0) \ K(After, "after", 0) \
/* type keywords*/ \ /* type keywords*/ \
K(Int, "int", 0) \ K(Int, "int", 0) \
T(IntM, "intM", 0) \
K(UInt, "uint", 0) \ K(UInt, "uint", 0) \
T(UIntM, "uintM", 0) \
K(Bytes, "bytes", 0) \ K(Bytes, "bytes", 0) \
T(BytesM, "bytesM", 0) \
K(Byte, "byte", 0) \ K(Byte, "byte", 0) \
K(String, "string", 0) \ K(String, "string", 0) \
K(Address, "address", 0) \ K(Address, "address", 0) \
K(Bool, "bool", 0) \ K(Bool, "bool", 0) \
K(Fixed, "fixed", 0) \ K(Fixed, "fixed", 0) \
T(FixedMxN, "fixedMxN", 0) \
K(UFixed, "ufixed", 0) \ K(UFixed, "ufixed", 0) \
T(IntM, "intM", 0) \
T(UIntM, "uintM", 0) \
T(BytesM, "bytesM", 0) \
T(FixedMxN, "fixedMxN", 0) \
T(UFixedMxN, "ufixedMxN", 0) \ T(UFixedMxN, "ufixedMxN", 0) \
T(TypesEnd, NULL, 0) /* used as type enum end marker */ \ T(TypesEnd, NULL, 0) /* used as type enum end marker */ \
\ \
@ -334,8 +334,11 @@ public:
std::string name = Token::toString(m_token); std::string name = Token::toString(m_token);
if (tokenValue || (firstNumber() == 0 && secondNumber() == 0)) if (tokenValue || (firstNumber() == 0 && secondNumber() == 0))
return name; return name;
//need to set it up this way for fixed types construction in future solAssert(name.size() >= 3, "Token name size should be greater than 3. Should not reach here.");
return name.substr(0, name.size() - 1) + std::to_string(m_firstNumber); if (m_token == Token::FixedMxN || m_token == Token::UFixedMxN)
return name.substr(0, name.size() - 3) + std::to_string(m_firstNumber) + "x" + std::to_string(m_secondNumber);
else
return name.substr(0, name.size() - 1) + std::to_string(m_firstNumber);
} }
private: private:

View File

@ -3258,6 +3258,18 @@ BOOST_AUTO_TEST_CASE(library_functions_do_not_have_value)
BOOST_CHECK(!success(text)); BOOST_CHECK(!success(text));
} }
BOOST_AUTO_TEST_CASE(invalid_fixed_type_long)
{
char const* text = R"(
contract test {
function f() {
fixed8x888888888888888888888888888888888888888888888888888 b;
}
}
)";
BOOST_CHECK(!success(text));
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()
} }