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:
Leandro Melo
2012-08-16 19:18:20 +02:00
parent a590087749
commit b9d15f1296
2 changed files with 7 additions and 11 deletions

View File

@@ -580,19 +580,15 @@ void Lexer::scan_helper(Token *tok)
yyinp();
scanCharLiteral(tok, ch);
} else if (ch == 'u' && _yychar == '8') {
unsigned char la = 0;
if (_currentChar + 1 != _lastChar)
la = *(_currentChar + 1);
if (la == '"') {
yyinp();
yyinp();
if (_yychar == '"') {
yyinp();
scanStringLiteral(tok, '8');
} else if (la == '\'') {
yyinp();
} else if (_yychar == '\'') {
yyinp();
scanCharLiteral(tok, '8');
} else {
scanIdentifier(tok);
scanIdentifier(tok, 1);
}
} else {
scanIdentifier(tok);
@@ -691,9 +687,9 @@ void Lexer::scanNumericLiteral(Token *tok)
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 == '$')
yyinp();
int yylen = _currentChar - yytext;

View File

@@ -94,7 +94,7 @@ private:
void scanCharLiteral(Token *tok, unsigned char hint = 0);
void scanUntilQuote(Token *tok, unsigned char quote);
void scanNumericLiteral(Token *tok);
void scanIdentifier(Token *tok);
void scanIdentifier(Token *tok, unsigned extraProcessedChars = 0);
inline void yyinp()
{