From 20d331813cf05f42961f0f6df531c2880f753a07 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Sat, 21 Oct 2023 11:20:52 -0400 Subject: parser: implement operator precedence rules in expressions --- lang/golang/go.go | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'lang/golang/go.go') diff --git a/lang/golang/go.go b/lang/golang/go.go index 7f66594..44cbd3a 100644 --- a/lang/golang/go.go +++ b/lang/golang/go.go @@ -70,19 +70,24 @@ var GoSpec = &lang.Spec{ ":": {TokenId: lang.Colon}, // Operators - "&": {TokenId: lang.And}, - "*": {TokenId: lang.Mul}, - "+": {TokenId: lang.Add}, - "-": {TokenId: lang.Sub}, - "=": {TokenId: lang.Assign}, - "<": {TokenId: lang.Less}, - ">": {TokenId: lang.Greater}, - "^": {TokenId: lang.Xor}, + "&": {TokenId: lang.And, Precedence: 1}, + "*": {TokenId: lang.Mul, Precedence: 1}, + "/": {TokenId: lang.Quo, Precedence: 1}, + "%": {TokenId: lang.Rem, Precedence: 1}, + "+": {TokenId: lang.Add, Precedence: 2}, + "-": {TokenId: lang.Sub, Precedence: 2}, + "=": {TokenId: lang.Assign, Precedence: 6}, + "+=": {TokenId: lang.AddAssign, Precedence: 6}, + "<": {TokenId: lang.Less, Precedence: 3}, + ">": {TokenId: lang.Greater, Precedence: 3}, + "^": {TokenId: lang.Xor, Precedence: 2}, "~": {TokenId: lang.Tilde}, - ":=": {TokenId: lang.Define}, - "==": {TokenId: lang.Equal}, - "<=": {TokenId: lang.LessEqual}, - ">=": {TokenId: lang.GreaterEqual}, + "&&": {TokenId: lang.Land, Precedence: 4}, + "||": {TokenId: lang.Lor, Precedence: 5}, + ":=": {TokenId: lang.Define, Precedence: 6}, + "==": {TokenId: lang.Equal, Precedence: 3}, + "<=": {TokenId: lang.LessEqual, Precedence: 3}, + ">=": {TokenId: lang.GreaterEqual, Precedence: 3}, "->": {TokenId: lang.Arrow}, "++": {TokenId: lang.Inc, SkipSemi: true}, "--": {TokenId: lang.Dec, SkipSemi: true}, @@ -93,7 +98,7 @@ var GoSpec = &lang.Spec{ "chan": {TokenId: lang.Chan, SkipSemi: true}, "const": {TokenId: lang.Const, SkipSemi: true}, "continue": {TokenId: lang.Continue}, - "default": {TokenId: lang.Default, SkipSemi: true}, + "default": {TokenId: lang.Case, SkipSemi: true}, "defer": {TokenId: lang.Defer, SkipSemi: true}, "else": {TokenId: lang.Else, SkipSemi: true}, "fallthrough": {TokenId: lang.Fallthrough}, -- cgit v1.2.3