diff options
author | Samuel Benzaquen <sbenza@google.com> | 2013-06-04 15:46:22 +0000 |
---|---|---|
committer | Samuel Benzaquen <sbenza@google.com> | 2013-06-04 15:46:22 +0000 |
commit | c31b3524cb60481f1746c1faa1cb5eb31c04c0df (patch) | |
tree | 755b7a9a7d713ad9b08153249c263a94f4d1866f /clang/lib/ASTMatchers/Dynamic/Parser.cpp | |
parent | 16522c01dca90d70c5888d78eae3d4014e42e9d1 (diff) | |
download | llvm-c31b3524cb60481f1746c1faa1cb5eb31c04c0df.zip llvm-c31b3524cb60481f1746c1faa1cb5eb31c04c0df.tar.gz llvm-c31b3524cb60481f1746c1faa1cb5eb31c04c0df.tar.bz2 |
Parser/Registry argument enhancements.
Summary:
Parser/Registry argument enhancements.
- 2 argument support.
- unsigned values support.
Reviewers: klimek
CC: cfe-commits, revane
Differential Revision: http://llvm-reviews.chandlerc.com/D915
llvm-svn: 183231
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/Parser.cpp')
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Parser.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Parser.cpp b/clang/lib/ASTMatchers/Dynamic/Parser.cpp index 1ed40f3..eff50f4 100644 --- a/clang/lib/ASTMatchers/Dynamic/Parser.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Parser.cpp @@ -112,6 +112,12 @@ private: consumeStringLiteral(&Result); break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + // Parse an unsigned literal. + consumeUnsignedLiteral(&Result); + break; + default: if (isAlphanumeric(Code[0])) { // Parse an identifier @@ -133,6 +139,35 @@ private: return Result; } + /// \brief Consume an unsigned literal. + void consumeUnsignedLiteral(TokenInfo *Result) { + unsigned Length = 1; + if (Code.size() > 1) { + // Consume the 'x' or 'b' radix modifier, if present. + switch (toLowercase(Code[1])) { + case 'x': case 'b': Length = 2; + } + } + while (Length < Code.size() && isHexDigit(Code[Length])) + ++Length; + + Result->Text = Code.substr(0, Length); + Code = Code.drop_front(Length); + + unsigned Value; + if (!Result->Text.getAsInteger(0, Value)) { + Result->Kind = TokenInfo::TK_Literal; + Result->Value = Value; + } else { + SourceRange Range; + Range.Start = Result->Range.Start; + Range.End = currentLocation(); + Error->pushErrorFrame(Range, Error->ET_ParserUnsignedError) + << Result->Text; + Result->Kind = TokenInfo::TK_Error; + } + } + /// \brief Consume a string literal. /// /// \c Code must be positioned at the start of the literal (the opening |