diff options
author | David Greene <greened@obbligato.org> | 2011-10-19 13:03:39 +0000 |
---|---|---|
committer | David Greene <greened@obbligato.org> | 2011-10-19 13:03:39 +0000 |
commit | 7efe93625183a52733c23adc02c5c9c4337a7970 (patch) | |
tree | 371d27c2380f4a8ec09204e04cd07750abd2dc94 /lib/TableGen | |
parent | a761f92cd38572dd65cc995c5f59b9c2c0f51068 (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142513 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/TableGen')
-rw-r--r-- | lib/TableGen/TGLexer.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/lib/TableGen/TGLexer.cpp b/lib/TableGen/TGLexer.cpp index c1b00b66ef..3262121ee8 100644 --- a/lib/TableGen/TGLexer.cpp +++ b/lib/TableGen/TGLexer.cpp @@ -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(); |