Parameters
        ----------
        token_dict : dict
            the node attribute dict belonging to a token node
        feature_string : str
            a string representing the (grammatical) features of a token
        feature_format : str
            Format of the feature string (i.e. ``attrib_val``, ``val_only`` or
            ``unknown``). A ``val_only`` string contains only the attribute
            values, e.g. ``Pos|Dat|Sg|Fem``. An ``attrib_val`` string contains
            both the attribute's name and its value, e.g.
            ``case=dat|number=sg|gender=fem|degree=pos``.

def __add_morph_features(self, token_dict, feature_string,
                             feature_format='unknown'):
        """
        Parameters
        ----------
        token_dict : dict
            the node attribute dict belonging to a token node
        feature_string : str
            a string representing the (grammatical) features of a token
        feature_format : str
            Format of the feature string (i.e. ``attrib_val``, ``val_only`` or
            ``unknown``). A ``val_only`` string contains only the attribute
            values, e.g. ``Pos|Dat|Sg|Fem``. An ``attrib_val`` string contains
            both the attribute's name and its value, e.g.
            ``case=dat|number=sg|gender=fem|degree=pos``.
        """
        assert feature_format in ('attrib_val', 'val_only', 'unknown')

        def add_val_only_features(token_dict, feature_string):
            feature_values = feature_string.split('|')
            for feat_val in feature_values:
                for morph_cat in MORPHOLOGICAL_FEATURES:
                    if feat_val in MORPHOLOGICAL_FEATURES[morph_cat]:
                        feat_name = self.ns+':'+morph_cat
                        if morph_cat == 'person':
                            token_dict[feat_name] = int(feat_val)
                        else:
                            token_dict[feat_name] = feat_val.lower()

        def add_attrib_val_features(token_dict, feature_string):
            for attrib_val_str in feature_string.split('|'):
                try:
                    attrib, val = attrib_val_str.split('=')
                    if attrib == 'person':
                        val = int(val)
                    if val != '*':
                        token_dict.update({self.ns+':'+attrib: val})
                # TODO: check, if these exceptions really occur
                except ValueError:  # if there are no attrib-val pairs
                    continue

        if feature_format == 'attrib_val':
            add_attrib_val_features(token_dict, feature_string)

        elif feature_format == 'val_only':
            add_val_only_features(token_dict, feature_string)

        else:  # if feature string contains '=', it is an attrib_val string
            if ATTRIB_VAL_REGEX.search(feature_string):
                add_attrib_val_features(token_dict, feature_string)
            else:
                add_val_only_features(token_dict, feature_string)