diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index b7ece0ef1..990e7b47e 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -214,9 +214,9 @@ Ternary_Expr :: struct { Ternary_If_Expr :: struct { using node: Expr, - x: ^Expr, + x: ^Expr, op1: tokenizer.Token, - cond: ^Expr, + cond: ^Expr, op2: tokenizer.Token, y: ^Expr, } @@ -225,7 +225,7 @@ Ternary_When_Expr :: struct { using node: Expr, x: ^Expr, op1: tokenizer.Token, - cond: ^Expr, + cond: ^Expr, op2: tokenizer.Token, y: ^Expr, } @@ -569,7 +569,6 @@ Distinct_Type :: struct { Opaque_Type :: struct { using node: Expr, - tok: tokenizer.Token_Kind, type: ^Expr, } diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 259d8f482..4d94ed479 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -300,7 +300,9 @@ expect_token_after :: proc(p: ^Parser, kind: tokenizer.Token_Kind, msg: string) expect_operator :: proc(p: ^Parser) -> tokenizer.Token { prev := p.curr_tok; - if !tokenizer.is_operator(prev.kind) { + if prev.kind == .If || prev.kind == .When { + // okay + } else if !tokenizer.is_operator(prev.kind) { g := tokenizer.to_string(prev.kind); error(p, prev.pos, "expected an operator, got '%s'", g); } @@ -1957,13 +1959,6 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { bl.tok = tok; return bl; - - case .Size_Of, .Align_Of, .Offset_Of: - tok := advance_token(p); - expr := ast.new(ast.Implicit, tok.pos, end_pos(tok)); - expr.tok = tok; - return parse_call_expr(p, expr); - case .Open_Brace: if !lhs { return parse_literal_value(p, nil); @@ -1992,15 +1987,22 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case .Opaque: tok := advance_token(p); + warn(p, tok.pos, "opaque is deprecated in favour of #opaque"); type := parse_type(p); ot := ast.new(ast.Opaque_Type, tok.pos, type.end); - ot.tok = tok.kind; ot.type = type; return ot; + case .Hash: tok := expect_token(p, .Hash); name := expect_token(p, .Ident); switch name.text { + case "opaque": + type := parse_type(p); + ot := ast.new(ast.Opaque_Type, tok.pos, type.end); + ot.type = type; + return ot; + case "type": type := parse_type(p); hp := ast.new(ast.Helper_Type, tok.pos, type.end); @@ -2225,25 +2227,6 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { ti.specialization = nil; return ti; - case .Type_Of: - tok := advance_token(p); - i := ast.new(ast.Implicit, tok.pos, end_pos(tok)); - i.tok = tok; - type: ^ast.Expr = parse_call_expr(p, i); - for p.curr_tok.kind == .Period { - period := advance_token(p); - - field := parse_ident(p); - sel := ast.new(ast.Selector_Expr, period.pos, field.end); - sel.expr = type; - sel.field = field; - - type = sel; - } - - return type; - - case .Pointer: tok := expect_token(p, .Pointer); elem := parse_type(p); diff --git a/core/odin/tokenizer/token.odin b/core/odin/tokenizer/token.odin index 997ca7ac1..54110cf02 100644 --- a/core/odin/tokenizer/token.odin +++ b/core/odin/tokenizer/token.odin @@ -133,7 +133,6 @@ Token_Kind :: enum u32 { Defer, Return, Proc, - Macro, Struct, Union, Enum, @@ -150,11 +149,6 @@ Token_Kind :: enum u32 { Inline, No_Inline, Context, - Size_Of, - Align_Of, - Offset_Of, - Type_Of, - Const, B_Keyword_End, COUNT, @@ -268,7 +262,6 @@ tokens := [Token_Kind.COUNT]string { "defer", "return", "proc", - "macro", "struct", "union", "enum", @@ -285,11 +278,6 @@ tokens := [Token_Kind.COUNT]string { "inline", "no_inline", "context", - "size_of", - "align_of", - "offset_of", - "type_of", - "const", "", };