From 9aa70d93aae89a9404a58f32f3fcd3c72b1ee56b Mon Sep 17 00:00:00 2001
From: Tim Peters <tim.peters@gmail.com>
Date: Mon, 27 Aug 2001 19:19:28 +0000
Subject: SF bug [#455775] float parsing discrepancy. PyTokenizer_Get:  error
 if exponent contains no digits (3e, 2.0e+, ...).

---
 Lib/test/test_compile.py | 15 +++++++++++++++
 Parser/tokenizer.c       | 13 ++++++++-----
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 17d3500..0276ba6 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -50,3 +50,18 @@ try:
     raise TestFailed, "non-default args after default"
 except SyntaxError:
     pass
+
+if verbose:
+    print "testing bad float literals"
+
+def expect_error(s):
+    try:
+        eval(s)
+        raise TestFailed("%r accepted" % s)
+    except SyntaxError:
+        pass
+
+expect_error("2e")
+expect_error("2.0e+")
+expect_error("1e-")
+expect_error("3-4e/21")
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 2397969..7270629 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -756,9 +756,7 @@ PyTokenizer_Get(register struct tok_state *tok, char **p_start,
 			if (c == 'l' || c == 'L')
 				c = tok_nextc(tok);
 			else {
-				/* Accept floating point numbers.
-				   XXX This accepts incomplete things like
-				   XXX 12e or 1e+; worry run-time */
+				/* Accept floating point numbers. */
 				if (c == '.') {
 		fraction:
 					/* Fraction */
@@ -771,9 +769,14 @@ PyTokenizer_Get(register struct tok_state *tok, char **p_start,
 					c = tok_nextc(tok);
 					if (c == '+' || c == '-')
 						c = tok_nextc(tok);
-					while (isdigit(c)) {
-						c = tok_nextc(tok);
+					if (!isdigit(c)) {
+						tok->done = E_TOKEN;
+						tok_backup(tok, c);
+						return ERRORTOKEN;
 					}
+					do {
+						c = tok_nextc(tok);
+					} while (isdigit(c));
 				}
 #ifndef WITHOUT_COMPLEX
 				if (c == 'j' || c == 'J')
-- 
cgit v0.12

