@@ -32,6 +32,7 @@ var unaryOperators = map[string]operator{
32
32
}
33
33
34
34
var binaryOperators = map [string ]operator {
35
+ "|" : {0 , left },
35
36
"or" : {10 , left },
36
37
"||" : {10 , left },
37
38
"and" : {15 , left },
@@ -147,12 +148,13 @@ func (p *parser) expect(kind Kind, values ...string) {
147
148
func (p * parser ) parseExpression (precedence int ) Node {
148
149
nodeLeft := p .parsePrimary ()
149
150
150
- lastOperator := ""
151
+ prevOperator := ""
151
152
opToken := p .current
152
153
for opToken .Is (Operator ) && p .err == nil {
153
154
negate := false
154
155
var notToken Token
155
156
157
+ // Handle "not *" operator, like "not in" or "not contains".
156
158
if opToken .Is (Operator , "not" ) {
157
159
p .next ()
158
160
notToken = p .current
@@ -164,7 +166,12 @@ func (p *parser) parseExpression(precedence int) Node {
164
166
if op .precedence >= precedence {
165
167
p .next ()
166
168
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 , "(" ) {
168
175
p .errorAt (opToken , "Operator (%v) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses." , opToken .Value )
169
176
break
170
177
}
@@ -191,21 +198,18 @@ func (p *parser) parseExpression(precedence int) Node {
191
198
nodeLeft .SetLocation (notToken .Location )
192
199
}
193
200
194
- lastOperator = opToken .Value
195
- opToken = p .current
196
- continue
201
+ goto next
197
202
}
198
203
}
199
204
break
205
+
206
+ next:
207
+ prevOperator = opToken .Value
208
+ opToken = p .current
200
209
}
201
210
202
211
if precedence == 0 {
203
212
nodeLeft = p .parseConditional (nodeLeft )
204
-
205
- if p .current .Is (Operator , "|" ) {
206
- p .next ()
207
- return p .parsePipe (nodeLeft )
208
- }
209
213
}
210
214
211
215
return nodeLeft
@@ -626,11 +630,6 @@ func (p *parser) parsePipe(node Node) Node {
626
630
node .SetLocation (identifier .Location )
627
631
}
628
632
629
- if p .current .Is (Operator , "|" ) {
630
- p .next ()
631
- return p .parsePipe (node )
632
- }
633
-
634
633
return node
635
634
}
636
635
0 commit comments