22 const char *Begin = Token.getLiteralData();
23 const char *End = Begin + Token.getLength();
26 if (Token.getLength() > 2 && Begin[0] ==
'0' && std::toupper(Begin[1]) ==
'X')
27 return std::none_of(Begin + 2, End, [](
char C) {
28 return C ==
'.' || std::toupper(
C) ==
'P';
32 return std::none_of(Begin, End, [](
char C) {
33 return C ==
'.' || std::toupper(
C) ==
'E' || std::toupper(
C) ==
'I';
37bool IntegralLiteralExpressionMatcher::advance() {
39 return Current != End;
42bool IntegralLiteralExpressionMatcher::consume(tok::TokenKind
Kind) {
43 if (Current->is(
Kind)) {
51bool IntegralLiteralExpressionMatcher::nonTerminalChainedExpr(
52 bool (IntegralLiteralExpressionMatcher::*NonTerminal)(),
53 const std::function<
bool(Token)> &IsKind) {
54 if (!(this->*NonTerminal)())
59 while (Current != End) {
60 if (!IsKind(*Current))
66 if (!(this->*NonTerminal)())
74bool IntegralLiteralExpressionMatcher::unaryOperator() {
75 if (Current->isOneOf(tok::TokenKind::minus, tok::TokenKind::plus,
76 tok::TokenKind::tilde, tok::TokenKind::exclaim)) {
84 unsigned int Length = Tok.getLength();
88 bool SeenUnsigned =
false;
89 bool SeenLong =
false;
90 bool SeenLongLong =
false;
91 const char *
Text = Tok.getLiteralData();
92 for (
unsigned int End =
Length - 1; End > 0; --End) {
93 if (std::isdigit(
Text[End]))
96 if (std::toupper(
Text[End]) ==
'U')
98 else if (std::toupper(
Text[End]) ==
'L') {
124 return static_cast<int>(LHS) <
static_cast<int>(RHS);
127bool IntegralLiteralExpressionMatcher::unaryExpr() {
128 if (!unaryOperator())
131 if (consume(tok::TokenKind::l_paren)) {
141 return consume(tok::TokenKind::r_paren);
144 if (!Current->isLiteral() || isStringLiteral(Current->getKind()) ||
155bool IntegralLiteralExpressionMatcher::multiplicativeExpr() {
156 return nonTerminalChainedExpr<tok::TokenKind::star, tok::TokenKind::slash,
157 tok::TokenKind::percent>(
158 &IntegralLiteralExpressionMatcher::unaryExpr);
161bool IntegralLiteralExpressionMatcher::additiveExpr() {
162 return nonTerminalChainedExpr<tok::plus, tok::minus>(
163 &IntegralLiteralExpressionMatcher::multiplicativeExpr);
166bool IntegralLiteralExpressionMatcher::shiftExpr() {
167 return nonTerminalChainedExpr<tok::TokenKind::lessless,
168 tok::TokenKind::greatergreater>(
169 &IntegralLiteralExpressionMatcher::additiveExpr);
172bool IntegralLiteralExpressionMatcher::compareExpr() {
178 if (Current->is(tok::TokenKind::spaceship)) {
189bool IntegralLiteralExpressionMatcher::relationalExpr() {
190 return nonTerminalChainedExpr<tok::TokenKind::less, tok::TokenKind::greater,
191 tok::TokenKind::lessequal,
192 tok::TokenKind::greaterequal>(
193 &IntegralLiteralExpressionMatcher::compareExpr);
196bool IntegralLiteralExpressionMatcher::equalityExpr() {
197 return nonTerminalChainedExpr<tok::TokenKind::equalequal,
198 tok::TokenKind::exclaimequal>(
199 &IntegralLiteralExpressionMatcher::relationalExpr);
202bool IntegralLiteralExpressionMatcher::andExpr() {
203 return nonTerminalChainedExpr<tok::TokenKind::amp>(
204 &IntegralLiteralExpressionMatcher::equalityExpr);
207bool IntegralLiteralExpressionMatcher::exclusiveOrExpr() {
208 return nonTerminalChainedExpr<tok::TokenKind::caret>(
209 &IntegralLiteralExpressionMatcher::andExpr);
212bool IntegralLiteralExpressionMatcher::inclusiveOrExpr() {
213 return nonTerminalChainedExpr<tok::TokenKind::pipe>(
214 &IntegralLiteralExpressionMatcher::exclusiveOrExpr);
217bool IntegralLiteralExpressionMatcher::logicalAndExpr() {
218 return nonTerminalChainedExpr<tok::TokenKind::ampamp>(
219 &IntegralLiteralExpressionMatcher::inclusiveOrExpr);
222bool IntegralLiteralExpressionMatcher::logicalOrExpr() {
223 return nonTerminalChainedExpr<tok::TokenKind::pipepipe>(
224 &IntegralLiteralExpressionMatcher::logicalAndExpr);
227bool IntegralLiteralExpressionMatcher::conditionalExpr() {
228 if (!logicalOrExpr())
233 if (Current->is(tok::TokenKind::question)) {
238 if (Current->is(tok::TokenKind::colon)) {
253 if (!Current->is(tok::TokenKind::colon))
265bool IntegralLiteralExpressionMatcher::commaExpr() {
266 auto Pred = CommaAllowed
267 ? std::function<bool(Token)>(
268 [](Token Tok) {
return Tok.is(tok::TokenKind::comma); })
269 : std::function<
bool(Token)>([](Token) {
return false; });
270 return nonTerminalChainedExpr(
271 &IntegralLiteralExpressionMatcher::conditionalExpr, Pred);
274bool IntegralLiteralExpressionMatcher::expr() {
return commaExpr(); }
279 return conditionalExpr() && Current == End;
LiteralSize largestLiteralSize() const
static bool isIntegralConstant(const Token &Token)
static LiteralSize literalTokenSize(const Token &Tok)
static bool operator<(LiteralSize LHS, LiteralSize RHS)