diff options
author | Christian Parpart <christian@ethereum.org> | 2018-11-23 23:47:34 +0800 |
---|---|---|
committer | Christian Parpart <christian@ethereum.org> | 2018-11-24 19:40:51 +0800 |
commit | e4106bd06eebce9e17d51858a37bf82566b7f640 (patch) | |
tree | d5437b94d64673870c73a946b10bcf6778ec3594 /liblangutil/Scanner.h | |
parent | e454737a3cf389ee400a9ef1d9f252c579a2ceea (diff) | |
download | dexon-solidity-e4106bd06eebce9e17d51858a37bf82566b7f640.tar dexon-solidity-e4106bd06eebce9e17d51858a37bf82566b7f640.tar.gz dexon-solidity-e4106bd06eebce9e17d51858a37bf82566b7f640.tar.bz2 dexon-solidity-e4106bd06eebce9e17d51858a37bf82566b7f640.tar.lz dexon-solidity-e4106bd06eebce9e17d51858a37bf82566b7f640.tar.xz dexon-solidity-e4106bd06eebce9e17d51858a37bf82566b7f640.tar.zst dexon-solidity-e4106bd06eebce9e17d51858a37bf82566b7f640.zip |
Change scanner error diagnostics to be non-intrusive to the token API.
This also implicitly eliminates the magic-token Token::IllegalHex, and
streamlines error diagnostics over a custom enum class.
Diffstat (limited to 'liblangutil/Scanner.h')
-rw-r--r-- | liblangutil/Scanner.h | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/liblangutil/Scanner.h b/liblangutil/Scanner.h index da5e3dfb..d01e71e2 100644 --- a/liblangutil/Scanner.h +++ b/liblangutil/Scanner.h @@ -57,6 +57,7 @@ #include <liblangutil/SourceLocation.h> #include <libdevcore/Common.h> #include <libdevcore/CommonData.h> +#include <iosfwd> namespace langutil { @@ -65,6 +66,26 @@ class AstRawString; class AstValueFactory; class ParserRecorder; +enum class ScannerError +{ + NoError, + + IllegalToken, + IllegalHexString, + IllegalHexDigit, + IllegalCommentTerminator, + IllegalEscapeSequence, + IllegalStringEndQuote, + IllegalNumberSeparator, + IllegalExponent, + IllegalNumberEnd, + + OctalNotAllowed, +}; + +std::string to_string(ScannerError _errorCode); +std::ostream& operator<<(std::ostream& os, ScannerError _errorCode); + class Scanner { friend class LiteralScope; @@ -100,6 +121,10 @@ public: SourceLocation currentLocation() const { return m_currentToken.location; } std::string const& currentLiteral() const { return m_currentToken.literal; } std::tuple<unsigned, unsigned> const& currentTokenInfo() const { return m_currentToken.extendedTokenInfo; } + + /// Retrieves the last error that occurred during lexical analysis. + /// @note If no error occurred, the value is undefined. + ScannerError currentError() const noexcept { return m_currentToken.error; } ///@} ///@{ @@ -139,12 +164,19 @@ public: ///@} private: + inline Token setError(ScannerError _error) noexcept + { + m_nextToken.error = _error; + return Token::Illegal; + } + /// Used for the current and look-ahead token and comments struct TokenDesc { Token token; SourceLocation location; std::string literal; + ScannerError error = ScannerError::NoError; std::tuple<unsigned, unsigned> extendedTokenInfo; }; @@ -159,6 +191,7 @@ private: bool advance() { m_char = m_source.advanceAndGet(); return !m_source.isPastEndOfInput(); } void rollback(int _amount) { m_char = m_source.rollback(_amount); } + inline Token selectErrorToken(ScannerError _err) { advance(); return setError(_err); } inline Token selectToken(Token _tok) { advance(); return _tok; } /// If the next character is _next, advance and return _then, otherwise return _else. inline Token selectToken(char _next, Token _then, Token _else); |