Add support for pointer types and arrays
Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
parent
7ab94d4ed5
commit
9d7f79e576
23
src/ast.odin
23
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^ = {
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -6,3 +6,5 @@ fn name(a b: f32) i32 {
|
||||
}
|
||||
|
||||
name 123.0 456.0
|
||||
|
||||
let arr: []i32, arr2: [69]u8, ptr: ^i32
|
||||
|
Loading…
x
Reference in New Issue
Block a user