mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Correct ternary if/when parsing
This commit is contained in:
@@ -214,9 +214,9 @@ Ternary_Expr :: struct {
|
|||||||
|
|
||||||
Ternary_If_Expr :: struct {
|
Ternary_If_Expr :: struct {
|
||||||
using node: Expr,
|
using node: Expr,
|
||||||
x: ^Expr,
|
x: ^Expr,
|
||||||
op1: tokenizer.Token,
|
op1: tokenizer.Token,
|
||||||
cond: ^Expr,
|
cond: ^Expr,
|
||||||
op2: tokenizer.Token,
|
op2: tokenizer.Token,
|
||||||
y: ^Expr,
|
y: ^Expr,
|
||||||
}
|
}
|
||||||
@@ -225,7 +225,7 @@ Ternary_When_Expr :: struct {
|
|||||||
using node: Expr,
|
using node: Expr,
|
||||||
x: ^Expr,
|
x: ^Expr,
|
||||||
op1: tokenizer.Token,
|
op1: tokenizer.Token,
|
||||||
cond: ^Expr,
|
cond: ^Expr,
|
||||||
op2: tokenizer.Token,
|
op2: tokenizer.Token,
|
||||||
y: ^Expr,
|
y: ^Expr,
|
||||||
}
|
}
|
||||||
@@ -569,7 +569,6 @@ Distinct_Type :: struct {
|
|||||||
|
|
||||||
Opaque_Type :: struct {
|
Opaque_Type :: struct {
|
||||||
using node: Expr,
|
using node: Expr,
|
||||||
tok: tokenizer.Token_Kind,
|
|
||||||
type: ^Expr,
|
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 {
|
expect_operator :: proc(p: ^Parser) -> tokenizer.Token {
|
||||||
prev := p.curr_tok;
|
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);
|
g := tokenizer.to_string(prev.kind);
|
||||||
error(p, prev.pos, "expected an operator, got '%s'", g);
|
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;
|
bl.tok = tok;
|
||||||
return bl;
|
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:
|
case .Open_Brace:
|
||||||
if !lhs {
|
if !lhs {
|
||||||
return parse_literal_value(p, nil);
|
return parse_literal_value(p, nil);
|
||||||
@@ -1992,15 +1987,22 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr {
|
|||||||
|
|
||||||
case .Opaque:
|
case .Opaque:
|
||||||
tok := advance_token(p);
|
tok := advance_token(p);
|
||||||
|
warn(p, tok.pos, "opaque is deprecated in favour of #opaque");
|
||||||
type := parse_type(p);
|
type := parse_type(p);
|
||||||
ot := ast.new(ast.Opaque_Type, tok.pos, type.end);
|
ot := ast.new(ast.Opaque_Type, tok.pos, type.end);
|
||||||
ot.tok = tok.kind;
|
|
||||||
ot.type = type;
|
ot.type = type;
|
||||||
return ot;
|
return ot;
|
||||||
|
|
||||||
case .Hash:
|
case .Hash:
|
||||||
tok := expect_token(p, .Hash);
|
tok := expect_token(p, .Hash);
|
||||||
name := expect_token(p, .Ident);
|
name := expect_token(p, .Ident);
|
||||||
switch name.text {
|
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":
|
case "type":
|
||||||
type := parse_type(p);
|
type := parse_type(p);
|
||||||
hp := ast.new(ast.Helper_Type, tok.pos, type.end);
|
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;
|
ti.specialization = nil;
|
||||||
return ti;
|
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:
|
case .Pointer:
|
||||||
tok := expect_token(p, .Pointer);
|
tok := expect_token(p, .Pointer);
|
||||||
elem := parse_type(p);
|
elem := parse_type(p);
|
||||||
|
|||||||
@@ -133,7 +133,6 @@ Token_Kind :: enum u32 {
|
|||||||
Defer,
|
Defer,
|
||||||
Return,
|
Return,
|
||||||
Proc,
|
Proc,
|
||||||
Macro,
|
|
||||||
Struct,
|
Struct,
|
||||||
Union,
|
Union,
|
||||||
Enum,
|
Enum,
|
||||||
@@ -150,11 +149,6 @@ Token_Kind :: enum u32 {
|
|||||||
Inline,
|
Inline,
|
||||||
No_Inline,
|
No_Inline,
|
||||||
Context,
|
Context,
|
||||||
Size_Of,
|
|
||||||
Align_Of,
|
|
||||||
Offset_Of,
|
|
||||||
Type_Of,
|
|
||||||
Const,
|
|
||||||
B_Keyword_End,
|
B_Keyword_End,
|
||||||
|
|
||||||
COUNT,
|
COUNT,
|
||||||
@@ -268,7 +262,6 @@ tokens := [Token_Kind.COUNT]string {
|
|||||||
"defer",
|
"defer",
|
||||||
"return",
|
"return",
|
||||||
"proc",
|
"proc",
|
||||||
"macro",
|
|
||||||
"struct",
|
"struct",
|
||||||
"union",
|
"union",
|
||||||
"enum",
|
"enum",
|
||||||
@@ -285,11 +278,6 @@ tokens := [Token_Kind.COUNT]string {
|
|||||||
"inline",
|
"inline",
|
||||||
"no_inline",
|
"no_inline",
|
||||||
"context",
|
"context",
|
||||||
"size_of",
|
|
||||||
"align_of",
|
|
||||||
"offset_of",
|
|
||||||
"type_of",
|
|
||||||
"const",
|
|
||||||
"",
|
"",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user