Skip to content

Commit d9cb8c8

Browse files
committed
Add ScannerKind and replace supportPeriodInIdentifier
1 parent 52eeeac commit d9cb8c8

File tree

4 files changed

+23
-18
lines changed

4 files changed

+23
-18
lines changed

Diff for: liblangutil/Scanner.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ void Scanner::reset(shared_ptr<CharStream> _source)
147147
void Scanner::reset()
148148
{
149149
m_source->reset();
150-
m_supportPeriodInIdentifier = false;
150+
m_kind = ScannerKind::Solidity;
151151
m_char = m_source->get();
152152
skipWhitespace();
153153
next();
@@ -163,12 +163,6 @@ void Scanner::setPosition(size_t _offset)
163163
next();
164164
}
165165

166-
void Scanner::supportPeriodInIdentifier(bool _value)
167-
{
168-
m_supportPeriodInIdentifier = _value;
169-
rescan();
170-
}
171-
172166
bool Scanner::scanHexByte(char& o_scannedByte)
173167
{
174168
char x = 0;
@@ -970,7 +964,7 @@ tuple<Token, unsigned, unsigned> Scanner::scanIdentifierOrKeyword()
970964
LiteralScope literal(this, LITERAL_TYPE_STRING);
971965
addLiteralCharAndAdvance();
972966
// Scan the rest of the identifier characters.
973-
while (isIdentifierPart(m_char) || (m_char == '.' && m_supportPeriodInIdentifier))
967+
while (isIdentifierPart(m_char) || (m_char == '.' && m_kind == ScannerKind::Yul))
974968
addLiteralCharAndAdvance();
975969
literal.complete();
976970
return TokenTraits::fromIdentifierOrKeyword(m_tokens[NextNext].literal);

Diff for: liblangutil/Scanner.h

+16-5
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ class AstRawString;
6868
class AstValueFactory;
6969
class ParserRecorder;
7070

71+
enum class ScannerKind
72+
{
73+
Solidity,
74+
Yul
75+
};
76+
7177
enum class ScannerError
7278
{
7379
NoError,
@@ -107,9 +113,14 @@ class Scanner
107113
/// Resets scanner to the start of input.
108114
void reset();
109115

110-
/// Enables or disables support for period in identifier.
111-
/// This re-scans the current token and comment literal and thus invalidates it.
112-
void supportPeriodInIdentifier(bool _value);
116+
/// Changes the scanner mode.
117+
void setScannerMode(ScannerKind _kind)
118+
{
119+
m_kind = _kind;
120+
121+
// Invalidate lookahead buffer.
122+
rescan();
123+
}
113124

114125
/// @returns the next token and advances input
115126
Token next();
@@ -249,15 +260,15 @@ class Scanner
249260
size_t sourcePos() const { return m_source->position(); }
250261
bool isSourcePastEndOfInput() const { return m_source->isPastEndOfInput(); }
251262

252-
bool m_supportPeriodInIdentifier = false;
253-
254263
enum TokenIndex { Current, Next, NextNext };
255264

256265
TokenDesc m_skippedComments[3] = {}; // desc for the current, next and nextnext skipped comment
257266
TokenDesc m_tokens[3] = {}; // desc for the current, next and nextnext token
258267

259268
std::shared_ptr<CharStream> m_source;
260269

270+
ScannerKind m_kind = ScannerKind::Solidity;
271+
261272
/// one character look-ahead, equals 0 at end of input
262273
char m_char;
263274
};

Diff for: libyul/AsmParser.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ unique_ptr<Block> Parser::parse(std::shared_ptr<Scanner> const& _scanner, bool _
4242
{
4343
m_recursionDepth = 0;
4444

45-
_scanner->supportPeriodInIdentifier(true);
46-
ScopeGuard resetScanner([&]{ _scanner->supportPeriodInIdentifier(false); });
45+
_scanner->setScannerMode(ScannerKind::Yul);
46+
ScopeGuard resetScanner([&]{ _scanner->setScannerMode(ScannerKind::Solidity); });
4747

4848
try
4949
{

Diff for: test/libsolidity/SolidityScanner.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ BOOST_AUTO_TEST_CASE(leading_dot_in_identifier)
214214
BOOST_CHECK_EQUAL(scanner.next(), Token::LParen);
215215
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
216216
scanner.reset(CharStream("function .a(", ""));
217-
scanner.supportPeriodInIdentifier(true);
217+
scanner.setScannerMode(ScannerKind::Yul);
218218
BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Function);
219219
BOOST_CHECK_EQUAL(scanner.next(), Token::Period);
220220
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
@@ -233,7 +233,7 @@ BOOST_AUTO_TEST_CASE(middle_dot_in_identifier)
233233
BOOST_CHECK_EQUAL(scanner.next(), Token::LParen);
234234
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
235235
scanner.reset(CharStream("function a...a(", ""));
236-
scanner.supportPeriodInIdentifier(true);
236+
scanner.setScannerMode(ScannerKind::Yul);
237237
BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Function);
238238
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
239239
BOOST_CHECK_EQUAL(scanner.next(), Token::LParen);
@@ -249,7 +249,7 @@ BOOST_AUTO_TEST_CASE(trailing_dot_in_identifier)
249249
BOOST_CHECK_EQUAL(scanner.next(), Token::LParen);
250250
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
251251
scanner.reset(CharStream("function a.(", ""));
252-
scanner.supportPeriodInIdentifier(true);
252+
scanner.setScannerMode(ScannerKind::Yul);
253253
BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Function);
254254
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
255255
BOOST_CHECK_EQUAL(scanner.next(), Token::LParen);

0 commit comments

Comments
 (0)