nx_nparse_test.nx source
↩ module page · 73 lines · 2356 B
1// Test NishiLang-in-NishiLang parser on `func main() -> i64 { return 42 }`.
2
3import "syscalls.nx"
4import "nx_nlex.nx"
5import "nx_nparse.nx"
6
7func main() -> i64 {
8 let src: *u8 = sys_mmap(64)
9 src[0] = 102 as u8 // f
10 src[1] = 117 as u8 // u
11 src[2] = 110 as u8 // n
12 src[3] = 99 as u8 // c
13 src[4] = 32 as u8
14 src[5] = 109 as u8 // m
15 src[6] = 97 as u8 // a
16 src[7] = 105 as u8 // i
17 src[8] = 110 as u8 // n
18 src[9] = 40 as u8 // (
19 src[10] = 41 as u8 // )
20 src[11] = 32 as u8
21 src[12] = 45 as u8 // -
22 src[13] = 62 as u8 // >
23 src[14] = 32 as u8
24 src[15] = 105 as u8 // i
25 src[16] = 54 as u8 // 6
26 src[17] = 52 as u8 // 4
27 src[18] = 32 as u8
28 src[19] = 123 as u8 // {
29 src[20] = 32 as u8
30 src[21] = 114 as u8 // r
31 src[22] = 101 as u8 // e
32 src[23] = 116 as u8 // t
33 src[24] = 117 as u8 // u
34 src[25] = 114 as u8 // r
35 src[26] = 110 as u8 // n
36 src[27] = 32 as u8
37 src[28] = 52 as u8 // 4
38 src[29] = 50 as u8 // 2
39 src[30] = 32 as u8
40 src[31] = 125 as u8 // }
41
42 let lex: *NxNLexer = nx_nlex_new(src, 32, 32)
43 let n_tok: i64 = nx_nlex_run(lex)
44 if n_tok != 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 f: *NxAst = nx_nparse_node_at(parser, func_idx)
51 if f.kind != NX_AST_FUNC { return 3 }
52 if f.b != 4 { return 4 } // name length = 4 ("main")
53
54 // Return type: should be a TYPE_REF for "i64"
55 if f.c < 0 { return 5 }
56 let ret: *NxAst = nx_nparse_node_at(parser, f.c)
57 if ret.kind != NX_AST_TYPE_REF { return 6 }
58 if ret.b != 3 { return 7 } // "i64" length 3
59
60 // Body: should be a BLOCK with 1 stmt
61 let body: *NxAst = nx_nparse_node_at(parser, f.d)
62 if body.kind != NX_AST_BLOCK { return 8 }
63 if body.e != 1 { return 9 } // exactly 1 statement
64
65 // First (and only) stmt: RETURN with INT(42)
66 let ret_stmt: *NxAst = nx_nparse_node_at(parser, body.a)
67 if ret_stmt.kind != NX_AST_RETURN { return 10 }
68 let int_lit: *NxAst = nx_nparse_node_at(parser, ret_stmt.a)
69 if int_lit.kind != NX_AST_INT { return 11 }
70 if int_lit.a != 42 { return 12 }
71
72 return 0
73}