@@ -145,7 +145,7 @@ func (p *parser) parseExpression(precedence int) Node {
145145 nodeLeft := p .parsePrimary ()
146146
147147 token := p .current
148- for token .Is (Operator ) {
148+ for token .Is (Operator ) && p . err == nil {
149149 if op , ok := binaryOperators [token .Value ]; ok {
150150 if op .precedence >= precedence {
151151 p .next ()
@@ -230,7 +230,7 @@ func (p *parser) parsePrimary() Node {
230230
231231func (p * parser ) parseConditionalExpression (node Node ) Node {
232232 var expr1 , expr2 Node
233- for p .current .Is (Operator , "?" ) {
233+ for p .current .Is (Operator , "?" ) && p . err == nil {
234234 p .next ()
235235
236236 if ! p .current .Is (Operator , ":" ) {
@@ -371,7 +371,7 @@ func (p *parser) parseMapExpression(token Token) Node {
371371 p .expect (Bracket , "{" )
372372
373373 nodes := make ([]Node , 0 )
374- for ! p .current .Is (Bracket , "}" ) {
374+ for ! p .current .Is (Bracket , "}" ) && p . err == nil {
375375 if len (nodes ) > 0 {
376376 p .expect (Operator , "," )
377377 }
@@ -404,27 +404,15 @@ func (p *parser) parseMapExpression(token Token) Node {
404404
405405func (p * parser ) parsePostfixExpression (node Node ) Node {
406406 token := p .current
407- for token .Is (Operator ) || token .Is (Bracket ) {
407+ for ( token .Is (Operator ) || token .Is (Bracket )) && p . err == nil {
408408 if token .Value == "." {
409409 p .next ()
410410
411411 token = p .current
412412 p .next ()
413413
414414 if token .Kind != Identifier &&
415- // Operators like "not" and "matches" are valid method or property names,
416- //
417- // In other words, besides name token kind, operator kind could also be parsed as a property or method.
418- // This is because operators are processed by the lexer prior to names. So "not" in "foo.not()"
419- // or "matches" in "foo.matches" will be recognized as an operator first. But in fact, "not"
420- // and "matches" in such expressions shall be parsed as method or property names.
421- //
422- // And this ONLY works if the operator consists of valid characters for a property or method name.
423- //
424- // Other types, such as text kind and number kind, can't be parsed as property nor method names.
425- //
426- // As a result, if token is NOT an operator OR token.value is NOT a valid property or method name,
427- // an error shall be returned.
415+ // Operators like "not" and "matches" are valid methods or property names.
428416 (token .Kind != Operator || ! isValidIdentifier (token .Value )) {
429417 p .error ("expected name" )
430418 }
@@ -535,7 +523,7 @@ func (p *parser) parseList(start, end string) []Node {
535523 p .expect (Bracket , start )
536524
537525 nodes := make ([]Node , 0 )
538- for ! p .current .Is (Bracket , end ) {
526+ for ! p .current .Is (Bracket , end ) && p . err == nil {
539527 if len (nodes ) > 0 {
540528 p .expect (Operator , "," )
541529 }
0 commit comments