From 9d7f79e576491ed18531e950622bcbba8c51068a Mon Sep 17 00:00:00 2001 From: Slendi Date: Wed, 28 Feb 2024 16:45:56 +0200 Subject: [PATCH] Add support for pointer types and arrays Signed-off-by: Slendi --- src/ast.odin | 23 +++++++++++++++++++++++ src/parser.odin | 12 +++++++++++- src/type_checker.odin | 4 ++++ test_type_checker.cat | 2 ++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/ast.odin b/src/ast.odin index 5960dd9..3c7c736 100644 --- a/src/ast.odin +++ b/src/ast.odin @@ -9,6 +9,8 @@ NodeKind :: enum { Character, String, Identifier, + Pointer, + Array, // Block, @@ -53,6 +55,27 @@ node_create_value :: proc(kind: NodeKind, range: TextRange, value: TokenValue) - return } +node_create_pointer :: proc(range: TextRange, value: ^Node) -> (ret: ^Node) { + ret = new(Node) + ret^ = { + kind = .Pointer, + range = range, + children = {value}, + } + return +} + +node_create_array :: proc(range: TextRange, size: u64, value: ^Node) -> (ret: ^Node) { + ret = new(Node) + ret^ = { + kind = .Array, + range = range, + children = {value}, + value = size, + } + return +} + node_create_block :: proc(range: TextRange, children: [dynamic]^Node) -> (ret: ^Node) { ret = new(Node) ret^ = { diff --git a/src/parser.odin b/src/parser.odin index 76277b1..e4b4932 100644 --- a/src/parser.odin +++ b/src/parser.odin @@ -227,11 +227,21 @@ parser_parse_for_statement :: proc(parser: ^Parser) -> ^Node { @(private = "file") parser_parse_type :: proc(parser: ^Parser) -> (ret: ^Node) { - // FIXME: Add more types range := parser.tok.range if parser.tok.kind == .Identifier { ret = node_create_value(.Identifier, range, parser.tok.value.([dynamic]u8)) parser_next(parser) + } else if accept(parser, .BitwiseXOR) { + ret = node_create_pointer(range, parser_parse_type(parser)) + } else if accept(parser, .OpenBracket) { + size : u64 = 0 + if parser.tok.kind == .Integer { + size = parser.tok.value.(u64) + parser_next(parser) + } + + expect(parser, .CloseBracket) + ret = node_create_array(range, size, parser_parse_type(parser)) } else { append( &g_message_list, diff --git a/src/type_checker.odin b/src/type_checker.odin index b4920f7..f06d7f4 100644 --- a/src/type_checker.odin +++ b/src/type_checker.odin @@ -56,6 +56,10 @@ ast_to_type :: proc(node: ^Node) -> ^Type { } else { fmt.panicf("Unhandled identifier in ast_to_type: %s", value) } + } else if node.kind == .Pointer { + return type_create_pointer(ast_to_type(node.children[0])) + } else if node.kind == .Array { + return type_create_array(ast_to_type(node.children[0]), node.value.(u64)) } else { fmt.panicf("Unhandled node kind in ast_to_type: {}", node.kind) } diff --git a/test_type_checker.cat b/test_type_checker.cat index 05f93c3..93bea5d 100644 --- a/test_type_checker.cat +++ b/test_type_checker.cat @@ -6,3 +6,5 @@ fn name(a b: f32) i32 { } name 123.0 456.0 + +let arr: []i32, arr2: [69]u8, ptr: ^i32