lex_float_test.nx source
↩ module page · 65 lines · 3106 B
1// lex_float_test.nx -- self-test for TK_FLOAT lexing.
2//
3// Verifies:
4// (1) "3.14" -> TK_FLOAT, int_val=3, text0=14, text1=2
5// (2) "0.5" -> TK_FLOAT, int_val=0, text0=5, text1=1
6// (3) "42" -> TK_INT , int_val=42 (integer unchanged)
7// (4) "1.0f" -> TK_FLOAT, int_val=1, text0=0, text1=1 (suffix
8// consumed)
9// (5) "2.718e0" -> TK_FLOAT on the "2.718" portion. Exponent
10// tokenisation isn't wired yet; the 'e0' tail
11// falls through to the identifier lexer. This
12// test confirms the float portion is correctly
13// isolated.
14//
15// Once parse.nx consumes TK_FLOAT + emits VK_CONST_FLOAT into the IR,
16// end-to-end f32 codegen (the final piece after regalloc dfe10f8) is
17// runnable.
18
19import "syscalls.nx"
20import "types.nx"
21import "lex_kinds.nx"
22import "lex.nx"
23
24func main() -> i64 {
25 // --- 1: basic "3.14" -----------------------------------------
26 let src1: *u8 = "3.14" as *u8
27 let toks1: *Tok = lex_source(src1, 64)
28 if toks1 == (0 as *Tok) { return __syscall(93, 10, 0, 0, 0, 0, 0) }
29 if toks1.kind != TK_FLOAT { return __syscall(93, 11, 0, 0, 0, 0, 0) }
30 if toks1.int_val != 3 { return __syscall(93, 12, 0, 0, 0, 0, 0) }
31 if toks1.text0 != 14 { return __syscall(93, 13, 0, 0, 0, 0, 0) }
32 if toks1.text1 != 2 { return __syscall(93, 14, 0, 0, 0, 0, 0) }
33
34 // --- 2: "0.5" -------------------------------------------------
35 let src2: *u8 = "0.5" as *u8
36 let toks2: *Tok = lex_source(src2, 64)
37 if toks2.kind != TK_FLOAT { return __syscall(93, 20, 0, 0, 0, 0, 0) }
38 if toks2.int_val != 0 { return __syscall(93, 21, 0, 0, 0, 0, 0) }
39 if toks2.text0 != 5 { return __syscall(93, 22, 0, 0, 0, 0, 0) }
40 if toks2.text1 != 1 { return __syscall(93, 23, 0, 0, 0, 0, 0) }
41
42 // --- 3: plain int "42" stays TK_INT --------------------------
43 let src3: *u8 = "42" as *u8
44 let toks3: *Tok = lex_source(src3, 64)
45 if toks3.kind != TK_INT { return __syscall(93, 30, 0, 0, 0, 0, 0) }
46 if toks3.int_val != 42 { return __syscall(93, 31, 0, 0, 0, 0, 0) }
47
48 // --- 4: "1.0f" suffix -----------------------------------------
49 let src4: *u8 = "1.0f" as *u8
50 let toks4: *Tok = lex_source(src4, 64)
51 if toks4.kind != TK_FLOAT { return __syscall(93, 40, 0, 0, 0, 0, 0) }
52 if toks4.int_val != 1 { return __syscall(93, 41, 0, 0, 0, 0, 0) }
53 if toks4.text0 != 0 { return __syscall(93, 42, 0, 0, 0, 0, 0) }
54 if toks4.text1 != 1 { return __syscall(93, 43, 0, 0, 0, 0, 0) }
55
56 // --- 5: "99." (trailing dot, not followed by digit) stays INT.
57 // This verifies the 'dot-then-digit' guard correctly rejects
58 // dotted patterns like method access in `obj.method`.
59 let src5: *u8 = "99. " as *u8
60 let toks5: *Tok = lex_source(src5, 64)
61 if toks5.kind != TK_INT { return __syscall(93, 50, 0, 0, 0, 0, 0) }
62 if toks5.int_val != 99 { return __syscall(93, 51, 0, 0, 0, 0, 0) }
63
64 return 0
65}