From 9aa70d93aae89a9404a58f32f3fcd3c72b1ee56b Mon Sep 17 00:00:00 2001 From: Tim Peters 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