diff --git a/liblangutil/CMakeLists.txt b/liblangutil/CMakeLists.txt index 4539376f0..1c3d5a05e 100644 --- a/liblangutil/CMakeLists.txt +++ b/liblangutil/CMakeLists.txt @@ -1,5 +1,6 @@ # Solidity Commons Library (Solidity related sharing bits between libsolidity and libyul) set(sources + Common.h CharStream.cpp CharStream.h ErrorReporter.cpp diff --git a/liblangutil/Common.h b/liblangutil/Common.h new file mode 100644 index 000000000..ed6aa2cbc --- /dev/null +++ b/liblangutil/Common.h @@ -0,0 +1,63 @@ +/* + This file is part of solidity. + solidity is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + solidity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with solidity. If not, see . +*/ + +#pragma once + +namespace langutil +{ + +inline bool isDecimalDigit(char c) +{ + return '0' <= c && c <= '9'; +} + +inline bool isHexDigit(char c) +{ + return + isDecimalDigit(c) || + ('a' <= c && c <= 'f') || + ('A' <= c && c <= 'F'); +} + +inline bool isLineTerminator(char c) +{ + return c == '\n'; +} + +inline bool isWhiteSpace(char c) +{ + return c == ' ' || c == '\n' || c == '\t' || c == '\r'; +} + +inline bool isIdentifierStart(char c) +{ + return c == '_' || c == '$' || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); +} + +inline bool isIdentifierPart(char c) +{ + return isIdentifierStart(c) || isDecimalDigit(c); +} + +inline int hexValue(char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + else return -1; +} +} diff --git a/liblangutil/Scanner.cpp b/liblangutil/Scanner.cpp index 3463783bf..ed6322472 100644 --- a/liblangutil/Scanner.cpp +++ b/liblangutil/Scanner.cpp @@ -50,6 +50,7 @@ * Solidity scanner. */ +#include #include #include #include @@ -61,47 +62,6 @@ using namespace std; namespace langutil { -namespace -{ -bool isDecimalDigit(char c) -{ - return '0' <= c && c <= '9'; -} -bool isHexDigit(char c) -{ - return - isDecimalDigit(c) || - ('a' <= c && c <= 'f') || - ('A' <= c && c <= 'F'); -} -bool isLineTerminator(char c) -{ - return c == '\n'; -} -bool isWhiteSpace(char c) -{ - return c == ' ' || c == '\n' || c == '\t' || c == '\r'; -} -bool isIdentifierStart(char c) -{ - return c == '_' || c == '$' || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); -} -bool isIdentifierPart(char c) -{ - return isIdentifierStart(c) || isDecimalDigit(c); -} -int hexValue(char c) -{ - if (c >= '0' && c <= '9') - return c - '0'; - else if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - return c - 'A' + 10; - else return -1; -} -} // end anonymous namespace - std::string to_string(ScannerError _errorCode) { switch (_errorCode) diff --git a/test/libsolidity/util/TestFileParser.cpp b/test/libsolidity/util/TestFileParser.cpp index 9f05e72ff..bbd867bb7 100644 --- a/test/libsolidity/util/TestFileParser.cpp +++ b/test/libsolidity/util/TestFileParser.cpp @@ -16,8 +16,8 @@ */ #include - #include +#include #include #include #include @@ -33,18 +33,6 @@ using namespace dev::solidity::test; using namespace std; using namespace soltest; -namespace -{ - bool isIdentifierStart(char c) - { - return c == '_' || c == '$' || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); - } - bool isIdentifierPart(char c) - { - return isIdentifierStart(c) || isdigit(c); - } -} - vector TestFileParser::parseFunctionCalls() { vector calls; @@ -354,14 +342,14 @@ void TestFileParser::Scanner::scanNextToken() token = selectToken(Token::RParen); break; default: - if (isIdentifierStart(current())) + if (langutil::isIdentifierStart(current())) { TokenDesc detectedToken = detectKeyword(scanIdentifierOrKeyword()); token = selectToken(detectedToken.first, detectedToken.second); } - else if (isdigit(current())) + else if (langutil::isDecimalDigit(current())) token = selectToken(Token::Number, scanNumber()); - else if (isspace(current())) + else if (langutil::isWhiteSpace(current())) token = selectToken(Token::Whitespace); else if (isEndOfLine()) token = selectToken(Token::EOS); @@ -389,7 +377,7 @@ string TestFileParser::Scanner::scanIdentifierOrKeyword() { string identifier; identifier += current(); - while (isIdentifierPart(peek())) + while (langutil::isIdentifierPart(peek())) { advance(); identifier += current(); @@ -401,7 +389,7 @@ string TestFileParser::Scanner::scanNumber() { string number; number += current(); - while (isdigit(peek())) + while (langutil::isDecimalDigit(peek())) { advance(); number += current();