[llvm-commits] [llvm] r114718 - in /llvm/trunk: include/llvm/MC/MCParser/MCAsmLexer.h lib/MC/MCParser/AsmLexer.cpp tools/llvm-mc/llvm-mc.cpp
Daniel Dunbar
daniel at zuster.org
Thu Sep 23 18:59:31 PDT 2010
Author: ddunbar
Date: Thu Sep 23 20:59:31 2010
New Revision: 114718
URL: http://llvm.org/viewvc/llvm-project?rev=114718&view=rev
Log:
MC/Lexer: Add 'Real' token type for floating point literals.
Modified:
llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h
llvm/trunk/lib/MC/MCParser/AsmLexer.cpp
llvm/trunk/tools/llvm-mc/llvm-mc.cpp
Modified: llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h?rev=114718&r1=114717&r2=114718&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h (original)
+++ llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h Thu Sep 23 20:59:31 2010
@@ -33,6 +33,9 @@
// Integer values.
Integer,
+ // Real values.
+ Real,
+
// Register values (stored in IntVal). Only used by TargetAsmLexer.
Register,
Modified: llvm/trunk/lib/MC/MCParser/AsmLexer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmLexer.cpp?rev=114718&r1=114717&r2=114718&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmLexer.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmLexer.cpp Thu Sep 23 20:59:31 2010
@@ -65,9 +65,21 @@
}
/// LexIdentifier: [a-zA-Z_.][a-zA-Z0-9_$.@]*
+static bool IsIdentifierChar(char c) {
+ return isalnum(c) || c == '_' || c == '$' || c == '.' || c == '@';
+}
AsmToken AsmLexer::LexIdentifier() {
- while (isalnum(*CurPtr) || *CurPtr == '_' || *CurPtr == '$' ||
- *CurPtr == '.' || *CurPtr == '@')
+ // Check for floating point literals.
+ if (CurPtr[-1] == '.' && isdigit(*CurPtr)) {
+ while (isdigit(*CurPtr))
+ ++CurPtr;
+ if (!IsIdentifierChar(*CurPtr)) {
+ return AsmToken(AsmToken::Real,
+ StringRef(TokStart, CurPtr - TokStart));
+ }
+ }
+
+ while (IsIdentifierChar(*CurPtr))
++CurPtr;
// Handle . as a special case.
@@ -124,7 +136,6 @@
CurPtr += 3;
}
-
/// LexDigit: First character is [0-9].
/// Local Label: [0-9][:]
/// Forward/Backward Label: [0-9][fb]
@@ -132,13 +143,21 @@
/// Octal integer: 0[0-7]+
/// Hex integer: 0x[0-9a-fA-F]+
/// Decimal integer: [1-9][0-9]*
-/// TODO: FP literal.
AsmToken AsmLexer::LexDigit() {
// Decimal integer: [1-9][0-9]*
if (CurPtr[-1] != '0') {
while (isdigit(*CurPtr))
++CurPtr;
-
+
+ // Check for floating point literals.
+ if (*CurPtr == '.') {
+ ++CurPtr;
+ while (isdigit(*CurPtr))
+ ++CurPtr;
+
+ return AsmToken(AsmToken::Real, StringRef(TokStart, CurPtr - TokStart));
+ }
+
StringRef Result(TokStart, CurPtr - TokStart);
long long Value;
Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=114718&r1=114717&r2=114718&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
+++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Thu Sep 23 20:59:31 2010
@@ -208,6 +208,9 @@
case AsmToken::Integer:
Out->os() << "int: " << Lexer.getTok().getString() << '\n';
break;
+ case AsmToken::Real:
+ Out->os() << "real: " << Lexer.getTok().getString() << '\n';
+ break;
case AsmToken::Register:
Out->os() << "register: " << Lexer.getTok().getRegVal() << '\n';
break;
More information about the llvm-commits
mailing list