@@ -32,6 +32,7 @@ var unaryOperators = map[string]operator{
3232}
3333
3434var binaryOperators = map [string ]operator {
35+ "|" : {0 , left },
3536 "or" : {10 , left },
3637 "||" : {10 , left },
3738 "and" : {15 , left },
@@ -147,12 +148,13 @@ func (p *parser) expect(kind Kind, values ...string) {
147148func (p * parser ) parseExpression (precedence int ) Node {
148149 nodeLeft := p .parsePrimary ()
149150
150- lastOperator := ""
151+ prevOperator := ""
151152 opToken := p .current
152153 for opToken .Is (Operator ) && p .err == nil {
153154 negate := false
154155 var notToken Token
155156
157+ // Handle "not *" operator, like "not in" or "not contains".
156158 if opToken .Is (Operator , "not" ) {
157159 p .next ()
158160 notToken = p .current
@@ -164,7 +166,12 @@ func (p *parser) parseExpression(precedence int) Node {
164166 if op .precedence >= precedence {
165167 p .next ()
166168
167- if lastOperator == "??" && opToken .Value != "??" && ! opToken .Is (Bracket , "(" ) {
169+ if opToken .Value == "|" {
170+ nodeLeft = p .parsePipe (nodeLeft )
171+ goto next
172+ }
173+
174+ if prevOperator == "??" && opToken .Value != "??" && ! opToken .Is (Bracket , "(" ) {
168175 p .errorAt (opToken , "Operator (%v) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses." , opToken .Value )
169176 break
170177 }
@@ -191,21 +198,18 @@ func (p *parser) parseExpression(precedence int) Node {
191198 nodeLeft .SetLocation (notToken .Location )
192199 }
193200
194- lastOperator = opToken .Value
195- opToken = p .current
196- continue
201+ goto next
197202 }
198203 }
199204 break
205+
206+ next:
207+ prevOperator = opToken .Value
208+ opToken = p .current
200209 }
201210
202211 if precedence == 0 {
203212 nodeLeft = p .parseConditional (nodeLeft )
204-
205- if p .current .Is (Operator , "|" ) {
206- p .next ()
207- return p .parsePipe (nodeLeft )
208- }
209213 }
210214
211215 return nodeLeft
@@ -626,11 +630,6 @@ func (p *parser) parsePipe(node Node) Node {
626630 node .SetLocation (identifier .Location )
627631 }
628632
629- if p .current .Is (Operator , "|" ) {
630- p .next ()
631- return p .parsePipe (node )
632- }
633-
634633 return node
635634}
636635
0 commit comments