[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