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,
|
Character,
|
||||||
String,
|
String,
|
||||||
Identifier,
|
Identifier,
|
||||||
|
Pointer,
|
||||||
|
Array,
|
||||||
|
|
||||||
//
|
//
|
||||||
Block,
|
Block,
|
||||||
@ -53,6 +55,27 @@ node_create_value :: proc(kind: NodeKind, range: TextRange, value: TokenValue) -
|
|||||||
return
|
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) {
|
node_create_block :: proc(range: TextRange, children: [dynamic]^Node) -> (ret: ^Node) {
|
||||||
ret = new(Node)
|
ret = new(Node)
|
||||||
ret^ = {
|
ret^ = {
|
||||||
|
@ -227,11 +227,21 @@ parser_parse_for_statement :: proc(parser: ^Parser) -> ^Node {
|
|||||||
|
|
||||||
@(private = "file")
|
@(private = "file")
|
||||||
parser_parse_type :: proc(parser: ^Parser) -> (ret: ^Node) {
|
parser_parse_type :: proc(parser: ^Parser) -> (ret: ^Node) {
|
||||||
// FIXME: Add more types
|
|
||||||
range := parser.tok.range
|
range := parser.tok.range
|
||||||
if parser.tok.kind == .Identifier {
|
if parser.tok.kind == .Identifier {
|
||||||
ret = node_create_value(.Identifier, range, parser.tok.value.([dynamic]u8))
|
ret = node_create_value(.Identifier, range, parser.tok.value.([dynamic]u8))
|
||||||
parser_next(parser)
|
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 {
|
} else {
|
||||||
append(
|
append(
|
||||||
&g_message_list,
|
&g_message_list,
|
||||||
|
@ -56,6 +56,10 @@ ast_to_type :: proc(node: ^Node) -> ^Type {
|
|||||||
} else {
|
} else {
|
||||||
fmt.panicf("Unhandled identifier in ast_to_type: %s", value)
|
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 {
|
} else {
|
||||||
fmt.panicf("Unhandled node kind in ast_to_type: {}", node.kind)
|
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
|
name 123.0 456.0
|
||||||
|
|
||||||
|
let arr: []i32, arr2: [69]u8, ptr: ^i32
|
||||||
|
Loading…
x
Reference in New Issue
Block a user