feat: implement floating-point number literal parsing and arithmetic operations
Add support for floating-point number literals in the parser by detecting decimal points with trailing digits in `readNumber()`, and switch the compiler's `number()` function from `strtol` to `strtod` for proper double conversion. Update the `num_abs` primitive to use `fabs()` instead of manual negation. Extend test coverage across arithmetic, comparison, equality, modulus, and string conversion tests with floating-point cases, and add a new test for decimal point at end-of-file error detection.
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
// expect error line 2
|
||||
123.
|
||||
@@ -2,5 +2,5 @@ io.write(123.abs) // expect: 123
|
||||
io.write(-123.abs) // expect: 123
|
||||
io.write(0.abs) // expect: 0
|
||||
io.write(-0.abs) // expect: 0
|
||||
|
||||
// TODO(bob): Floating point numbers.
|
||||
io.write(-0.12.abs) // expect: 0.12
|
||||
io.write(12.34.abs) // expect: 12.34
|
||||
|
||||
@@ -15,3 +15,4 @@ io.write(2 >= 2) // expect: true
|
||||
io.write(2 >= 1) // expect: true
|
||||
|
||||
// TODO(bob): Wrong type for RHS.
|
||||
// TODO(bob): Comparing zero and negative zero.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
io.write(8 / 2) // expect: 4
|
||||
io.write(8 / 2) // expect: 4
|
||||
io.write(12.34 / -0.4) // expect: -30.85
|
||||
|
||||
// TODO(bob): Floating point numbers.
|
||||
// TODO(bob): Unsupported RHS types.
|
||||
// TODO(bob): Divide by zero.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
io.write(123 == 123) // expect: true
|
||||
io.write(123 == 124) // expect: false
|
||||
io.write(-3 == 3) // expect: false
|
||||
io.write(0 == -0) // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
io.write(123 == "123") // expect: false
|
||||
@@ -10,10 +11,9 @@ io.write(0 == false) // expect: false
|
||||
io.write(123 != 123) // expect: false
|
||||
io.write(123 != 124) // expect: true
|
||||
io.write(-3 != 3) // expect: true
|
||||
io.write(0 != -0) // expect: false
|
||||
|
||||
// Not equal to other types.
|
||||
io.write(123 != "123") // expect: true
|
||||
io.write(1 != true) // expect: true
|
||||
io.write(0 != false) // expect: true
|
||||
|
||||
// TODO(bob): Should 0 == -0?
|
||||
@@ -1,6 +1,10 @@
|
||||
io.write(123) // expect: 123
|
||||
io.write(987654) // expect: 987654
|
||||
io.write(0) // expect: 0
|
||||
io.write(-0) // expect: 0
|
||||
io.write(123) // expect: 123
|
||||
io.write(987654) // expect: 987654
|
||||
io.write(0) // expect: 0
|
||||
io.write(-0) // expect: -0
|
||||
|
||||
// TODO(bob): Floating point numbers.
|
||||
io.write(123.456) // expect: 123.456
|
||||
io.write(-0.001) // expect: -0.001
|
||||
|
||||
// TODO(bob): Hex? Scientific notation?
|
||||
// TODO(bob): Literals at and beyond numeric limits.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
io.write(5 - 3) // expect: 2
|
||||
io.write(3 - 2 - 1) // expect: 0
|
||||
io.write(5 - 3) // expect: 2
|
||||
io.write(3.1 - 0.24) // expect: 2.86
|
||||
io.write(3 - 2 - 1) // expect: 0
|
||||
|
||||
// TODO(bob): Floating point numbers.
|
||||
// TODO(bob): Unsupported RHS types.
|
||||
|
||||
@@ -3,10 +3,12 @@ io.write(10 % 5) // expect: 0
|
||||
io.write(-4 % 3) // expect: -1
|
||||
io.write(4 % -3) // expect: 1
|
||||
io.write(-4 % -3) // expect: -1
|
||||
io.write(-4.2 % 3.1) // expect: -1.1
|
||||
io.write(4.2 % -3.1) // expect: 1.1
|
||||
io.write(-4.2 % -3.1) // expect: -1.1
|
||||
|
||||
// Left associative.
|
||||
io.write(13 % 7 % 4) // expect: 2
|
||||
|
||||
// TODO(bob): Floating point numbers.
|
||||
// TODO(bob): Unsupported RHS types.
|
||||
// TODO(bob): Error on mod by zero.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
io.write(5 * 3) // expect: 15
|
||||
io.write(12.34 * 0.3) // expect: 3.702
|
||||
|
||||
// TODO(bob): Floating point numbers.
|
||||
// TODO(bob): Unsupported RHS types.
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
io.write(1 + 2) // expect: 3
|
||||
io.write(12.34 + 0.13) // expect: 12.47
|
||||
io.write(3 + 5 + 2) // expect: 10
|
||||
|
||||
// TODO(bob): Floating point numbers.
|
||||
// TODO(bob): Unsupported RHS types.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
io.write(123.toString == "123") // expect: true
|
||||
io.write(-123.toString == "-123") // expect: true
|
||||
io.write(-0.toString == "0") // expect: true
|
||||
|
||||
// TODO(bob): Floating point numbers.
|
||||
io.write(-0.toString == "-0") // expect: true
|
||||
io.write(12.34.toString == "12.34") // expect: true
|
||||
io.write(-0.0001.toString == "-0.0001") // expect: true
|
||||
|
||||
Reference in New Issue
Block a user