diff options
| -rw-r--r-- | llvm/lib/TableGen/TGLexer.cpp | 38 | 
1 files changed, 37 insertions, 1 deletions
diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp index c1b00b66ef5..3262121ee8d 100644 --- a/llvm/lib/TableGen/TGLexer.cpp +++ b/llvm/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();  | 

