docstr: <Identifier> store a list of subtokens and <IdentifierList> store lists of
  subtoken list.
  
  It extracts <IdentifierList> and <Identifier> from :param token: and loops
  through all subtokens recursively. It finds table_name_preceding_token and
  passes <IdentifierList> and <Identifier> to self._process_tokenlist to populate
  self._tables.
  
  :param token: instance of Token or child class, e.g. TokenList, to be processed
code: def _extract_from_token(self, token: Token) -> None:
      """
      <Identifier> store a list of subtokens and <IdentifierList> store lists of
      subtoken list.
  
      It extracts <IdentifierList> and <Identifier> from :param token: and loops
      through all subtokens recursively. It finds table_name_preceding_token and
      passes <IdentifierList> and <Identifier> to self._process_tokenlist to populate
      self._tables.
  
      :param token: instance of Token or child class, e.g. TokenList, to be processed
      """
      if not hasattr(token, "tokens"):
          return
  
      table_name_preceding_token = False
  
      for item in token.tokens:
          if item.is_group and (
              not self._is_identifier(item)
              or isinstance(item.tokens[0], Parenthesis)
          ):
              self._extract_from_token(item)
  
          if item.ttype in Keyword and (
              item.normalized in PRECEDES_TABLE_NAME
              or item.normalized.endswith(" JOIN")
          ):
              table_name_preceding_token = True
              continue
  
          if item.ttype in Keyword:
              table_name_preceding_token = False
              continue
          if table_name_preceding_token:
              if isinstance(item, Identifier):
                  self._process_tokenlist(item)
              elif isinstance(item, IdentifierList):
                  for token2 in item.get_identifiers():
                      if isinstance(token2, TokenList):
                          self._process_tokenlist(token2)
          elif isinstance(item, IdentifierList):
              if any(
                  not self._is_identifier(token2)
                  for token2 in item.tokens
              ):
                  self._extract_from_token(item)
  
imports: import logging
  import re
  from collections.abc import Iterator
  from dataclasses import dataclass
  from typing import Any, cast, Optional
  from urllib import parse
  import sqlparse
  from sqlalchemy import and_
  from sqlparse import keywords
  from sqlparse.lexer import Lexer
  from sqlparse.sql import Identifier, IdentifierList, Parenthesis, remove_quotes, Token, TokenList, Where
  from sqlparse.tokens import Comment, CTE, DDL, DML, Keyword, Name, Punctuation, String, Whitespace, Wildcard
  from sqlparse.utils import imt
  from superset.exceptions import QueryClauseValidationException
  from superset.utils.backports import StrEnum
label_desc: Use image node_id 21 for calling the ParsedQuery obj's underlying member method code with example usage: obj._extract_from_token(token) without return types