forked from OSchip/llvm-project
Disambiguate Numbers and Identifiers
Use lookahead to determine whether a number is really a number or is part of something forming an identifier. This won't come into play until the paste operator is recognized as a unique token. llvm-svn: 142513
This commit is contained in:
parent
9ba42085da
commit
5c9fa026dc
|
@ -132,8 +132,44 @@ tgtok::TokKind TGLexer::LexToken() {
|
|||
return LexToken();
|
||||
case '-': case '+':
|
||||
case '0': case '1': case '2': case '3': case '4': case '5': case '6':
|
||||
case '7': case '8': case '9':
|
||||
case '7': case '8': case '9': {
|
||||
int NextChar = 0;
|
||||
if (isdigit(CurChar)) {
|
||||
// Allow identifiers to start with a number if it is followed by
|
||||
// an identifier. This can happen with paste operations like
|
||||
// foo#8i.
|
||||
int i = 0;
|
||||
do {
|
||||
NextChar = peekNextChar(i++);
|
||||
} while (isdigit(NextChar));
|
||||
|
||||
if (NextChar == 'x' || NextChar == 'b') {
|
||||
// If this is [0-9]b[01] or [0-9]x[0-9A-fa-f] this is most
|
||||
// likely a number.
|
||||
int NextNextChar = peekNextChar(i);
|
||||
switch (NextNextChar) {
|
||||
default:
|
||||
break;
|
||||
case '0': case '1':
|
||||
if (NextChar == 'b')
|
||||
return LexNumber();
|
||||
// Fallthrough
|
||||
case '2': case '3': case '4': case '5':
|
||||
case '6': case '7': case '8': case '9':
|
||||
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
|
||||
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
|
||||
if (NextChar == 'x')
|
||||
return LexNumber();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isalpha(NextChar) || NextChar == '_')
|
||||
return LexIdentifier();
|
||||
|
||||
return LexNumber();
|
||||
}
|
||||
case '"': return LexString();
|
||||
case '$': return LexVarName();
|
||||
case '[': return LexBracket();
|
||||
|
|
Loading…
Reference in New Issue