mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 07:08:48 +00:00
Update odin/ast for multi pointers
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user