From 1a04bc1124e8c20262babafe56ce0b9cd84e8680 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 1 Sep 2009 21:14:26 -0500 Subject: [PATCH] require numeric literals to begin and end with a digit/decimal point so that stuff like "," and "1," don't parse as numbers --- core/math/parser/parser-tests.factor | 17 +++++++++++------ core/math/parser/parser.factor | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/core/math/parser/parser-tests.factor b/core/math/parser/parser-tests.factor index 2b440b24d4..1ee3f9d220 100644 --- a/core/math/parser/parser-tests.factor +++ b/core/math/parser/parser-tests.factor @@ -25,13 +25,18 @@ unit-test [ "e" string>number ] unit-test -[ 100000 ] -[ "100,000" string>number ] -unit-test +[ 100000 ] [ "100,000" string>number ] unit-test -[ 100000.0 ] -[ "100,000.0" string>number ] -unit-test +[ 100000.0 ] [ "100,000.0" string>number ] unit-test + +[ f ] [ "," string>number ] unit-test +[ f ] [ "-," string>number ] unit-test +[ f ] [ "1," string>number ] unit-test +[ f ] [ "-1," string>number ] unit-test +[ f ] [ ",2" string>number ] unit-test +[ f ] [ "-,2" string>number ] unit-test + +[ 2.0 ] [ "2." string>number ] unit-test [ "100.0" ] [ "1.0e2" string>number number>string ] diff --git a/core/math/parser/parser.factor b/core/math/parser/parser.factor index 21062baf4b..21fbf5f186 100644 --- a/core/math/parser/parser.factor +++ b/core/math/parser/parser.factor @@ -86,16 +86,27 @@ SYMBOL: negative? [ CHAR: , eq? not ] filter >byte-array 0 suffix (string>float) ; +: number-char? ( char -- ? ) + "0123456789." member? ; + +: numeric-looking? ( str -- ? ) + "-" ?head drop + dup empty? [ drop f ] [ + dup first number-char? [ + last number-char? + ] [ drop f ] if + ] if ; + PRIVATE> : base> ( str radix -- n/f ) - over empty? [ 2drop f ] [ + over numeric-looking? [ over [ "/." member? ] find nip { { CHAR: / [ string>ratio ] } { CHAR: . [ drop string>float ] } [ drop string>integer ] } case - ] if ; + ] [ 2drop f ] if ; : string>number ( str -- n/f ) 10 base> ; : bin> ( str -- n/f ) 2 base> ;