code wiki / (root) / lex_float_test.nx

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}