aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/ASTMatchers/Dynamic/Parser.cpp
diff options
context:
space:
mode:
authorSamuel Benzaquen <sbenza@google.com>2013-06-04 15:46:22 +0000
committerSamuel Benzaquen <sbenza@google.com>2013-06-04 15:46:22 +0000
commitc31b3524cb60481f1746c1faa1cb5eb31c04c0df (patch)
tree755b7a9a7d713ad9b08153249c263a94f4d1866f /clang/lib/ASTMatchers/Dynamic/Parser.cpp
parent16522c01dca90d70c5888d78eae3d4014e42e9d1 (diff)
downloadllvm-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.cpp35
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