Skip to content

Commit 74a196d

Browse files
authored
feat(compiler)!: Implement Infinity and NaN syntax (#1472)
Closes #693
1 parent 6dd9680 commit 74a196d

File tree

5 files changed

+219
-1
lines changed

5 files changed

+219
-1
lines changed

compiler/src/parsing/lexer.re

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,13 @@ let dec_float_decimal_explicit = [%sedlex.regexp?
104104
let dec_float_integral = [%sedlex.regexp?
105105
(dec_digit, Star(dec_digit | '_'))
106106
];
107+
let dec_float_alphabetic = [%sedlex.regexp? "Infinity" | "NaN"];
107108

108109
let dec_float = [%sedlex.regexp?
109110
(dec_float_integral, dec_float_decimal, Opt(dec_float_exp)) |
110111
(dec_float_decimal_explicit, Opt(dec_float_exp)) |
111-
(dec_float_integral, dec_float_exp)
112+
(dec_float_integral, dec_float_exp) |
113+
dec_float_alphabetic
112114
];
113115

114116
let unsigned_float = [%sedlex.regexp? dec_float];
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
basic functionality › infinity
2+
(module
3+
(type $none_=>_none (func))
4+
(type $none_=>_i32 (func (result i32)))
5+
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
6+
(import \"_grainEnv\" \"mem\" (memory $0 0))
7+
(import \"_grainEnv\" \"tbl\" (table $tbl 0 funcref))
8+
(import \"_grainEnv\" \"relocBase\" (global $relocBase_0 i32))
9+
(import \"_grainEnv\" \"moduleRuntimeId\" (global $moduleRuntimeId_0 i32))
10+
(import \"GRAIN$MODULE$runtime/gc\" \"GRAIN$EXPORT$malloc\" (global $GRAIN$EXPORT$malloc_0 (mut i32)))
11+
(import \"GRAIN$MODULE$runtime/gc\" \"malloc\" (func $malloc_0 (param i32 i32) (result i32)))
12+
(global $GRAIN$TABLE_SIZE i32 (i32.const 0))
13+
(elem $elem (global.get $relocBase_0))
14+
(export \"memory\" (memory $0))
15+
(export \"_gmain\" (func $_gmain))
16+
(export \"_gtype_metadata\" (func $_gtype_metadata))
17+
(export \"_start\" (func $_start))
18+
(export \"GRAIN$TABLE_SIZE\" (global $GRAIN$TABLE_SIZE))
19+
(func $_gtype_metadata
20+
(local $0 i32)
21+
(local $1 i32)
22+
(local $2 i32)
23+
(local $3 i64)
24+
(local $4 f32)
25+
(local $5 f64)
26+
(nop)
27+
)
28+
(func $_gmain (result i32)
29+
(local $0 i32)
30+
(local $1 i32)
31+
(local $2 i32)
32+
(local $3 i64)
33+
(local $4 f32)
34+
(local $5 f64)
35+
(return
36+
(block $cleanup_locals.3 (result i32)
37+
(local.set $0
38+
(block $compile_block.2 (result i32)
39+
(block $allocate_number.1 (result i32)
40+
(i32.store
41+
(local.tee $0
42+
(call $malloc_0
43+
(global.get $GRAIN$EXPORT$malloc_0)
44+
(i32.const 16)
45+
)
46+
)
47+
(i32.const 5)
48+
)
49+
(i32.store offset=4
50+
(local.get $0)
51+
(i32.const 2)
52+
)
53+
(f64.store offset=8
54+
(local.get $0)
55+
(f64.const inf)
56+
)
57+
(local.get $0)
58+
)
59+
)
60+
)
61+
(local.get $0)
62+
)
63+
)
64+
)
65+
(func $_start
66+
(drop
67+
(call $_gmain)
68+
)
69+
)
70+
;; custom section \"cmi\", size 240
71+
)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
basic functionality › nan
2+
(module
3+
(type $none_=>_none (func))
4+
(type $none_=>_i32 (func (result i32)))
5+
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
6+
(import \"_grainEnv\" \"mem\" (memory $0 0))
7+
(import \"_grainEnv\" \"tbl\" (table $tbl 0 funcref))
8+
(import \"_grainEnv\" \"relocBase\" (global $relocBase_0 i32))
9+
(import \"_grainEnv\" \"moduleRuntimeId\" (global $moduleRuntimeId_0 i32))
10+
(import \"GRAIN$MODULE$runtime/gc\" \"GRAIN$EXPORT$malloc\" (global $GRAIN$EXPORT$malloc_0 (mut i32)))
11+
(import \"GRAIN$MODULE$runtime/gc\" \"malloc\" (func $malloc_0 (param i32 i32) (result i32)))
12+
(global $GRAIN$TABLE_SIZE i32 (i32.const 0))
13+
(elem $elem (global.get $relocBase_0))
14+
(export \"memory\" (memory $0))
15+
(export \"_gmain\" (func $_gmain))
16+
(export \"_gtype_metadata\" (func $_gtype_metadata))
17+
(export \"_start\" (func $_start))
18+
(export \"GRAIN$TABLE_SIZE\" (global $GRAIN$TABLE_SIZE))
19+
(func $_gtype_metadata
20+
(local $0 i32)
21+
(local $1 i32)
22+
(local $2 i32)
23+
(local $3 i64)
24+
(local $4 f32)
25+
(local $5 f64)
26+
(nop)
27+
)
28+
(func $_gmain (result i32)
29+
(local $0 i32)
30+
(local $1 i32)
31+
(local $2 i32)
32+
(local $3 i64)
33+
(local $4 f32)
34+
(local $5 f64)
35+
(return
36+
(block $cleanup_locals.3 (result i32)
37+
(local.set $0
38+
(block $compile_block.2 (result i32)
39+
(block $allocate_number.1 (result i32)
40+
(i32.store
41+
(local.tee $0
42+
(call $malloc_0
43+
(global.get $GRAIN$EXPORT$malloc_0)
44+
(i32.const 16)
45+
)
46+
)
47+
(i32.const 5)
48+
)
49+
(i32.store offset=4
50+
(local.get $0)
51+
(i32.const 2)
52+
)
53+
(f64.store offset=8
54+
(local.get $0)
55+
(f64.const nan:0x8000000000000)
56+
)
57+
(local.get $0)
58+
)
59+
)
60+
)
61+
(local.get $0)
62+
)
63+
)
64+
)
65+
(func $_start
66+
(drop
67+
(call $_gmain)
68+
)
69+
)
70+
;; custom section \"cmi\", size 235
71+
)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
basic functionality › infinity_neg
2+
(module
3+
(type $none_=>_none (func))
4+
(type $none_=>_i32 (func (result i32)))
5+
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
6+
(import \"_grainEnv\" \"mem\" (memory $0 0))
7+
(import \"_grainEnv\" \"tbl\" (table $tbl 0 funcref))
8+
(import \"_grainEnv\" \"relocBase\" (global $relocBase_0 i32))
9+
(import \"_grainEnv\" \"moduleRuntimeId\" (global $moduleRuntimeId_0 i32))
10+
(import \"GRAIN$MODULE$runtime/gc\" \"GRAIN$EXPORT$malloc\" (global $GRAIN$EXPORT$malloc_0 (mut i32)))
11+
(import \"GRAIN$MODULE$runtime/gc\" \"malloc\" (func $malloc_0 (param i32 i32) (result i32)))
12+
(global $GRAIN$TABLE_SIZE i32 (i32.const 0))
13+
(elem $elem (global.get $relocBase_0))
14+
(export \"memory\" (memory $0))
15+
(export \"_gmain\" (func $_gmain))
16+
(export \"_gtype_metadata\" (func $_gtype_metadata))
17+
(export \"_start\" (func $_start))
18+
(export \"GRAIN$TABLE_SIZE\" (global $GRAIN$TABLE_SIZE))
19+
(func $_gtype_metadata
20+
(local $0 i32)
21+
(local $1 i32)
22+
(local $2 i32)
23+
(local $3 i64)
24+
(local $4 f32)
25+
(local $5 f64)
26+
(nop)
27+
)
28+
(func $_gmain (result i32)
29+
(local $0 i32)
30+
(local $1 i32)
31+
(local $2 i32)
32+
(local $3 i64)
33+
(local $4 f32)
34+
(local $5 f64)
35+
(return
36+
(block $cleanup_locals.3 (result i32)
37+
(local.set $0
38+
(block $compile_block.2 (result i32)
39+
(block $allocate_number.1 (result i32)
40+
(i32.store
41+
(local.tee $0
42+
(call $malloc_0
43+
(global.get $GRAIN$EXPORT$malloc_0)
44+
(i32.const 16)
45+
)
46+
)
47+
(i32.const 5)
48+
)
49+
(i32.store offset=4
50+
(local.get $0)
51+
(i32.const 2)
52+
)
53+
(f64.store offset=8
54+
(local.get $0)
55+
(f64.const -inf)
56+
)
57+
(local.get $0)
58+
)
59+
)
60+
)
61+
(local.get $0)
62+
)
63+
)
64+
)
65+
(func $_start
66+
(drop
67+
(call $_gmain)
68+
)
69+
)
70+
;; custom section \"cmi\", size 244
71+
)

compiler/test/suites/basic_functionality.re

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ describe("basic functionality", ({test, testSkip}) => {
2929
assertSnapshot("oct_neg", "-0o77");
3030
assertSnapshot("fals", "let x = false; x");
3131
assertSnapshot("tru", "let x = true; x");
32+
assertSnapshot("infinity", "let x = Infinity; x");
33+
assertSnapshot("infinity_neg", "let x = -Infinity; x");
34+
assertSnapshot("nan", "let x = NaN; x");
3235
assertSnapshot(
3336
"complex1",
3437
"\n let x = 2, y = 3, z = if (true) { 4 } else { 5 };\n if (true) {\n print(y)\n y - (z + x)\n } else {\n print(8)\n 8\n }\n ",

0 commit comments

Comments
 (0)