From 6c61e28dc22894a8b035ba25ed727db664a4b163 Mon Sep 17 00:00:00 2001 From: VoR0220 Date: Tue, 29 Mar 2016 22:32:40 -0500 Subject: Got it working exactly like you wanted ;) --- libsolidity/parsing/ParserBase.cpp | 87 +++++++++++++++++++++++++++++--------- libsolidity/parsing/Token.h | 14 +++--- 2 files changed, 76 insertions(+), 25 deletions(-) diff --git a/libsolidity/parsing/ParserBase.cpp b/libsolidity/parsing/ParserBase.cpp index 64e42841..9148946c 100644 --- a/libsolidity/parsing/ParserBase.cpp +++ b/libsolidity/parsing/ParserBase.cpp @@ -44,14 +44,32 @@ int ParserBase::endPosition() const void ParserBase::expectToken(Token::Value _value) { - if (m_scanner->currentToken() != _value) - fatalParserError( - string("Expected token ") + - string(Token::name(_value)) + - string(" got '") + - string(Token::name(m_scanner->currentToken())) + - string("'") - ); + Token::Value tok = m_scanner->currentToken(); + if (tok != _value) + { + if (Token::isElementaryTypeName(tok)) //for the sake of accuracy in reporting + { + unsigned firstSize; + unsigned secondSize; + tie(firstSize, secondSize) = m_scanner->currentTokenInfo(); + ElementaryTypeNameToken elemTypeName(tok, firstSize, secondSize); + 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(); } @@ -59,23 +77,54 @@ Token::Value ParserBase::expectAssignmentOperator() { Token::Value op = m_scanner->currentToken(); if (!Token::isAssignmentOp(op)) - fatalParserError( - string("Expected assignment operator, got '") + - string(Token::name(m_scanner->currentToken())) + - string("'") - ); + { + if (Token::isElementaryTypeName(op)) //for the sake of accuracy in reporting + { + unsigned firstSize; + unsigned secondSize; + tie(firstSize, secondSize) = m_scanner->currentTokenInfo(); + ElementaryTypeNameToken elemTypeName(op, firstSize, secondSize); + 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(); return op; } ASTPointer ParserBase::expectIdentifierToken() { - if (m_scanner->currentToken() != Token::Identifier) - fatalParserError( - string("Expected identifier, got '") + - string(Token::name(m_scanner->currentToken())) + - string("'") - ); + Token::Value id = m_scanner->currentToken(); + if (id != Token::Identifier) + { + if (Token::isElementaryTypeName(id)) //for the sake of accuracy in reporting + { + unsigned firstSize; + unsigned secondSize; + tie(firstSize, secondSize) = m_scanner->currentTokenInfo(); + ElementaryTypeNameToken elemTypeName(id, firstSize, secondSize); + fatalParserError( + string("Expected identifier, got '") + + elemTypeName.toString() + + string("'") + ); + } + else + fatalParserError( + string("Expected identifier, got '") + + string(Token::name(id)) + + string("'") + ); + } return getLiteralAndAdvance(); } diff --git a/libsolidity/parsing/Token.h b/libsolidity/parsing/Token.h index 31646f8d..e7a7e24c 100644 --- a/libsolidity/parsing/Token.h +++ b/libsolidity/parsing/Token.h @@ -190,18 +190,18 @@ namespace solidity K(After, "after", 0) \ /* type keywords*/ \ K(Int, "int", 0) \ - T(IntM, "intM", 0) \ K(UInt, "uint", 0) \ - T(UIntM, "uintM", 0) \ K(Bytes, "bytes", 0) \ - T(BytesM, "bytesM", 0) \ K(Byte, "byte", 0) \ K(String, "string", 0) \ K(Address, "address", 0) \ K(Bool, "bool", 0) \ K(Fixed, "fixed", 0) \ - T(FixedMxN, "fixedMxN", 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(TypesEnd, NULL, 0) /* used as type enum end marker */ \ \ @@ -334,8 +334,10 @@ public: std::string name = Token::toString(m_token); if (tokenValue || (firstNumber() == 0 && secondNumber() == 0)) return name; - //need to set it up this way for fixed types construction in future - return name.substr(0, name.size() - 1) + std::to_string(m_firstNumber); + else 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: -- cgit