Update odin/ast for multi pointers

This commit is contained in:
gingerBill
2021-08-22 11:46:12 +01:00
parent 0decdaed1a
commit 19bf12aa09
4 changed files with 34 additions and 8 deletions
+8
View File
@@ -656,6 +656,14 @@ Pointer_Type :: struct {
elem: ^Expr, elem: ^Expr,
} }
Multi_Pointer_Type :: struct {
using node: Expr,
open: tokenizer.Pos,
pointer: tokenizer.Pos,
close: tokenizer.Pos,
elem: ^Expr,
}
Array_Type :: struct { Array_Type :: struct {
using node: Expr, using node: Expr,
open: tokenizer.Pos, open: tokenizer.Pos,
+2
View File
@@ -251,6 +251,8 @@ clone_node :: proc(node: ^Node) -> ^Node {
r.results = auto_cast clone(r.results); r.results = auto_cast clone(r.results);
case Pointer_Type: case Pointer_Type:
r.elem = clone(r.elem); r.elem = clone(r.elem);
case Multi_Pointer_Type:
r.elem = clone(r.elem);
case Array_Type: case Array_Type:
r.len = clone(r.len); r.len = clone(r.len);
r.elem = clone(r.elem); r.elem = clone(r.elem);
+2
View File
@@ -349,6 +349,8 @@ walk :: proc(v: ^Visitor, node: ^Node) {
walk(v, n.results); walk(v, n.results);
case Pointer_Type: case Pointer_Type:
walk(v, n.elem); walk(v, n.elem);
case Multi_Pointer_Type:
walk(v, n.elem);
case Array_Type: case Array_Type:
if n.tag != nil { if n.tag != nil {
walk(v, n.tag); walk(v, n.tag);
+22 -8
View File
@@ -2440,18 +2440,26 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr {
tok := expect_token(p, .Pointer); tok := expect_token(p, .Pointer);
elem := parse_type(p); elem := parse_type(p);
ptr := ast.new(ast.Pointer_Type, tok.pos, elem.end); ptr := ast.new(ast.Pointer_Type, tok.pos, elem.end);
ptr.pointer = tok.pos;
ptr.elem = elem; ptr.elem = elem;
return ptr; return ptr;
case .Open_Bracket: case .Open_Bracket:
open := expect_token(p, .Open_Bracket); open := expect_token(p, .Open_Bracket);
count: ^ast.Expr; count: ^ast.Expr;
if p.curr_tok.kind == .Question { switch p.curr_tok.kind {
tok := expect_token(p, .Question); case .Pointer:
q := ast.new(ast.Unary_Expr, tok.pos, end_pos(tok)); tok := expect_token(p, .Pointer);
q.op = tok; close := expect_token(p, .Close_Bracket);
count = q; elem := parse_type(p);
} else if p.curr_tok.kind == .Dynamic { t := ast.new(ast.Multi_Pointer_Type, open.pos, elem.end_pos);
t.open = open.pos;
t.pointer = tok.pos;
t.close = close.pos;
t.elem = elem;
return t;
case .Dynamic:
tok := expect_token(p, .Dynamic); tok := expect_token(p, .Dynamic);
close := expect_token(p, .Close_Bracket); close := expect_token(p, .Close_Bracket);
elem := parse_type(p); elem := parse_type(p);
@@ -2460,12 +2468,18 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr {
da.dynamic_pos = tok.pos; da.dynamic_pos = tok.pos;
da.close = close.pos; da.close = close.pos;
da.elem = elem; da.elem = elem;
return da; return da;
} else if p.curr_tok.kind != .Close_Bracket { case .Question:
tok := expect_token(p, .Question);
q := ast.new(ast.Unary_Expr, tok.pos, end_pos(tok));
q.op = tok;
count = q;
case:
p.expr_level += 1; p.expr_level += 1;
count = parse_expr(p, false); count = parse_expr(p, false);
p.expr_level -= 1; p.expr_level -= 1;
case .Close_Bracket:
// handle below
} }
close := expect_token(p, .Close_Bracket); close := expect_token(p, .Close_Bracket);
elem := parse_type(p); elem := parse_type(p);