code: def parse_atom(self) -> Tuple["NFAState", "NFAState"]:
      # ATOM: '(' RHS ')' | NAME | STRING
      if self.value == "(":
          self.gettoken()
          a, z = self.parse_rhs()
          self.expect(token.OP, ")")
          return a, z
      elif self.type in (token.NAME, token.STRING):
          a = NFAState()
          z = NFAState()
          a.addarc(z, self.value)
          self.gettoken()
          return a, z
      else:
          self.raise_error(
              "expected (...) or NAME or STRING, got %s/%s",
              self.type,
              self.value,
          )
          raise AssertionError
  
imports: import os
  from typing import IO, Any, Dict, Iterator, List, NoReturn, Optional, Sequence, Tuple, Union
  from blib2to3.pgen2 import grammar, token, tokenize
  from blib2to3.pgen2.tokenize import GoodTokenInfo
label_desc: Use image node_id 15 for calling the ParserGenerator obj's underlying member method code with example usage: obj.parse_atom() and returns: a,  z, a,  z