Correct ternary if/when parsing

This commit is contained in:
gingerBill
2020-12-06 00:15:35 +00:00
parent 80fead1de5
commit d94414b0f4
3 changed files with 14 additions and 44 deletions

View File

@@ -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,
}

View File

@@ -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);

View File

@@ -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",
"",
};