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
+3 -4
View File
@@ -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,
} }
+11 -28
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 { 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);
-12
View File
@@ -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",
"", "",
}; };