Add support for pointer types and arrays

Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
Slendi 2024-02-28 16:45:56 +02:00
parent 7ab94d4ed5
commit 9d7f79e576
4 changed files with 40 additions and 1 deletions

View File

@ -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^ = {

View File

@ -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,

View File

@ -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)
}

View File

@ -6,3 +6,5 @@ fn name(a b: f32) i32 {
}
name 123.0 456.0
let arr: []i32, arr2: [69]u8, ptr: ^i32