From d62503d031855534adddc37f84bd2e92dc2a5467 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 6 Oct 2019 18:14:02 +0100 Subject: [PATCH] Change precedence for `in` and `notin` to match + - | ~ --- core/odin/parser/parser.odin | 10 +++++----- examples/demo/demo.odin | 10 +--------- src/parser.cpp | 11 ++++++----- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index f652e2c02..7c5c096ba 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -1144,17 +1144,17 @@ token_precedence :: proc(p: ^Parser, kind: token.Kind) -> int { token.Lt_Eq, token.Gt_Eq: return 5; case token.In, token.Notin: - if p.expr_level >= 0 || p.allow_in_expr { - return 6; + if p.expr_level < 0 && !p.allow_in_expr { + return 0; } - return 0; + fallthrough; case token.Add, token.Sub, token.Or, token.Xor: - return 7; + return 6; case token.Mul, token.Quo, token.Mod, token.Mod_Mod, token.And, token.And_Not, token.Shl, token.Shr: - return 8; + return 7; } return 0; } diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index 2c8148501..1460bf8be 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -1190,15 +1190,7 @@ where_clauses :: proc() { } main :: proc() { - x := "foobarbaz"; - i : int; - i = strings.last_index(x, "foo"); fmt.println(i); - i = strings.last_index(x, "bar"); fmt.println(i); - i = strings.last_index(x, "baz"); fmt.println(i); - i = strings.last_index(x, "asd"); fmt.println(i); - i = strings.last_index(x, "a"); fmt.println(i); - i = strings.last_index(x, "ba"); fmt.println(i); - when false { + when true { general_stuff(); union_type(); parametric_polymorphism(); diff --git a/src/parser.cpp b/src/parser.cpp index fb093ffd9..29254d7e8 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2479,17 +2479,18 @@ i32 token_precedence(AstFile *f, TokenKind t) { case Token_LtEq: case Token_GtEq: return 5; + case Token_in: case Token_notin: - if (f->expr_level >= 0 || f->allow_in_expr) { - return 6; + if (f->expr_level < 0 && !f->allow_in_expr) { + return 0; } - return 0; + /*fallthrough*/ case Token_Add: case Token_Sub: case Token_Or: case Token_Xor: - return 7; + return 6; case Token_Mul: case Token_Quo: case Token_Mod: @@ -2498,7 +2499,7 @@ i32 token_precedence(AstFile *f, TokenKind t) { case Token_AndNot: case Token_Shl: case Token_Shr: - return 8; + return 7; } return 0; }