From 87821c53c3a73d3e35a0e50a7c159d9aa5d6b253 Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Wed, 14 Nov 2018 14:59:30 +0100 Subject: Isolating files shared between Yul- and Solidity language frontend. --- liblangutil/ParserBase.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 liblangutil/ParserBase.cpp (limited to 'liblangutil/ParserBase.cpp') diff --git a/liblangutil/ParserBase.cpp b/liblangutil/ParserBase.cpp new file mode 100644 index 00000000..197c2d65 --- /dev/null +++ b/liblangutil/ParserBase.cpp @@ -0,0 +1,115 @@ +/* + 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 . +*/ +/** + * @author Christian + * @date 2016 + * Solidity parser shared functionality. + */ + +#include +#include +#include + +using namespace std; +using namespace dev; +using namespace dev::solidity; + +std::shared_ptr const& ParserBase::sourceName() const +{ + return m_scanner->sourceName(); +} + +int ParserBase::position() const +{ + return m_scanner->currentLocation().start; +} + +int ParserBase::endPosition() const +{ + return m_scanner->currentLocation().end; +} + +Token ParserBase::currentToken() const +{ + return m_scanner->currentToken(); +} + +Token ParserBase::peekNextToken() const +{ + return m_scanner->peekNextToken(); +} + +std::string ParserBase::currentLiteral() const +{ + return m_scanner->currentLiteral(); +} + +Token ParserBase::advance() +{ + return m_scanner->next(); +} + +void ParserBase::expectToken(Token _value, bool _advance) +{ + Token tok = m_scanner->currentToken(); + if (tok != _value) + { + auto tokenName = [this](Token _token) + { + if (_token == Token::Identifier) + return string("identifier"); + else if (_token == Token::EOS) + return string("end of source"); + else if (TokenTraits::isReservedKeyword(_token)) + return string("reserved keyword '") + TokenTraits::friendlyName(_token) + "'"; + else if (TokenTraits::isElementaryTypeName(_token)) //for the sake of accuracy in reporting + { + ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken(); + return string("'") + elemTypeName.toString() + "'"; + } + else + return string("'") + TokenTraits::friendlyName(_token) + "'"; + }; + + fatalParserError(string("Expected ") + tokenName(_value) + string(" but got ") + tokenName(tok)); + } + if (_advance) + m_scanner->next(); +} + +void ParserBase::increaseRecursionDepth() +{ + m_recursionDepth++; + if (m_recursionDepth >= 2560) + fatalParserError("Maximum recursion depth reached during parsing."); +} + +void ParserBase::decreaseRecursionDepth() +{ + solAssert(m_recursionDepth > 0, ""); + m_recursionDepth--; +} + +void ParserBase::parserError(string const& _description) +{ + m_errorReporter.parserError(SourceLocation(position(), endPosition(), sourceName()), _description); +} + +void ParserBase::fatalParserError(string const& _description) +{ + m_errorReporter.fatalParserError(SourceLocation(position(), endPosition(), sourceName()), _description); +} -- cgit v1.2.3 From d67322a1861d60a88151f7c25d6c3478a9a39acf Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Wed, 14 Nov 2018 17:11:55 +0100 Subject: Introduce namespace `langutil` in liblangutil directory. Also: - Use {}-style list initialisation for SourceLocation construction - Introduce new system includes - Changes the API of the Scanner to take source as value (with move) as opposed to as a reference --- liblangutil/ParserBase.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'liblangutil/ParserBase.cpp') diff --git a/liblangutil/ParserBase.cpp b/liblangutil/ParserBase.cpp index 197c2d65..8156f9b9 100644 --- a/liblangutil/ParserBase.cpp +++ b/liblangutil/ParserBase.cpp @@ -25,8 +25,7 @@ #include using namespace std; -using namespace dev; -using namespace dev::solidity; +using namespace langutil; std::shared_ptr const& ParserBase::sourceName() const { -- cgit v1.2.3 From c48a5264be4221873fe02cac57f6a41a32010fea Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Wed, 28 Nov 2018 16:19:22 +0100 Subject: liblangutil: SourceLocation: adds (shared) pointer to underlying CharStream source, eliminating sourceName Also, adapted affecting code to those changes. --- liblangutil/ParserBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'liblangutil/ParserBase.cpp') diff --git a/liblangutil/ParserBase.cpp b/liblangutil/ParserBase.cpp index 8156f9b9..c103475a 100644 --- a/liblangutil/ParserBase.cpp +++ b/liblangutil/ParserBase.cpp @@ -105,10 +105,10 @@ void ParserBase::decreaseRecursionDepth() void ParserBase::parserError(string const& _description) { - m_errorReporter.parserError(SourceLocation(position(), endPosition(), sourceName()), _description); + m_errorReporter.parserError(SourceLocation(position(), endPosition(), source()), _description); } void ParserBase::fatalParserError(string const& _description) { - m_errorReporter.fatalParserError(SourceLocation(position(), endPosition(), sourceName()), _description); + m_errorReporter.fatalParserError(SourceLocation(position(), endPosition(), source()), _description); } -- cgit v1.2.3 From 435f7b3b72157e884344adbc7b62033bd08bb51c Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Thu, 29 Nov 2018 01:58:15 +0100 Subject: liblangutil: Scanner: remove superfluous sourceName field (it's in CharStream already) Also, ParserBase::sourceName() was dead code. Eliminating it should increase test coverage (how sneaky) :-) --- liblangutil/ParserBase.cpp | 5 ----- 1 file changed, 5 deletions(-) (limited to 'liblangutil/ParserBase.cpp') diff --git a/liblangutil/ParserBase.cpp b/liblangutil/ParserBase.cpp index c103475a..391af291 100644 --- a/liblangutil/ParserBase.cpp +++ b/liblangutil/ParserBase.cpp @@ -27,11 +27,6 @@ using namespace std; using namespace langutil; -std::shared_ptr const& ParserBase::sourceName() const -{ - return m_scanner->sourceName(); -} - int ParserBase::position() const { return m_scanner->currentLocation().start; -- cgit v1.2.3