code wiki / (root) / nx_nparse_test.nx

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}