24 AsmLexer::AsmLexer(
const MCAsmInfo &_MAI) : MAI(_MAI) {
27 isAtStartOfLine =
true;
46 AsmToken AsmLexer::ReturnError(
const char *Loc,
const std::string &Msg) {
52 int AsmLexer::getNextChar() {
53 char CurChar = *CurPtr++;
56 return (
unsigned char)CurChar;
74 AsmToken AsmLexer::LexFloatLiteral() {
82 if (*CurPtr ==
'e' || *CurPtr ==
'E') {
84 if (*CurPtr ==
'-' || *CurPtr ==
'+')
100 AsmToken AsmLexer::LexHexFloatLiteral(
bool NoIntDigits) {
101 assert((*CurPtr ==
'p' || *CurPtr ==
'P' || *CurPtr ==
'.') &&
102 "unexpected parse state in floating hex");
103 bool NoFracDigits =
true;
106 if (*CurPtr ==
'.') {
109 const char *FracStart = CurPtr;
110 while (isxdigit(*CurPtr))
113 NoFracDigits = CurPtr == FracStart;
116 if (NoIntDigits && NoFracDigits)
117 return ReturnError(
TokStart,
"invalid hexadecimal floating-point constant: "
118 "expected at least one significand digit");
121 if (*CurPtr !=
'p' && *CurPtr !=
'P')
122 return ReturnError(
TokStart,
"invalid hexadecimal floating-point constant: "
123 "expected exponent part 'p'");
126 if (*CurPtr ==
'+' || *CurPtr ==
'-')
130 const char *ExpStart = CurPtr;
134 if (CurPtr == ExpStart)
135 return ReturnError(
TokStart,
"invalid hexadecimal floating-point constant: "
136 "expected at least one exponent digit");
143 return isalnum(c) || c ==
'_' || c ==
'$' || c ==
'.' || c ==
'@' || c ==
'?';
145 AsmToken AsmLexer::LexIdentifier() {
147 if (CurPtr[-1] ==
'.' &&
isdigit(*CurPtr)) {
152 return LexFloatLiteral();
170 case '/':
return ++CurPtr, LexLineComment();
177 int CurChar = getNextChar();
180 return ReturnError(
TokStart,
"unterminated comment");
183 if (CurPtr[0] !=
'/')
break;
193 AsmToken AsmLexer::LexLineComment() {
196 int CurChar = getNextChar();
197 while (CurChar !=
'\n' && CurChar !=
'\r' && CurChar != EOF)
198 CurChar = getNextChar();
207 if (CurPtr[0] ==
'U')
209 if (CurPtr[0] ==
'L')
211 if (CurPtr[0] ==
'L')
217 static unsigned doLookAhead(
const char *&CurPtr,
unsigned DefaultRadix) {
218 const char *FirstHex = 0;
219 const char *LookAhead = CurPtr;
223 }
else if (isxdigit(*LookAhead)) {
225 FirstHex = LookAhead;
231 bool isHex = *LookAhead ==
'h' || *LookAhead ==
'H';
232 CurPtr = isHex || !FirstHex ? LookAhead : FirstHex;
247 if (CurPtr[-1] !=
'0' || CurPtr[0] ==
'.') {
249 bool isHex = Radix == 16;
251 if (!isHex && (*CurPtr ==
'.' || *CurPtr ==
'e')) {
253 return LexFloatLiteral();
259 if (Result.getAsInteger(Radix, Value)) {
262 unsigned long long UValue;
263 if (Result.getAsInteger(Radix, UValue))
264 return ReturnError(
TokStart, !isHex ?
"invalid decimal number" :
265 "invalid hexdecimal number");
266 Value = (
long long)UValue;
270 if (Radix == 2 || Radix == 16)
280 if (*CurPtr ==
'b') {
288 const char *NumStart = CurPtr;
289 while (CurPtr[0] ==
'0' || CurPtr[0] ==
'1')
293 if (CurPtr == NumStart)
294 return ReturnError(
TokStart,
"invalid binary number");
299 if (Result.substr(2).getAsInteger(2, Value))
300 return ReturnError(
TokStart,
"invalid binary number");
309 if (*CurPtr ==
'x') {
311 const char *NumStart = CurPtr;
312 while (isxdigit(CurPtr[0]))
317 if (CurPtr[0] ==
'.' || CurPtr[0] ==
'p' || CurPtr[0] ==
'P')
318 return LexHexFloatLiteral(NumStart == CurPtr);
321 if (CurPtr == NumStart)
322 return ReturnError(CurPtr-2,
"invalid hexadecimal number");
324 unsigned long long Result;
326 return ReturnError(
TokStart,
"invalid hexadecimal number");
329 if (*CurPtr ==
'h' || *CurPtr ==
'H')
343 bool isHex = Radix == 16;
345 if (Result.getAsInteger(Radix, Value))
346 return ReturnError(
TokStart, !isHex ?
"invalid octal number" :
347 "invalid hexdecimal number");
361 AsmToken AsmLexer::LexSingleQuote() {
362 int CurChar = getNextChar();
365 CurChar = getNextChar();
368 return ReturnError(
TokStart,
"unterminated single quote");
370 CurChar = getNextChar();
373 return ReturnError(
TokStart,
"single quote way too long");
381 char theChar = Res[2];
383 default: Value = theChar;
break;
384 case '\'': Value =
'\'';
break;
385 case 't': Value =
'\t';
break;
386 case 'n': Value =
'\n';
break;
387 case 'b': Value =
'\b';
break;
398 int CurChar = getNextChar();
400 while (CurChar !=
'"') {
401 if (CurChar ==
'\\') {
403 CurChar = getNextChar();
407 return ReturnError(
TokStart,
"unterminated string constant");
409 CurChar = getNextChar();
431 while (*CurPtr !=
'\n' &&
452 int CurChar = getNextChar();
458 if (CurChar ==
'#' && isAtStartOfLine)
460 isAtStartOfLine =
true;
461 return LexLineComment();
471 if (CurChar == EOF && !isAtStartOfLine) {
472 isAtStartOfLine =
true;
476 isAtStartOfLine =
false;
480 if (isalpha(CurChar) || CurChar ==
'_' || CurChar ==
'.')
481 return LexIdentifier();
484 return ReturnError(
TokStart,
"invalid character in input");
494 while (*CurPtr==
' ' || *CurPtr==
'\t') {
502 isAtStartOfLine =
true;
537 case '/':
return LexSlash();
539 case '\'':
return LexSingleQuote();
540 case '"':
return LexQuote();
541 case '0':
case '1':
case '2':
case '3':
case '4':
542 case '5':
case '6':
case '7':
case '8':
case '9':
static bool IsIdentifierChar(char c)
LexIdentifier: [a-zA-Z_.][a-zA-Z0-9_$.@?]*.
const char * getBufferStart() const
virtual AsmToken LexToken()
LexToken - Read the next token and return its code.
virtual StringRef LexUntilEndOfStatement()
AsmToken - Target independent representation for an assembler token.
StringRef LexUntilEndOfLine()
bool isAtStatementSeparator(const char *Ptr)
bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
size_t strlen(const char *s);
static unsigned doLookAhead(const char *&CurPtr, unsigned DefaultRadix)
static SMLoc getFromPointer(const char *Ptr)
void setBuffer(const MemoryBuffer *buf, const char *ptr=NULL)
const char * getSeparatorString() const
void SetError(const SMLoc &errLoc, const std::string &err)
const char * getBufferEnd() const
LLVM Value Representation.
static void SkipIgnoredIntegerSuffix(const char *&CurPtr)
int strncmp(const char *s1, const char *s2, size_t n);
bool isAtStartOfComment(char Char)
const char * getCommentString() const