From 39017ef4d9c14184416222e9d2bfc523c6531ca8 Mon Sep 17 00:00:00 2001 From: Mateo Difranco <44856550+mateodif@users.noreply.github.com> Date: Tue, 7 Nov 2023 18:40:27 -0300 Subject: [PATCH] Add floating point literal scientific notation without dot "." (#57) * Add float scientific notation without dot * Add tests for BigFloat and Hex number types --- pkg/reader/reader.go | 16 +++++++++++----- pkg/reader/testdata/reader/bigfloat00.glj | 1 + pkg/reader/testdata/reader/bigfloat00.out | 1 + pkg/reader/testdata/reader/float00.glj | 4 ++++ pkg/reader/testdata/reader/float00.out | 4 ++++ pkg/reader/testdata/reader/hex00.glj | 2 ++ pkg/reader/testdata/reader/hex00.out | 2 ++ 7 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 pkg/reader/testdata/reader/float00.glj create mode 100644 pkg/reader/testdata/reader/float00.out create mode 100644 pkg/reader/testdata/reader/hex00.glj create mode 100644 pkg/reader/testdata/reader/hex00.out diff --git a/pkg/reader/reader.go b/pkg/reader/reader.go index 15cab9b..737620c 100644 --- a/pkg/reader/reader.go +++ b/pkg/reader/reader.go @@ -1014,9 +1014,10 @@ func (r *Reader) readSymbolicValue() (interface{}, error) { var ( numPrefixRegex = regexp.MustCompile(`^[-+]?([0-9]+|[1-9]+r)`) radixRegex = regexp.MustCompile(`^[-+]?([1-9]+)r(\d(\d|[a-zA-Z])*N?)$`) - intRegex = regexp.MustCompile(`^[-+]?\d(\d|[a-fA-F])*N?$`) + intRegex = regexp.MustCompile(`^[-+]?\d+N?$`) ratioRegex = regexp.MustCompile(`^[-+]?\d+\/\d+$`) hexRegex = regexp.MustCompile(`^[-+]?0[xX]([a-fA-F]|\d)*N?$`) + floatRegex = regexp.MustCompile(`^[-+]?(\d+\.\d*|\.\d+)([eE][-+]?\d+)?|[-+]?(\d+)([eE][-+]?\d+)$`) ) func isValidNumberCharacter(rn rune) bool { @@ -1110,12 +1111,17 @@ func (r *Reader) readNumber(numStr string) (interface{}, error) { return bd, nil } - num, err := strconv.ParseFloat(numStr, 64) - if err != nil { - return nil, r.error("invalid number: %s", numStr) + if floatRegex.MatchString(numStr) { + num, err := strconv.ParseFloat(numStr, 64) + if err != nil { + return nil, r.error("invalid number: %s", numStr) + } + + return num, nil } - return num, nil + return nil, r.error("invalid number: %s", numStr) + } func (r *Reader) readSymbol() (ret interface{}, retErr error) { diff --git a/pkg/reader/testdata/reader/bigfloat00.glj b/pkg/reader/testdata/reader/bigfloat00.glj index 8bfa566..ae8725a 100644 --- a/pkg/reader/testdata/reader/bigfloat00.glj +++ b/pkg/reader/testdata/reader/bigfloat00.glj @@ -1 +1,2 @@ 0M +2.0M \ No newline at end of file diff --git a/pkg/reader/testdata/reader/bigfloat00.out b/pkg/reader/testdata/reader/bigfloat00.out index 8bfa566..b32fde3 100644 --- a/pkg/reader/testdata/reader/bigfloat00.out +++ b/pkg/reader/testdata/reader/bigfloat00.out @@ -1 +1,2 @@ 0M +2M diff --git a/pkg/reader/testdata/reader/float00.glj b/pkg/reader/testdata/reader/float00.glj new file mode 100644 index 0000000..f4d84b7 --- /dev/null +++ b/pkg/reader/testdata/reader/float00.glj @@ -0,0 +1,4 @@ +1E10 +12E3 +12E-3 +1.35e-12 diff --git a/pkg/reader/testdata/reader/float00.out b/pkg/reader/testdata/reader/float00.out new file mode 100644 index 0000000..14f6e0e --- /dev/null +++ b/pkg/reader/testdata/reader/float00.out @@ -0,0 +1,4 @@ +10000000000.0 +12000.0 +0.012 +0.00000000000135 diff --git a/pkg/reader/testdata/reader/hex00.glj b/pkg/reader/testdata/reader/hex00.glj new file mode 100644 index 0000000..2013e6a --- /dev/null +++ b/pkg/reader/testdata/reader/hex00.glj @@ -0,0 +1,2 @@ +0x123 +010 \ No newline at end of file diff --git a/pkg/reader/testdata/reader/hex00.out b/pkg/reader/testdata/reader/hex00.out new file mode 100644 index 0000000..8bd9096 --- /dev/null +++ b/pkg/reader/testdata/reader/hex00.out @@ -0,0 +1,2 @@ +291 +8