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 _fail_ut_eof(self, name, end_token_stack, lineno):
      expected = []
      for exprs in end_token_stack:
          expected.extend(imap(describe_token_expr, exprs))
      if end_token_stack:
          currently_looking = " or ".join(
              "'%s'" % describe_token_expr(expr)
              for expr in end_token_stack[-1]
          )
      else:
          currently_looking = None
  
      if name is None:
          message = ["Unexpected end of template."]
      else:
          message = ["Encountered unknown tag '%s'." % name]
  
      if currently_looking:
          if name is not None and name in expected:
              message.append(
                  "You probably made a nesting mistake. Jinja "
                  "is expecting this tag, but currently looking "
                  "for %s." % currently_looking
              )
          else:
              message.append(
                  "Jinja was looking for the following tags: "
                  "%s." % currently_looking
              )
  
      if self._tag_stack:
          message.append(
              "The innermost block that needs to be "
              "closed is '%s'." % self._tag_stack[-1]
          )
  
      self.fail(" ".join(message), lineno)
  
imports: from .None import nodes
  from ._compat import imap
  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 3 for calling the Parser obj's underlying member method code with example usage: obj._fail_ut_eof(name, end_token_stack, lineno) without return types