Patchwork Go patch committed: Correct exponent lexing

login
register
mail settings
Submitter Ian Taylor
Date Dec. 21, 2010, 6:51 p.m.
Message ID <mcrd3ovm01n.fsf@google.com>
Download mbox | patch
Permalink /patch/76315/
State New
Headers show

Comments

Ian Taylor - Dec. 21, 2010, 6:51 p.m.
This patch to the Go frontend corrects the lexing of exponents in
floating point numbers.  An exponent requires at least one decimal
digit after an optional sign.  Bootstrapped and ran Go testsuite on
x86_64-unknown-linux-gnu.  Committed to mainline.

Ian

Patch

diff -r 5e30b192004f go/lex.cc
--- a/go/lex.cc	Tue Dec 21 10:30:04 2010 -0800
+++ b/go/lex.cc	Tue Dec 21 10:48:10 2010 -0800
@@ -931,6 +931,25 @@ 
 	  || (c >= 'a' && c <= 'f'));
 }
 
+// Return whether an exponent could start at P.
+
+bool
+Lex::could_be_exponent(const char* p, const char* pend)
+{
+  if (*p != 'e' && *p != 'E')
+    return false;
+  ++p;
+  if (p >= pend)
+    return false;
+  if (*p == '+' || *p == '-')
+    {
+      ++p;
+      if (p >= pend)
+	return false;
+    }
+  return *p >= '0' && *p <= '9';
+}
+
 // Pick up a number.
 
 Token
@@ -980,7 +999,7 @@ 
 	    }
 	}
 
-      if (*p != '.' && *p != 'e' && *p != 'E' && *p != 'i')
+      if (*p != '.' && *p != 'i' && !Lex::could_be_exponent(p, pend))
 	{
 	  std::string s(pnum, p - pnum);
 	  mpz_t val;
@@ -1004,7 +1023,7 @@ 
       ++p;
     }
 
-  if (*p != '.' && *p != 'E' && *p != 'e' && *p != 'i')
+  if (*p != '.' && *p != 'i' && !Lex::could_be_exponent(p, pend))
     {
       std::string s(pnum, p - pnum);
       mpz_t val;
@@ -1039,7 +1058,7 @@ 
 	  ++p;
 	}
 
-      if (dot && (*p == 'E' || *p == 'e'))
+      if (dot && Lex::could_be_exponent(p, pend))
 	{
 	  ++p;
 	  if (*p == '+' || *p == '-')
diff -r 5e30b192004f go/lex.h
--- a/go/lex.h	Tue Dec 21 10:30:04 2010 -0800
+++ b/go/lex.h	Tue Dec 21 10:48:10 2010 -0800
@@ -379,6 +379,9 @@ 
   Token
   gather_identifier();
 
+  static bool
+  could_be_exponent(const char*, const char*);
+
   Token
   gather_number();