diff options
author | RJ Catalano <rcatalano@macsales.com> | 2016-02-09 05:43:22 +0800 |
---|---|---|
committer | RJ Catalano <rcatalano@macsales.com> | 2016-02-19 01:22:52 +0800 |
commit | 7b918a7bc7a3c619682266b1c2566dacb9dcc765 (patch) | |
tree | a8763b90b26cafff938c3cbc261fa85627ac4a8a /libsolidity/parsing/Token.cpp | |
parent | fca27b9ea00eb580f771820e967f62b58478c9a2 (diff) | |
download | dexon-solidity-7b918a7bc7a3c619682266b1c2566dacb9dcc765.tar.gz dexon-solidity-7b918a7bc7a3c619682266b1c2566dacb9dcc765.tar.zst dexon-solidity-7b918a7bc7a3c619682266b1c2566dacb9dcc765.zip |
changes to redefine the token list, the scanner, and the parser and how they pass around variable types of different sizes
not ready for change to FixedPoint just yet
made this more const correct and added a switch statement for easier reading
Diffstat (limited to 'libsolidity/parsing/Token.cpp')
-rw-r--r-- | libsolidity/parsing/Token.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/libsolidity/parsing/Token.cpp b/libsolidity/parsing/Token.cpp index cda639fb..7ea94112 100644 --- a/libsolidity/parsing/Token.cpp +++ b/libsolidity/parsing/Token.cpp @@ -50,6 +50,44 @@ namespace dev namespace solidity { +bool ElementaryTypeNameToken::isElementaryTypeName(Token::Value _baseType, string const& _info) +{ + if (!Token::isElementaryTypeName(_baseType)) + return false; + string baseType = Token::toString(_baseType); + if (baseType.find('M') == string::npos) + return true; + short m; + m = stoi(_info.substr(_info.find_first_of("0123456789"))); + + if (baseType == "bytesM") + return (0 < m && m <= 32) ? true : false; + else if (baseType == "uintM" || baseType == "intM") + return (0 < m && m <= 256 && m % 8 == 0) ? true : false; + else if (baseType == "ufixedMxN" || baseType == "fixedMxN") + { + short n; + m = stoi(_info.substr(_info.find_first_of("0123456789"), _info.find_last_of("x") - 1)); + n = stoi(_info.substr(_info.find_last_of("x") + 1)); + return (0 < n + m && n + m <= 256 && ((n % 8 == 0) && (m % 8 == 0))); + } + return false; +} + +tuple<string, unsigned int, unsigned int> ElementaryTypeNameToken::setTypes(Token::Value _baseType, string const& _toSet) +{ + string baseType = Token::toString(_baseType); + if (_toSet.find_first_of("0123456789") == string::npos) + return make_tuple(baseType, 0, 0); + baseType = baseType.substr(0, baseType.find('M') - 1) + _toSet; + size_t index = _toSet.find('x') == string::npos ? string::npos : _toSet.find('x') - 1; + unsigned int m = stoi(_toSet.substr(0, index)); + unsigned int n = 0; + if (baseType == "fixed" || baseType == "ufixed") + n = stoi(_toSet.substr(_toSet.find('x') + 1)); + return make_tuple(baseType, m, n); +} + #define T(name, string, precedence) #name, char const* const Token::m_name[NUM_TOKENS] = { @@ -80,7 +118,7 @@ char const Token::m_tokenType[] = { TOKEN_LIST(KT, KK) }; -Token::Value Token::fromIdentifierOrKeyword(const std::string& _name) +Token::Value Token::fromIdentifierOrKeyword(const string& _name) { // The following macros are used inside TOKEN_LIST and cause non-keyword tokens to be ignored // and keywords to be put inside the keywords variable. |