code: def parse_declaration_expressn_fncall(self, name, params, es):
          
          # name of the function
          if isinstance(name, wdl_parser.Terminal):
              if name.str:
                  # use python's built-in for length()
                  if name.source_string == 'length':
                      es = es + 'len('
                  elif name.source_string == 'stdout':
                      return es + 'stdout'
                  else:
                      es = es + name.source_string + '('
              else:
                  raise NotImplementedError
          elif isinstance(name, wdl_parser.Ast):
              raise NotImplementedError
          elif isinstance(name, wdl_parser.AstList):
              raise NotImplementedError
  
          # use python's re.sub() for sub()
          if name.source_string == 'sub':
              es_params = self.parse_declaration_expressn_fncall_SUBparams(params)
          else:
              es_params = self.parse_declaration_expressn_fncall_normalparams(params)
  
          if name.source_string == 'glob':
              return es + es_params + ', tempDir)'
          elif name.source_string == 'size':
              return es + es_params + ', fileStore=fileStore)'
          else:
              return es + es_params + ')'
docs: Parses out cromwell's built-in function calls.
  
          Some of these are special
          and need minor adjustments, for example length(), which is equivalent to
          python's len() function.  Or sub, which is equivalent to re.sub(), but
          needs a rearrangement of input variables.
  
          Known to be supported: sub, size, read_tsv, length, select_first.
  
          :param name:
          :param params:
          :param es:
          :return: