class_docstr: This is the central parsing class Jinja uses.  It's passed to
  extensions and can be used to parse expressions or statements.
class_docstr_tok: ["This","is","the","central","parsing","class","Jinja","uses",".","It","'s","passed","to","extensions","and","can","be","used","to","parse","expressions","or","statements","."]
code: def parse_compare(self) -> nodes.Expr:
      lineno = self.stream.current.lineno
      expr = self.parse_math1()
      ops = []
      while True:
          token_type = self.stream.current.type
          if token_type in _compare_operators:
              next(self.stream)
              ops.append(nodes.Operand(token_type, self.parse_math1()))
          elif self.stream.skip_if("name:in"):
              ops.append(nodes.Operand("in", self.parse_math1()))
          elif self.stream.current.test(
              "name:not"
          ) and self.stream.look().test("name:in"):
              self.stream.skip(2)
              ops.append(nodes.Operand("notin", self.parse_math1()))
          else:
              break
          lineno = self.stream.current.lineno
      if not ops:
          return expr
      return nodes.Compare(expr, ops, lineno=lineno)
  
imports: import typing
  import typing
  from .None import nodes
  from .exceptions import TemplateAssertionError
  from .exceptions import TemplateSyntaxError
  from .lexer import describe_token
  from .lexer import describe_token_expr
label_desc: Use image node_id 34 for calling the Parser obj's underlying member method code with example usage: obj.parse_compare() and returns: nodes, expr