nx_nir_test.nx source
↩ module page · 71 lines · 1863 B
1// Test full pipeline: lex -> parse -> IR build, all NishiLang.
2
3import "syscalls.nx"
4import "nx_nlex.nx"
5import "nx_nparse.nx"
6import "nx_nir.nx"
7
8func main() -> i64 {
9 let src: *u8 = sys_mmap(64)
10 src[0] = 102 as u8 // f
11 src[1] = 117 as u8 // u
12 src[2] = 110 as u8 // n
13 src[3] = 99 as u8 // c
14 src[4] = 32 as u8
15 src[5] = 109 as u8
16 src[6] = 97 as u8
17 src[7] = 105 as u8
18 src[8] = 110 as u8
19 src[9] = 40 as u8
20 src[10] = 41 as u8
21 src[11] = 32 as u8
22 src[12] = 45 as u8
23 src[13] = 62 as u8
24 src[14] = 32 as u8
25 src[15] = 105 as u8
26 src[16] = 54 as u8
27 src[17] = 52 as u8
28 src[18] = 32 as u8
29 src[19] = 123 as u8
30 src[20] = 32 as u8
31 src[21] = 114 as u8
32 src[22] = 101 as u8
33 src[23] = 116 as u8
34 src[24] = 117 as u8
35 src[25] = 114 as u8
36 src[26] = 110 as u8
37 src[27] = 32 as u8
38 src[28] = 52 as u8
39 src[29] = 50 as u8
40 src[30] = 32 as u8
41 src[31] = 125 as u8
42
43 let lex: *NxNLexer = nx_nlex_new(src, 32, 32)
44 if nx_nlex_run(lex) != 11 { return 1 }
45
46 let parser: *NxNParser = nx_nparse_new(lex, 32)
47 let func_idx: i64 = nx_nparse_run(parser)
48 if func_idx < 0 { return 2 }
49
50 let ir_func: *NxIrFunc = nx_nir_lower_func(parser, func_idx, 32)
51 if ir_func == (0 as *NxIrFunc) { return 3 }
52
53 // Expected IR: 2 instructions
54 // v0 = CONST_I64 42
55 // v1 = RETURN v0
56 if ir_func.n_instrs != 2 { return 4 }
57
58 let i0: *NxInstr = nx_nir_instr_at(ir_func, 0)
59 if i0.opcode != NX_IR_CONST_I64 { return 5 }
60 if i0.op0 != 42 { return 6 }
61
62 let i1: *NxInstr = nx_nir_instr_at(ir_func, 1)
63 if i1.opcode != NX_IR_RETURN { return 7 }
64 if i1.op0 != 0 { return 8 } // returns v0
65
66 // Function metadata
67 if ir_func.name_len != 4 { return 9 }
68 if ir_func.return_ty != 0 { return 10 }
69
70 return 0
71}