forked from qt-creator/qt-creator
C++: Avoid looking ahead when lexing u8"literal"
This makes things slightly more efficient. But it will be more significant when we introduce R"rawliterals" since we would avoid an even further lookahead for cases like u8R"string". Change-Id: Id4bad8b917752d23daf2f4989330434979cf602f Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com> Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
14
src/libs/3rdparty/cplusplus/Lexer.cpp
vendored
14
src/libs/3rdparty/cplusplus/Lexer.cpp
vendored
@@ -580,19 +580,15 @@ void Lexer::scan_helper(Token *tok)
|
|||||||
yyinp();
|
yyinp();
|
||||||
scanCharLiteral(tok, ch);
|
scanCharLiteral(tok, ch);
|
||||||
} else if (ch == 'u' && _yychar == '8') {
|
} else if (ch == 'u' && _yychar == '8') {
|
||||||
unsigned char la = 0;
|
|
||||||
if (_currentChar + 1 != _lastChar)
|
|
||||||
la = *(_currentChar + 1);
|
|
||||||
if (la == '"') {
|
|
||||||
yyinp();
|
yyinp();
|
||||||
|
if (_yychar == '"') {
|
||||||
yyinp();
|
yyinp();
|
||||||
scanStringLiteral(tok, '8');
|
scanStringLiteral(tok, '8');
|
||||||
} else if (la == '\'') {
|
} else if (_yychar == '\'') {
|
||||||
yyinp();
|
|
||||||
yyinp();
|
yyinp();
|
||||||
scanCharLiteral(tok, '8');
|
scanCharLiteral(tok, '8');
|
||||||
} else {
|
} else {
|
||||||
scanIdentifier(tok);
|
scanIdentifier(tok, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
scanIdentifier(tok);
|
scanIdentifier(tok);
|
||||||
@@ -691,9 +687,9 @@ void Lexer::scanNumericLiteral(Token *tok)
|
|||||||
tok->number = control()->numericLiteral(yytext, yylen);
|
tok->number = control()->numericLiteral(yytext, yylen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Lexer::scanIdentifier(Token *tok)
|
void Lexer::scanIdentifier(Token *tok, unsigned extraProcessedChars)
|
||||||
{
|
{
|
||||||
const char *yytext = _currentChar - 1;
|
const char *yytext = _currentChar - 1 - extraProcessedChars;
|
||||||
while (std::isalnum(_yychar) || _yychar == '_' || _yychar == '$')
|
while (std::isalnum(_yychar) || _yychar == '_' || _yychar == '$')
|
||||||
yyinp();
|
yyinp();
|
||||||
int yylen = _currentChar - yytext;
|
int yylen = _currentChar - yytext;
|
||||||
|
2
src/libs/3rdparty/cplusplus/Lexer.h
vendored
2
src/libs/3rdparty/cplusplus/Lexer.h
vendored
@@ -94,7 +94,7 @@ private:
|
|||||||
void scanCharLiteral(Token *tok, unsigned char hint = 0);
|
void scanCharLiteral(Token *tok, unsigned char hint = 0);
|
||||||
void scanUntilQuote(Token *tok, unsigned char quote);
|
void scanUntilQuote(Token *tok, unsigned char quote);
|
||||||
void scanNumericLiteral(Token *tok);
|
void scanNumericLiteral(Token *tok);
|
||||||
void scanIdentifier(Token *tok);
|
void scanIdentifier(Token *tok, unsigned extraProcessedChars = 0);
|
||||||
|
|
||||||
inline void yyinp()
|
inline void yyinp()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user