code: def split_cl_function(cl_str):
      
      class Semantics:
  
          def __init__(self):
              self._return_type = ''
              self._function_name = ''
              self._parameter_list = []
              self._cl_body = ''
  
          def result(self, ast):
              return self._return_type, self._function_name, self._parameter_list, self._cl_body
  
          def address_space(self, ast):
              self._return_type = ast.strip() + ' '
              return ast
  
          def data_type(self, ast):
              self._return_type += ''.join(ast).strip()
              return ast
  
          def function_name(self, ast):
              self._function_name = ast.strip()
              return ast
  
          def arglist(self, ast):
              if ast != '()':
                  self._parameter_list = ast
              return ast
  
          def body(self, ast):
              def join(items):
                  result = ''
                  for item in items:
                      if isinstance(item, str):
                          result += item
                      else:
                          result += join(item)
                  return result
  
              self._cl_body = join(ast).strip()[1:-1]
              return ast
  
      return _split_cl_function_parser.parse(cl_str, semantics=Semantics())
docs: Split an CL function into a return type, function name, parameters list and the body.
  
      Args:
          cl_str (str): the CL code to parse and plit into components
  
      Returns:
          tuple: string elements for the return type, function name, parameter list and the body