code: def parse(input_: Union[str, FileStream], source: str) -> Optional[str]:
      
  
      # Step 1: Tokenize the input stream
      error_listener = ParseErrorListener()
      if not isinstance(input_, FileStream):
          input_ = InputStream(input_)
      lexer = jsgLexer(input_)
      lexer.addErrorListener(error_listener)
      tokens = CommonTokenStream(lexer)
      tokens.fill()
      if error_listener.n_errors:
          return None
  
      # Step 2: Generate the parse tree
      parser = jsgParser(tokens)
      parser.addErrorListener(error_listener)
      parse_tree = parser.doc()
      if error_listener.n_errors:
          return None
  
      # Step 3: Transform the results the results
      parser = JSGDocParser()
      parser.visit(parse_tree)
  
      if parser.undefined_tokens():
          for tkn in parser.undefined_tokens():
              print("Undefined token: " + tkn)
          return None
  
      return parser.as_python(source)
docs: Parse the text in infile and save the results in outfile
  
      :param input_: string or stream to parse
      :param source: source name for python file header
      :return: python text if successful