3030from .filter import InfixExpression
3131from .filter import IntegerLiteral
3232from .filter import ListLiteral
33+ from .filter import Literal
34+ from .filter import Nil
3335from .filter import Path
3436from .filter import PrefixExpression
3537from .filter import RegexLiteral
@@ -191,6 +193,7 @@ class Parser:
191193 "<=" ,
192194 "<" ,
193195 "!=" ,
196+ "=~" ,
194197 ]
195198 )
196199
@@ -477,6 +480,13 @@ def parse_filter(self, stream: TokenStream) -> Filter:
477480 f"result of { expr .name } () must be compared" , token = tok
478481 )
479482
483+ if isinstance (expr , (Literal , Nil )):
484+ raise JSONPathSyntaxError (
485+ "filter expression literals outside of "
486+ "function expressions must be compared" ,
487+ token = tok ,
488+ )
489+
480490 return Filter (env = self .env , token = tok , expression = BooleanExpression (expr ))
481491
482492 def parse_boolean (self , stream : TokenStream ) -> FilterExpression :
@@ -520,6 +530,20 @@ def parse_infix_expression(
520530 self ._raise_for_non_comparable_function (left , tok )
521531 self ._raise_for_non_comparable_function (right , tok )
522532
533+ if operator not in self .COMPARISON_OPERATORS :
534+ if isinstance (left , Literal ):
535+ raise JSONPathSyntaxError (
536+ "filter expression literals outside of "
537+ "function expressions must be compared" ,
538+ token = tok ,
539+ )
540+ if isinstance (right , Literal ):
541+ raise JSONPathSyntaxError (
542+ "filter expression literals outside of "
543+ "function expressions must be compared" ,
544+ token = tok ,
545+ )
546+
523547 return InfixExpression (left , operator , right )
524548
525549 def parse_grouped_expression (self , stream : TokenStream ) -> FilterExpression :
@@ -532,14 +556,20 @@ def parse_grouped_expression(self, stream: TokenStream) -> FilterExpression:
532556 raise JSONPathSyntaxError (
533557 "unbalanced parentheses" , token = stream .current
534558 )
559+
560+ if stream .current .kind not in self .BINARY_OPERATORS :
561+ raise JSONPathSyntaxError (
562+ f"expected an expression, found '{ stream .current .value } '" ,
563+ token = stream .current ,
564+ )
565+
535566 expr = self .parse_infix_expression (stream , expr )
536567
537568 stream .expect (TOKEN_RPAREN )
538569 return expr
539570
540571 def parse_root_path (self , stream : TokenStream ) -> FilterExpression :
541572 root = stream .next_token ()
542- assert root .kind in {TOKEN_ROOT , TOKEN_FAKE_ROOT } # XXX:
543573 return RootPath (
544574 JSONPath (
545575 env = self .env ,
0 commit comments