code: def parse(self, source_desc, scope, pxd, full_module_name):
      if not isinstance(source_desc, FileSourceDescriptor):
          raise RuntimeError("Only file sources for code supported")
      source_filename = source_desc.filename
      scope.cpp = self.cpp
      # Parse the given source file and return a parse tree.
      num_errors = Errors.num_errors
      try:
          with Utils.open_source_file(source_filename) as f:
              from . import Parsing
  
              s = PyrexScanner(
                  f,
                  source_desc,
                  source_encoding=f.encoding,
                  scope=scope,
                  context=self,
              )
              tree = Parsing.p_module(s, pxd, full_module_name)
              if self.options.formal_grammar:
                  try:
                      from ..Parser import ConcreteSyntaxTree
                  except ImportError:
                      raise RuntimeError(
                          "Formal grammar can only be used with compiled Cython with an available pgen."
                      )
                  ConcreteSyntaxTree.p_module(source_filename)
      except UnicodeDecodeError as e:
          # import traceback
          # traceback.print_exc()
          raise self._report_decode_error(source_desc, e)
  
      if Errors.num_errors > num_errors:
          raise CompileError()
      return tree
  
imports: from __future__ import absolute_import
  import os
  import re
  import sys
  import io
  from .None import Errors
  from .StringEncoding import EncodedString
  from .Scanning import PyrexScanner, FileSourceDescriptor
  from .Errors import PyrexError, CompileError, error, warning
  from .Symtab import ModuleScope
  from ..None import Utils
  from .None import Options
  from .None import Version
label_desc: Use image node_id 20 for calling the Context obj's underlying member method code with example usage: obj.parse(source_desc, scope, pxd, full_module_name) and returns: tree