From 4475e6832daaa287f69d8da2ebb88c386dd83ad5 Mon Sep 17 00:00:00 2001 From: mstream Date: Sat, 29 Apr 2023 12:07:05 +0100 Subject: [PATCH 1/2] Makes "float" parser of GenTokenParser parse negative numbers. Resolves #115 --- CHANGELOG.md | 1 + src/Parsing/Token.purs | 9 ++++++--- test/Main.purs | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99db87c..aa272ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Notable changes to this project are documented in this file. The format is based ## [Unreleased] Bugfixes: +- `float` parser of `GenTokenParser` does not parse negative numbers (by @mstream) Breaking changes: diff --git a/src/Parsing/Token.purs b/src/Parsing/Token.purs index 347ff9f..08802c2 100644 --- a/src/Parsing/Token.purs +++ b/src/Parsing/Token.purs @@ -34,7 +34,7 @@ import Data.Int (toNumber) import Data.List (List(..)) import Data.List as List import Data.List.NonEmpty (NonEmptyList) -import Data.Maybe (Maybe(..), maybe) +import Data.Maybe (Maybe(..), fromMaybe, maybe) import Data.Number (pow) import Data.String (null, toLower) import Data.String.CodePoints (codePointFromChar) @@ -43,7 +43,7 @@ import Data.String.CodeUnits as SCU import Data.String.Unicode as Unicode import Data.Tuple (Tuple(..)) import Parsing (ParseState(..), ParserT, Position, consume, fail, getParserT, stateParserT) -import Parsing.Combinators (between, choice, notFollowedBy, option, sepBy, sepBy1, skipMany, skipMany1, try, tryRethrow, (), ()) +import Parsing.Combinators (between, choice, notFollowedBy, option, optionMaybe, sepBy, sepBy1, skipMany, skipMany1, try, tryRethrow, (), ()) import Parsing.String (char, satisfy, satisfyCodePoint, string) import Parsing.String.Basic (alphaNum, digit, hexDigit, letter, noneOf, octDigit, oneOf, space, upper) import Parsing.String.Basic as Basic @@ -608,7 +608,10 @@ makeTokenParser (LanguageDef languageDef) = -- floats floating :: ParserT String m Number - floating = decimal >>= fractExponent + floating = do + f <- fromMaybe identity <$> optionMaybe sign + x <- decimal >>= fractExponent + pure $ f x natFloat :: ParserT String m (Either Int Number) natFloat = char '0' *> zeroNumFloat diff --git a/test/Main.purs b/test/Main.purs index bdcb188..02ec89c 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -392,6 +392,9 @@ tokenParserFloatTest = do -- parse float parseTest "100.5" 100.5 testTokenParser.float + -- parse a negative float + parseTest "-100.5" (-100.5) testTokenParser.float + -- parse float with exponent parseTest "100e1" 1000.0 testTokenParser.float From c425c21368214aaa1ac858ab35aa58d57eabd7ec Mon Sep 17 00:00:00 2001 From: mstream Date: Sat, 29 Apr 2023 12:48:32 +0100 Subject: [PATCH 2/2] Provide more sign-related tests for the `float` parser --- test/Main.purs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/Main.purs b/test/Main.purs index 02ec89c..a204298 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -392,6 +392,9 @@ tokenParserFloatTest = do -- parse float parseTest "100.5" 100.5 testTokenParser.float + -- parse float prefixed with a plus sign + parseTest "+100.5" 100.5 testTokenParser.float + -- parse a negative float parseTest "-100.5" (-100.5) testTokenParser.float @@ -401,6 +404,9 @@ tokenParserFloatTest = do -- parse float with exponent parseTest "100.5e1" 1005.0 testTokenParser.float + -- parse a negative float with exponent + parseTest "-100.5e1" (-1005.0) testTokenParser.float + -- fail on nonfloat parseErrorTestPosition testTokenParser.float "100.e1" $ mkPos 5