14#ifndef LLVM_CLANG_LEX_LITERALSUPPORT_H
15#define LLVM_CLANG_LEX_LITERALSUPPORT_H
20#include "llvm/ADT/APFloat.h"
21#include "llvm/ADT/ArrayRef.h"
22#include "llvm/ADT/SmallString.h"
23#include "llvm/ADT/StringRef.h"
24#include "llvm/Support/DataTypes.h"
28class DiagnosticsEngine;
37void expandUCNs(SmallVectorImpl<char> &Buf, StringRef Input);
56 const char *
const ThisTokBegin;
57 const char *
const ThisTokEnd;
58 const char *DigitsBegin, *SuffixBegin;
63 bool saw_exponent, saw_period, saw_ud_suffix, saw_fixed_point_suffix;
89 return (saw_period || saw_exponent) && saw_fixed_point_suffix;
100 return saw_ud_suffix;
103 assert(saw_ud_suffix);
107 assert(saw_ud_suffix);
108 return SuffixBegin - ThisTokBegin;
124 llvm::RoundingMode RM);
135 assert(!
hadError &&
"cannot reliably get the literal digits with an error");
136 return StringRef(DigitsBegin, SuffixBegin - DigitsBegin);
144 static bool isDigitSeparator(
char C) {
return C ==
'\''; }
148 bool containsDigits(
const char *Start,
const char *End) {
149 return Start != End && (Start + 1 != End || !isDigitSeparator(Start[0]));
152 enum CheckSeparatorKind { CSK_BeforeDigits, CSK_AfterDigits };
155 void checkSeparator(SourceLocation TokLoc,
const char *Pos,
156 CheckSeparatorKind IsAfterDigits);
160 const char *SkipHexDigits(
const char *ptr) {
161 while (ptr != ThisTokEnd && (
isHexDigit(*ptr) || isDigitSeparator(*ptr)))
168 const char *SkipOctalDigits(
const char *ptr) {
169 while (ptr != ThisTokEnd &&
170 ((*ptr >=
'0' && *ptr <=
'7') || isDigitSeparator(*ptr)))
177 const char *SkipDigits(
const char *ptr) {
178 while (ptr != ThisTokEnd && (
isDigit(*ptr) || isDigitSeparator(*ptr)))
185 const char *SkipBinaryDigits(
const char *ptr) {
186 while (ptr != ThisTokEnd &&
187 (*ptr ==
'0' || *ptr ==
'1' || isDigitSeparator(*ptr)))