mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-03 17:24:39 +00:00
Correct ternary if/when parsing
This commit is contained in:
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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",
|
||||
"",
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user