From 05086d573805674d1d187bbd149cb08fb08f8384 Mon Sep 17 00:00:00 2001
From: Michał Lenart <michall@ipipan.waw.pl>
Date: Fri, 22 Aug 2014 16:42:33 +0000
Subject: [PATCH] dodanie obsługi nazw własnych i kwalifikatorów w segmentacji

---
 fsabuilder/morfeusz_builder                                      |   8 ++++----
 fsabuilder/morfeuszbuilder/fsa/convertinput.py                   |  18 ++++++++++++------
 fsabuilder/morfeuszbuilder/segrules/rulesManager.py              |   4 ++--
 fsabuilder/morfeuszbuilder/segrules/rulesParser.py               |   6 ++++--
 fsabuilder/morfeuszbuilder/tagset/segtypes.py                    | 278 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------
 input/segmenty.dat                                               | 350 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 nbproject/configurations.xml                                     |  12 ------------
 tests/analyzer/test_digits/segmentation.dat                      |   6 +++---
 tests/analyzer/test_names/segmentation.dat                       |   6 +++---
 tests/analyzer/test_qualifiers/segmentation.dat                  |   6 +++---
 tests/analyzer/test_segtypes/ARGS                                |   1 +
 tests/analyzer/test_segtypes/dictionary.tab                      |  11 +++++++++++
 tests/analyzer/test_segtypes/input.txt                           |   9 +++++++++
 tests/analyzer/test_segtypes/output.txt                          |  11 +++++++++++
 tests/analyzer/test_segtypes/segmentation.dat                    |  45 +++++++++++++++++++++++++++++++++++++++++++++
 tests/analyzer/test_segtypes/tagset.dat                          | 774 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/generator/test_additional_atomic_segments/segmentation.dat |   6 +++---
 tests/generator/test_digits/segmentation.dat                     |   6 +++---
 tests/generator/test_names/segmentation.dat                      |   6 +++---
 tests/generator/test_qualifiers/segmentation.dat                 |   6 +++---
 tests/generator/test_segtypes/ARGS                               |   1 +
 tests/generator/test_segtypes/dictionary.tab                     |  11 +++++++++++
 tests/generator/test_segtypes/input.txt                          |   9 +++++++++
 tests/generator/test_segtypes/output.txt                         |  11 +++++++++++
 tests/generator/test_segtypes/segmentation.dat                   |  45 +++++++++++++++++++++++++++++++++++++++++++++
 tests/generator/test_segtypes/tagset.dat                         | 774 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 26 files changed, 2069 insertions(+), 351 deletions(-)
 create mode 100644 tests/analyzer/test_segtypes/ARGS
 create mode 100644 tests/analyzer/test_segtypes/dictionary.tab
 create mode 100644 tests/analyzer/test_segtypes/input.txt
 create mode 100644 tests/analyzer/test_segtypes/output.txt
 create mode 100644 tests/analyzer/test_segtypes/segmentation.dat
 create mode 100644 tests/analyzer/test_segtypes/tagset.dat
 create mode 100644 tests/generator/test_segtypes/ARGS
 create mode 100644 tests/generator/test_segtypes/dictionary.tab
 create mode 100644 tests/generator/test_segtypes/input.txt
 create mode 100644 tests/generator/test_segtypes/output.txt
 create mode 100644 tests/generator/test_segtypes/segmentation.dat
 create mode 100644 tests/generator/test_segtypes/tagset.dat

diff --git a/fsabuilder/morfeusz_builder b/fsabuilder/morfeusz_builder
index 9c6be2e..3d2825b 100644
--- a/fsabuilder/morfeusz_builder
+++ b/fsabuilder/morfeusz_builder
@@ -180,15 +180,15 @@ def _concatFiles(inputFiles):
 
 def _readNamesAndQualifiers(inputFiles):
     names = set([u''])
-    qualifiers = set([tuple(frozenset([u'']))])
+    qualifiers = set([frozenset()])
     for line in _concatFiles(inputFiles):
         line = line.strip().decode('utf8')
         if line:
             _, _, _, name, qualifier = convertinput.parseLine(line)
             names.add(name)
-            qualifiers.add(tuple(sorted(qualifier.split(u'|'))))
+            qualifiers.add(convertinput.parseQualifiers(qualifier))
     namesMap = dict([(name, idx) for idx, name in enumerate(sorted(list(names)))])
-    qualifiersMap = dict([(frozenset(quals), idx) for idx, quals in enumerate(sorted(list(qualifiers)))])
+    qualifiersMap = dict([(quals, idx) for idx, quals in enumerate(sorted(qualifiers, key=lambda q: tuple(sorted(q))))])
     exceptions.validate(
                     len(qualifiersMap) <= limits.MAX_QUALIFIERS_COMBINATIONS, 
                     u'Too many qualifiers combinations. The limit is %d' % limits.MAX_QUALIFIERS_COMBINATIONS)
@@ -259,7 +259,7 @@ def _doBuildDictionaryPart(opts, tagset, namesMap, qualifiersMap, isGenerator):
     
     logging.info('reading segmentation rules')
     rulesParserVersion = rulesParser.RulesParser.PARSE4ANALYZER if not isGenerator else rulesParser.RulesParser.PARSE4GENERATOR
-    segmentRulesManager = rulesParser.RulesParser(tagset, rulesParserVersion).parse(opts.segmentsFile)
+    segmentRulesManager = rulesParser.RulesParser(tagset, namesMap, qualifiersMap, rulesParserVersion).parse(opts.segmentsFile)
     segmentationRulesData = segmentRulesManager.serialize()
     logging.info('done reading segmentation rules')
     
diff --git a/fsabuilder/morfeuszbuilder/fsa/convertinput.py b/fsabuilder/morfeuszbuilder/fsa/convertinput.py
index deb937f..33f4fae 100644
--- a/fsabuilder/morfeuszbuilder/fsa/convertinput.py
+++ b/fsabuilder/morfeuszbuilder/fsa/convertinput.py
@@ -43,6 +43,12 @@ def parseLine(line):
         raise ValueError('input line "%s" does not have 3, 4 or 5 tab-separated fields' % line)
     return orth, base, tag, name, qualifier
 
+def parseQualifiers(string):
+    if string:
+        return frozenset(string.split(u'|'))
+    else:
+        return frozenset()
+
 class PolimorfConverter4Analyzer(object):
     
     def __init__(self, tagset, namesMap, qualifiersMap, encoder, inputEncoding, segmentRulesManager):
@@ -62,9 +68,9 @@ class PolimorfConverter4Analyzer(object):
                 
                 tagnum = self.tagset.getTagnum4Tag(tag)
                 namenum = self.namesMap[name]
-                typenum = self.segmentRulesManager.lexeme2SegmentTypeNum(base, tagnum)
-                qualifiers = qualifier.split('|') if qualifier else frozenset([u''])
-                qualsnum = self.qualifiersMap[frozenset(qualifiers)]
+                qualifiers = parseQualifiers(qualifier)
+                qualsnum = self.qualifiersMap[qualifiers]
+                typenum = self.segmentRulesManager.lexeme2SegmentTypeNum(base, tagnum, namenum, qualsnum)
 
                 assert not (
                     self.segmentRulesManager.shiftOrthMagic.shouldReplaceLemmaWithOrth(typenum)
@@ -138,9 +144,9 @@ class PolimorfConverter4Generator(object):
                             base, homonymId = assumedBase, assumedHomonymId
                     tagnum = self.tagset.getTagnum4Tag(tag)
                     namenum = self.namesMap[name]
-                    qualifiers = qualifier.split('|') if qualifier else frozenset([u''])
-                    qualsnum = self.qualifiersMap[frozenset(qualifiers)]
-                    typenum = self.segmentRulesManager.lexeme2SegmentTypeNum(base, tagnum)
+                    qualifiers = parseQualifiers(qualifier)
+                    qualsnum = self.qualifiersMap[qualifiers]
+                    typenum = self.segmentRulesManager.lexeme2SegmentTypeNum(base, tagnum, namenum, qualsnum)
 
                     if self.segmentRulesManager.shiftOrthMagic.shouldReplaceLemmaWithOrth(typenum):
                         # print 'replace %s %s %s %d with %s %s %s %d' % (orth, base, tag, typenum, orth, orth, tag, typenum)
diff --git a/fsabuilder/morfeuszbuilder/segrules/rulesManager.py b/fsabuilder/morfeuszbuilder/segrules/rulesManager.py
index ac1cf76..182e53a 100644
--- a/fsabuilder/morfeuszbuilder/segrules/rulesManager.py
+++ b/fsabuilder/morfeuszbuilder/segrules/rulesManager.py
@@ -33,8 +33,8 @@ class RulesManager(object):
     def addDFA(self, optionsMap, dfa):
         self.options2DFA[self._options2Key(optionsMap)] = dfa
     
-    def lexeme2SegmentTypeNum(self, lemma, tagnum):
-        res = self.segtypes.lexeme2Segnum(lemma, tagnum)
+    def lexeme2SegmentTypeNum(self, lemma, tagnum, namenum, labelsnum):
+        res = self.segtypes.lexeme2Segnum(lemma, tagnum, namenum, labelsnum)
         if res is None:
             raise ValueError()
         else:
diff --git a/fsabuilder/morfeuszbuilder/segrules/rulesParser.py b/fsabuilder/morfeuszbuilder/segrules/rulesParser.py
index 190a61b..611f56f 100644
--- a/fsabuilder/morfeuszbuilder/segrules/rulesParser.py
+++ b/fsabuilder/morfeuszbuilder/segrules/rulesParser.py
@@ -13,8 +13,10 @@ class RulesParser(object):
     PARSE4GENERATOR = 1
     PARSE4ANALYZER = 2
     
-    def __init__(self, tagset, rulesType):
+    def __init__(self, tagset, namesMap, labelsMap, rulesType):
         self.tagset = tagset
+        self.namesMap = namesMap
+        self.labelsMap = labelsMap
         assert rulesType in (RulesParser.PARSE4GENERATOR, RulesParser.PARSE4ANALYZER)
         self.rulesType = rulesType
     
@@ -43,7 +45,7 @@ class RulesParser(object):
                                                     'segment types', 
                                                     'separator chars'])
         key2Defs = self._getKey2Defs(segtypesConfigFile)
-        segtypesHelper = segtypes.Segtypes(self.tagset, segtypesConfigFile)
+        segtypesHelper = segtypes.Segtypes(self.tagset, self.namesMap, self.labelsMap, segtypesConfigFile)
         separatorsList = separatorChars.parseSeparatorChars(segtypesConfigFile) \
             if self.rulesType == RulesParser.PARSE4ANALYZER \
             else []
diff --git a/fsabuilder/morfeuszbuilder/tagset/segtypes.py b/fsabuilder/morfeuszbuilder/tagset/segtypes.py
index e3b7222..cc639f6 100644
--- a/fsabuilder/morfeuszbuilder/tagset/segtypes.py
+++ b/fsabuilder/morfeuszbuilder/tagset/segtypes.py
@@ -5,7 +5,7 @@ Created on 17 lut 2014
 '''
 import re
 import logging
-import sys
+import itertools
 from morfeuszbuilder.utils import exceptions
 
 def _cutHomonymFromLemma(lemma):
@@ -15,19 +15,25 @@ def _cutHomonymFromLemma(lemma):
 
 class Segtypes(object):
     
-    def __init__(self, tagset, segrulesConfigFile):
+    def __init__(self, tagset, namesMap, labelsMap, segrulesConfigFile):
         
         self.tagset = tagset
+        self.namesMap = namesMap
+        self.labelsMap = labelsMap
+        self._reverseLabelsMap = dict([(v, k) for (k, v) in labelsMap.iteritems()])
         
         self.filename = segrulesConfigFile.filename
         
-        self.segtypes = set()
-        self.segtype2Segnum = {}
-        self.segnum2Segtype = {}
+        self.segtypes = []
+        # self.segtype2Segnum = {}
+        # self.segnum2Segtype = {}
         self.patternsList = []
-        
-        self._tagnum2Segnum = {}
-        self._lemmaTagnum2Segnum = {}
+
+        # (lemma, tagnum) -> [namenum, labelsnum, segnum]
+        self._segnumsMap = {}
+
+        # self._tagnum2Segnum = {}
+        # self._lemmaTagnum2Segnum = {}
         
         self._readSegtypes(segrulesConfigFile)
         self._readLexemes(segrulesConfigFile)
@@ -38,11 +44,9 @@ class Segtypes(object):
 #         print self._tagnum2Segnum
         logging.info('segment number -> segment type')
         logging.info('------------------------------')
-        logging.info(str(self.segnum2Segtype))
+        logging.info(dict(enumerate(self.segtypes)))
         logging.info('------------------------------')
         
-#         self._debugSegnums()
-        
     def _validate(self, msg, lineNum, cond):
         if not cond:
             raise exceptions.ConfigFileException(self.filename, lineNum, msg)
@@ -58,155 +62,171 @@ class Segtypes(object):
                            u'Segment type already defined: "%s"' % line, 
                            lineNum,
                            line not in self.segtypes)
-            self.segtypes.add(line)
-                
-    
+            self.segtypes.append(line)
+
     def _readTags(self, segrulesConfigFile):
         gotWildcardPattern = False
         for lineNum, line in segrulesConfigFile.enumerateLinesInSection('tags'):
-            splitLine = re.split(r'\s+', line.strip())
-            self._validate(
-                           u'Line in [tags] section must contain exactly two fields - segment type and tag pattern', 
-                           lineNum,
-                           len(splitLine) == 2)
-            segtype, pattern = splitLine
-            self._validate(
-                           u'Undeclared segment type: "%s"' % segtype,
-                           lineNum,
-                           segtype in self.segtypes)
-            self._validate(
-                           u'Segment type must be a lowercase alphanumeric with optional underscores',
-                           lineNum,
-                           re.match(r'[a-z_]+', segtype))
-            self._validate(
-                           u'Pattern must contain only ":", "%", "." and lowercase alphanumeric letters',
-                           lineNum,
-                           re.match(r'[a-z_\.\:\%]+', pattern))
-            
-            self._validate(
-                           u'Pattern that matches everything must be the last one',
-                           lineNum - 1,
-                           not gotWildcardPattern)
-            
-            if segtype in self.segtype2Segnum:
-                segnum = self.segtype2Segnum[segtype]
-            else:
-                segnum = len(self.segtype2Segnum)
-                self.segtype2Segnum[segtype] = segnum
-            
-            segtypePattern = SegtypePattern(None, pattern, segnum)
-            
+            self._parsePattern(lineNum, line, withLemma=False)
             self._validate(
-                           u'There is no tag that matches pattern "%s".' % pattern,
-                           lineNum,
-                           any([segtypePattern.tryToMatch(None, tag) != -1 for tag in self.tagset.getAllTags()]))
-            
-            self.patternsList.append(segtypePattern)
-            
-            gotWildcardPattern = gotWildcardPattern or pattern == '%'
-        
-        self.segnum2Segtype = dict([(v, k) for (k, v) in self.segtype2Segnum.iteritems()])
+                u'Pattern that matches everything must be the last one',
+                lineNum - 1,
+                not gotWildcardPattern)
+            gotWildcardPattern = gotWildcardPattern or self.patternsList[-1].isWildcardPattern()
+
+        self._validate(
+            u'There must be a pattern that matches everything at the end of [tags] section',
+            lineNum,
+            self.patternsList[-1].isWildcardPattern())
     
     def _readLexemes(self, segrulesConfigFile):
         for lineNum, line in segrulesConfigFile.enumerateLinesInSection('lexemes'):
-            split = re.split(r'\s+', line.strip())
-            self._validate(
-                           u'Line in [lexemes] section must contain exactly two fields - segment type and lexeme pattern',
-                           lineNum,
-                           len(split) == 2)
-            segtype, pattern = split
+            self._parsePattern(lineNum, line, withLemma=True)
+
+    def _parseAdditionalConstraints(self, lineNum, fields):
+        res = {}
+        for f in fields:
+            match = re.match(r'(name|labels)=([\w_]+)', f, re.U)
             self._validate(
-                           u'Undeclared segment type: "%s"' % segtype,
-                           lineNum,
-                           segtype in self.segtypes)
+                        u'invalid name or labels constraint: "%s"' % f,
+                        lineNum,
+                        match)
+            key = match.group(1)
+            value = match.group(2)
             self._validate(
-                           u'Segment type must be a lowercase alphanumeric with optional underscores',
-                           lineNum,
-                           re.match(r'[a-z_]+', segtype))
+                u'%s already specified' % key,
+                lineNum,
+                key not in res)
+            if key == 'labels':
+                if value:
+                    value = frozenset(value.split(u'|'))
+                else:
+                    value = frozenset()
+            res[key] = value
+        return res
+
+    def _parsePattern(self, lineNum, line, withLemma):
+        split = re.split(r'\s+', line.strip())
+        if withLemma:
             self._validate(
-                           u'Pattern must contain encodedForm and part-of-speech fields',
-                           lineNum,
-                           re.match(r'.+?\:[a-z_]+', pattern, re.U))
-            
-            if segtype in self.segtype2Segnum:
-                segnum = self.segtype2Segnum[segtype]
-            else:
-                segnum = len(self.segtype2Segnum)
-                self.segtype2Segnum[segtype] = segnum
-            
-            lemma, pos = pattern.split(':', 1)
-            
-            segtypePattern = SegtypePattern(lemma, pos + ':%', segnum)
-            
+                u'Line in [lexemes] section must contain 3 to 5 fields - segment type, lemma, tag pattern and optional constraints on name and labels',
+                lineNum,
+                len(split) in [3, 4, 5])
+            segtype = split[0]
+            lemma = split[1]
+            pattern = split[2]
+            additionalConstraints = self._parseAdditionalConstraints(lineNum, split[3:])
+        else:
             self._validate(
-                           u'There is no tag that matches pattern "%s".' % (pos + ':%'),
-                           lineNum,
-                           any([segtypePattern.tryToMatch(lemma, tag) != -1 for tag in self.tagset.getAllTags()]))
-            
-            self.patternsList.append(segtypePattern)
-    
-    def _debugSegnums(self):
-        for tagnum, segnum in self._tagnum2Segnum.items():
-            print self.tagset.getTag4Tagnum(tagnum), '-->', self.segnum2Segtype[segnum]
-        
-        for (base, tagnum), segnum in self._lemmaTagnum2Segnum.items():
-            print base, self.tagset.getTag4Tagnum(tagnum), '-->', self.segnum2Segtype[segnum]
-    
-    def _indexSegnums(self):
-#         logging.info('indexing segment type numbers...')
-        # index tags
+                u'Line in [tags] section must contain 2 to 4 fields - segment type, tag pattern and optional constraints on name and labels',
+                lineNum,
+                len(split) in [2, 3, 4])
+            segtype = split[0]
+            lemma = None
+            pattern = split[1]
+            additionalConstraints = self._parseAdditionalConstraints(lineNum, split[2:])
+        self._validate(
+            u'Undeclared segment type: "%s"' % segtype,
+            lineNum,
+            segtype in self.segtypes)
+        segnum = self.segtypes.index(segtype)
+
+        self._validate(
+            u'Pattern must contain only ":", "%", "." and lowercase alphanumeric letters',
+            lineNum,
+            re.match(r'[a-z_\.\:\%]+', pattern))
+
+        segtypePattern = SegtypePattern(
+            lemma,
+            pattern,
+            additionalConstraints.get('name', u''),
+            additionalConstraints.get('labels', frozenset()),
+            segnum)
+        # print 'segtypePattern', repr(str(segtypePattern))
+        self._validate(
+            u'There is no tag that matches pattern "%s".' % (pattern),
+            lineNum,
+            any([segtypePattern.tryToMatch(lemma, tag) != -1 for tag in self.tagset.getAllTags()]))
+        self.patternsList.append(segtypePattern)
+
+    def _getAllExistingLabelsnumCombinations(self, labels):
+        if labels:
+            for labelsCombination, labelsnum in self.labelsMap.iteritems():
+                if labels <= labelsCombination:
+                    yield labelsnum
+        else:
+            yield 0
+
+    def _indexOnePattern(self, p):
+
         for tag in self.tagset.getAllTags():
-            tagnum = self.tagset.getTagnum4Tag(tag)
-            for p in self.patternsList:
-                segnum = p.tryToMatch(None, tag)
-                if segnum >= 0 and tagnum not in self._tagnum2Segnum:
-                    self._tagnum2Segnum[tagnum] = segnum
-        
+            segnum = p.tryToMatch(p.lemma, tag)
+            if segnum != -1:
+                tagnum = self.tagset.getTagnum4Tag(tag)
+                self._segnumsMap.setdefault((p.lemma, tagnum), [])
+                namenum = self.namesMap[p.name]
+                for labelsnum in self._getAllExistingLabelsnumCombinations(p.labels):
+                    self._segnumsMap[(p.lemma, tagnum)].append((namenum, labelsnum, segnum))
+
+    def _indexSegnums(self):
+        logging.info('indexing segment type numbers...')
+
         # index lexemes
         for p in self.patternsList:
-            if p.lemma:
-                for tag in self.tagset.getAllTags():
-                    tagnum = self.tagset.getTagnum4Tag(tag)
-                    if not (p.lemma, tagnum) in self._lemmaTagnum2Segnum:
-                        segnum = p.tryToMatch(p.lemma, tag)
-                        if segnum != -1:
-                            self._lemmaTagnum2Segnum[(p.lemma, tagnum)] = segnum
-#         logging.info('indexing segment type numbers - done')
-#         self._debugSegnums()
+            self._indexOnePattern(p)
+
+        # logging.info(self._segnumsMap)
     
     def hasSegtype(self, segTypeString):
-        return segTypeString in self.segtype2Segnum
+        # return segTypeString in self.segtype2Segnum
+        return segTypeString in self.segtypes
     
     def getSegnum4Segtype(self, segTypeString):
-        return self.segtype2Segnum[segTypeString]
+        return self.segtypes.index(segTypeString)
+        # return self.segtype2Segnum[segTypeString]
     
-    def lexeme2Segnum(self, lemma, tagnum):
-        lemma = _cutHomonymFromLemma(lemma)
-        res = self._lemmaTagnum2Segnum.get((lemma, tagnum), None)
-        if res is None:
-            res = self._tagnum2Segnum.get(tagnum, None)
-        return res
+    def lexeme2Segnum(self, lemma, tagnum, namenum, labelsnum):
+
+        if (lemma, tagnum) in self._segnumsMap:
+            for (n, l, segnum) in self._segnumsMap[(lemma, tagnum)]:
+                if (n, l) == (namenum, labelsnum) \
+                        or (n, l) == (0, 0)\
+                        or (n == 0 and l == labelsnum)\
+                        or (l == 0 and n == namenum):
+                    return segnum
+
+        if not lemma is None:
+            return self.lexeme2Segnum(None, tagnum, namenum, labelsnum)
+        else:
+            assert False
 
     def getMaxSegnum(self):
-        return max(self.segnum2Segtype.keys())
+        return len(self.segtypes) - 1
     
 class SegtypePattern(object):
     
-    def __init__(self, lemma, pattern, segnum):
+    def __init__(self, lemma, pattern, name, labels, segnum):
         self.lemma = _cutHomonymFromLemma(lemma)
         self.pattern = pattern
+        self.name = name
+        self.labels = labels
         self.segnum = segnum
-    
+
     def tryToMatch(self, lemma, tag):
-#         tag2Match = tag + ':' if not tag.endswith(':') else tag
-#         print tag2Match
         patterns2Match = []
         patterns2Match.append(self.pattern.replace('%', '.*'))
         patterns2Match.append(re.sub(r'\:\%$', '', self.pattern).replace('%', '.*'))
-        lemma = _cutHomonymFromLemma(lemma)
-        if (self.lemma is None or self.lemma == lemma) \
-        and any([re.match(p, tag) for p in patterns2Match]):
+        # patterns2Match.append(re.sub(r'$', ':%', self.pattern).replace('%', '.*'))
+        if self.lemma is None:
+            lemma = None
+        if any([re.match('^'+p+'$', tag) for p in patterns2Match]) \
+                and self.lemma == lemma:
             return self.segnum
         else:
-#             print 'NOT match', lemma.encode('utf8') if lemma else '%', tag, self.segnum
             return -1
+
+    def isWildcardPattern(self):
+        return (self.lemma, self.pattern, self.name, self.labels) == (None, '%', u'', frozenset())
+
+    def __str__(self):
+        return u'%s %s %s %s -> %d' % (self.lemma, self.pattern, self.name, self.labels, self.segnum)
diff --git a/input/segmenty.dat b/input/segmenty.dat
index 025415a..994310c 100644
--- a/input/segmenty.dat
+++ b/input/segmenty.dat
@@ -506,181 +506,181 @@ pred		pred
 samodz		%
 
 [lexemes]
-tym	tym:adv
-bardziej	bardziej:adv
-niemniej	niemniej:qub
-pewno	pewno:qub
-pol_zloz	pół:num:comp
-i	i:conj
-by	by:qub
-li	li:qub
-ze	+że:qub
-z	+ż:qub
-killfile	+ć:qub
-killfile	+anka:subst:%
-killfile	+owa:subst:%
-killfile	+anka:subst:%
-killfile	+ina:subst:%
-killfile	+yna:subst:%
-killfile	+ówna:subst:%
-z_aglt_by	aby:comp
-z_aglt	bowiem:comp
-z_aglt_by	by:comp
-z_aglt	cóż:subst
-z_aglt_nwok	czemu:adv
-z_aglt_by	czyżby:qub
-z_aglt_by	choćby:comp
-z_aglt_by	chociażby:comp
-z_aglt_nwok	dlaczego:adv
-z_aglt_nwok	dopóki:comp
-z_aglt_nwok	dopóty:conj
-z_aglt_by	gdyby:comp
-z_aglt_nwok	gdy:adv
-z_aglt_nwok	gdzie:qub
-z_aglt_nwok	gdzie:adv
-z_aglt_nwok	kto:subst:%
-z_aglt_by	jakby:comp
-z_aglt_by	jakoby:comp
-z_aglt_nwok	kiedy:adv
-z_aglt_nwok	kiedy:comp
-z_aglt_nwok	tylko:qub
-z_aglt_by	żeby:comp
-z_aglt_nwok	to:conj
-z_aglt_nwok	chyba:qub
-z_aglt_nwok	że:qub
-z_aglt_nwok	czy:conj
-z_aglt_by	oby:qub
-z_aglt_by	bodajby:qub
-z_aglt_nwok	co:comp
-z_aglt_nwok	bo:comp
-z_aglt_nwok	byle:comp
-z_aglt_by	byleby:comp
-dywiz	-:interp
-pauza	—:interp
-polpauza	–:interp
-kropka	.:interp
-przecinek	,:interp
-n	on:ppron3:sg:gen.acc:m1.m2.m3:ter:nakc:praep
-adj_anty_zloz	ten:adj:%
-adj_anty_zloz	tenże:adj:%
-adj_anty_zloz	ck:adj:%
-adj_anty_zloz	c.k.:adj:%
-adj_anty_zloz	ki:adj:%
-adj_anty_zloz	si:adj:%
-adj_anty_zloz	ow:adj:%
-adj_anty_zloz	ów:adj:%
-adj_anty_zloz	ówże:adj:%
-adj_anty_zloz	mój:adj:%
-adj_anty_zloz	a-z:adj:%
-adj_anty_zloz	a-ż:adj:%
-adj_anty_zloz	kiż:adj:%
-adj_anty_zloz	be:adj:%
-adj_anty_zloz	caca:adj:%
-adj_anty_zloz	czyj:adj:%
-adj_anty_zloz	oboj:adj:%
-adj_anty_zloz	on:adj:%
-adj_anty_zloz	tyli:adj:%
-adj_anty_zloz	rany:adj:%
-adj_anty_zloz	taki:adj:%
-adj_anty_zloz	pop:adj:%
-subst_anty_zloz	co:subst:%
-subst_anty_zloz	ar:subst:%:m3
-subst_anty_zloz	as:subst:%:m2
-subst_anty_zloz	as:subst:%:m1
-subst_anty_zloz	as:subst:%:m2
-subst_anty_zloz	as:subst:%:m3
-subst_anty_zloz	as:subst:%:n2
-subst_anty_zloz	at:subst:%:n2
-subst_anty_zloz	at:subst:%:m2
-subst_anty_zloz	az:subst:%:m1
-subst_anty_zloz	be:subst:%:n2
-subst_anty_zloz	bp:subst:%:m1
-subst_anty_zloz	ce:subst:%:n2
-subst_anty_zloz	de:subst:%:n2
-subst_anty_zloz	do:subst:%:n2
-subst_anty_zloz	dr:subst:%:m1
-subst_anty_zloz	ef:subst:%:n2
-subst_anty_zloz	el:subst:%:n2
-subst_anty_zloz	em:subst:%:n2
-subst_anty_zloz	en:subst:%:n2
-subst_anty_zloz	er:subst:%:n2
-subst_anty_zloz	es:subst:%:m3
-subst_anty_zloz	es:subst:%:n2
-subst_anty_zloz	fa:subst:%:n2
-subst_anty_zloz	go:subst:%:n2
-subst_anty_zloz	ha:subst:%:n2
-subst_anty_zloz	id:subst:%:m3
-subst_anty_zloz	id:subst:%:n2
-subst_anty_zloz	in:subst:%:n2
-subst_anty_zloz	ka:subst:%:n2
-subst_anty_zloz	kb:subst:%:m3
-subst_anty_zloz	km:subst:%:m3
-subst_anty_zloz	ku:subst:%:n2
-subst_anty_zloz	la:subst:%:n2
-subst_anty_zloz	li:subst:%:n2
-subst_anty_zloz	li:subst:%:f
-subst_anty_zloz	mi:subst:%:n2
-subst_anty_zloz	ni:subst:%:n2
-subst_anty_zloz	no:subst:%:n2
-subst_anty_zloz	nr:subst:%:m3
-subst_anty_zloz	om:subst:%:m3
-subst_anty_zloz	oz:subst:%:m3
-subst_anty_zloz	pe:subst:%:n2
-subst_anty_zloz	pi:subst:%:n2
-subst_anty_zloz	re:subst:%:n2
-subst_anty_zloz	rh:subst:%:n2
-subst_anty_zloz	ro:subst:%:n2
-subst_anty_zloz	si:subst:%:n2
-subst_anty_zloz	su:subst:%:n2
-subst_anty_zloz	te:subst:%:n2
-subst_anty_zloz	tv:subst:%:f
-subst_anty_zloz	ud:subst:%:m3
-subst_anty_zloz	uf:subst:%:m3
-subst_anty_zloz	ul:subst:%:m3
-subst_anty_zloz	um:subst:%:m3
-subst_anty_zloz	ut:subst:%:n2
-subst_anty_zloz	vw:subst:%:m3
-subst_anty_zloz	vw:subst:%:n2
-subst_anty_zloz	wc:subst:%:n2
-subst_anty_zloz	we:subst:%:n2
-subst_anty_zloz	wf:subst:%:m3
-subst_anty_zloz	wu:subst:%:n2
-prep_na		na:prep:%
-prep_n		do:prep:%
-prep_n		dla:prep:%
-prep_n		koło:prep:%
-prep_n		o:prep:%
-prep_n		po:prep:%
-prep_n		poza:prep:%
-prep_n		spoza:prep:%
-prep_n		za:prep:%
-prep_n		zza:prep:%
-sufs	+znawca:subst:%
-sufs	+dawca:subst:%
-sufs	+biorca:subst:%
-sufs	+żerca:subst:%
-sufs	+maniak:subst:%
-sufs	+logia:subst:%
-sufs	+log:subst:%
-suf_num	+latek:subst:%
-suf_num	+latka:subst:%
-suf_num	+lecie:subst:%
-suf_num	+krotność:subst:%
-suf_ord	ty:adj:%
-suf_ord	y:adj:%
-rom_i	I:romandig
-rom_v	V:romandig
-rom_x	X:romandig
-rom_l	L:romandig
-rom_d	D:romandig
-rom_c	C:romandig
-rom_m	M:romandig
-ja	ja:ppron12:sg:nom:%
-ty	ty:ppron12:sg:nom:%
-my	my:ppron12:pl:nom:%
-wy	wy:ppron12:pl:nom:%
-pref_dyw	e-+:prefa
-pref_dyw	e-+:prefs
+tym	tym	adv
+bardziej	bardziej	adv
+niemniej	niemniej	qub
+pewno	pewno	qub
+pol_zloz	pół	num:comp
+i	i	conj
+by	by	qub
+li	li	qub
+ze	+że	qub
+z	+ż	qub
+killfile	+ć	qub
+killfile	+anka	subst:%
+killfile	+owa	subst:%
+killfile	+anka	subst:%
+killfile	+ina	subst:%
+killfile	+yna	subst:%
+killfile	+ówna	subst:%
+z_aglt_by	aby	comp
+z_aglt	bowiem	comp
+z_aglt_by	by	comp
+z_aglt	cóż	subst:%
+z_aglt_nwok	czemu	adv
+z_aglt_by	czyżby	qub
+z_aglt_by	choćby	comp
+z_aglt_by	chociażby	comp
+z_aglt_nwok	dlaczego	adv
+z_aglt_nwok	dopóki	comp
+z_aglt_nwok	dopóty	conj
+z_aglt_by	gdyby	comp
+z_aglt_nwok	gdy	adv
+z_aglt_nwok	gdzie	qub
+z_aglt_nwok	gdzie	adv
+z_aglt_nwok	kto	subst:%
+z_aglt_by	jakby	comp
+z_aglt_by	jakoby	comp
+z_aglt_nwok	kiedy	adv
+z_aglt_nwok	kiedy	comp
+z_aglt_nwok	tylko	qub
+z_aglt_by	żeby	comp
+z_aglt_nwok	to	conj
+z_aglt_nwok	chyba	qub
+z_aglt_nwok	że	qub
+z_aglt_nwok	czy	conj
+z_aglt_by	oby	qub
+z_aglt_by	bodajby	qub
+z_aglt_nwok	co	comp
+z_aglt_nwok	bo	comp
+z_aglt_nwok	byle	comp
+z_aglt_by	byleby	comp
+dywiz	-	interp
+pauza	—	interp
+polpauza	–	interp
+kropka	.	interp
+przecinek	,	interp
+n	on	ppron3:sg:gen.acc:m1.m2.m3:ter:nakc:praep
+adj_anty_zloz	ten	adj:%
+adj_anty_zloz	tenże	adj:%
+adj_anty_zloz	ck	adj:%
+adj_anty_zloz	c.k.	adj:%
+adj_anty_zloz	ki	adj:%
+adj_anty_zloz	si	adj:%
+adj_anty_zloz	ow	adj:%
+adj_anty_zloz	ów	adj:%
+adj_anty_zloz	ówże	adj:%
+adj_anty_zloz	mój	adj:%
+adj_anty_zloz	a-z	adj:%
+adj_anty_zloz	a-ż	adj:%
+adj_anty_zloz	kiż	adj:%
+adj_anty_zloz	be	adj:%
+adj_anty_zloz	caca	adj:%
+adj_anty_zloz	czyj	adj:%
+adj_anty_zloz	oboj	adj:%
+adj_anty_zloz	on	adj:%
+adj_anty_zloz	tyli	adj:%
+adj_anty_zloz	rany	adj:%
+adj_anty_zloz	taki	adj:%
+adj_anty_zloz	pop	adj:%
+subst_anty_zloz	co	subst:%
+subst_anty_zloz	ar	subst:%:m3
+subst_anty_zloz	as	subst:%:m2
+subst_anty_zloz	as	subst:%:m1
+subst_anty_zloz	as	subst:%:m2
+subst_anty_zloz	as	subst:%:m3
+subst_anty_zloz	as	subst:%:n2
+subst_anty_zloz	at	subst:%:n2
+subst_anty_zloz	at	subst:%:m2
+subst_anty_zloz	az	subst:%:m1
+subst_anty_zloz	be	subst:%:n2
+subst_anty_zloz	bp	subst:%:m1
+subst_anty_zloz	ce	subst:%:n2
+subst_anty_zloz	de	subst:%:n2
+subst_anty_zloz	do	subst:%:n2
+subst_anty_zloz	dr	subst:%:m1
+subst_anty_zloz	ef	subst:%:n2
+subst_anty_zloz	el	subst:%:n2
+subst_anty_zloz	em	subst:%:n2
+subst_anty_zloz	en	subst:%:n2
+subst_anty_zloz	er	subst:%:n2
+subst_anty_zloz	es	subst:%:m3
+subst_anty_zloz	es	subst:%:n2
+subst_anty_zloz	fa	subst:%:n2
+subst_anty_zloz	go	subst:%:n2
+subst_anty_zloz	ha	subst:%:n2
+subst_anty_zloz	id	subst:%:m3
+subst_anty_zloz	id	subst:%:n2
+subst_anty_zloz	in	subst:%:n2
+subst_anty_zloz	ka	subst:%:n2
+subst_anty_zloz	kb	subst:%:m3
+subst_anty_zloz	km	subst:%:m3
+subst_anty_zloz	ku	subst:%:n2
+subst_anty_zloz	la	subst:%:n2
+subst_anty_zloz	li	subst:%:n2
+subst_anty_zloz	li	subst:%:f
+subst_anty_zloz	mi	subst:%:n2
+subst_anty_zloz	ni	subst:%:n2
+subst_anty_zloz	no	subst:%:n2
+subst_anty_zloz	nr	subst:%:m3
+subst_anty_zloz	om	subst:%:m3
+subst_anty_zloz	oz	subst:%:m3
+subst_anty_zloz	pe	subst:%:n2
+subst_anty_zloz	pi	subst:%:n2
+subst_anty_zloz	re	subst:%:n2
+subst_anty_zloz	rh	subst:%:n2
+subst_anty_zloz	ro	subst:%:n2
+subst_anty_zloz	si	subst:%:n2
+subst_anty_zloz	su	subst:%:n2
+subst_anty_zloz	te	subst:%:n2
+subst_anty_zloz	tv	subst:%:f
+subst_anty_zloz	ud	subst:%:m3
+subst_anty_zloz	uf	subst:%:m3
+subst_anty_zloz	ul	subst:%:m3
+subst_anty_zloz	um	subst:%:m3
+subst_anty_zloz	ut	subst:%:n2
+subst_anty_zloz	vw	subst:%:m3
+subst_anty_zloz	vw	subst:%:n2
+subst_anty_zloz	wc	subst:%:n2
+subst_anty_zloz	we	subst:%:n2
+subst_anty_zloz	wf	subst:%:m3
+subst_anty_zloz	wu	subst:%:n2
+prep_na		na	prep:%
+prep_n		do	prep:%
+prep_n		dla	prep:%
+prep_n		koło	prep:%
+prep_n		o	prep:%
+prep_n		po	prep:%
+prep_n		poza	prep:%
+prep_n		spoza	prep:%
+prep_n		za	prep:%
+prep_n		zza	prep:%
+sufs	+znawca	subst:%
+sufs	+dawca	subst:%
+sufs	+biorca	subst:%
+sufs	+żerca	subst:%
+sufs	+maniak	subst:%
+sufs	+logia	subst:%
+sufs	+log	subst:%
+suf_num	+latek	subst:%
+suf_num	+latka	subst:%
+suf_num	+lecie	subst:%
+suf_num	+krotność	subst:%
+suf_ord	ty	adj:%
+suf_ord	y	adj:%
+rom_i	I	romandig
+rom_v	V	romandig
+rom_x	X	romandig
+rom_l	L	romandig
+rom_d	D	romandig
+rom_c	C	romandig
+rom_m	M	romandig
+ja	ja	ppron12:sg:nom:%
+ty	ty	ppron12:sg:nom:%
+my	my	ppron12:pl:nom:%
+wy	wy	ppron12:pl:nom:%
+pref_dyw	e-+	prefa
+pref_dyw	e-+	prefs
 
 [separator chars]
 # ,
diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml
index 29438be..05c0cc6 100644
--- a/nbproject/configurations.xml
+++ b/nbproject/configurations.xml
@@ -339,8 +339,6 @@
             ex="false"
             tool="1"
             flavor2="4">
-        <ccTool flags="2">
-        </ccTool>
       </item>
       <item path="build/morfeusz/wrappers/morfeuszPERL_wrap.cxx"
             ex="false"
@@ -969,22 +967,16 @@
             ex="false"
             tool="1"
             flavor2="4">
-        <ccTool flags="2">
-        </ccTool>
       </item>
       <item path="morfeusz/deserialization/morphInterps/InterpretedChunksDecoder4Analyzer.cpp"
             ex="false"
             tool="1"
             flavor2="4">
-        <ccTool flags="2">
-        </ccTool>
       </item>
       <item path="morfeusz/deserialization/morphInterps/InterpretedChunksDecoder4Generator.cpp"
             ex="false"
             tool="1"
             flavor2="4">
-        <ccTool flags="2">
-        </ccTool>
       </item>
       <item path="morfeusz/fsa/const.cpp" ex="false" tool="1" flavor2="4">
       </item>
@@ -1035,12 +1027,8 @@
         </ccTool>
       </item>
       <item path="morfeusz/segrules/SegrulesFSA.cpp" ex="false" tool="1" flavor2="4">
-        <ccTool flags="2">
-        </ccTool>
       </item>
       <item path="morfeusz/segrules/segrules.cpp" ex="false" tool="1" flavor2="4">
-        <ccTool flags="2">
-        </ccTool>
       </item>
       <item path="morfeusz/test_runner.cpp" ex="false" tool="1" flavor2="4">
         <ccTool flags="0">
diff --git a/tests/analyzer/test_digits/segmentation.dat b/tests/analyzer/test_digits/segmentation.dat
index 4bac5b3..2fb6a49 100644
--- a/tests/analyzer/test_digits/segmentation.dat
+++ b/tests/analyzer/test_digits/segmentation.dat
@@ -27,9 +27,9 @@ dig
 samodz
 
 [lexemes]
-kropka	.:interp
-przecinek	,:interp
-dywiz	-:interp
+kropka	.	interp
+przecinek	,	interp
+dywiz	-	interp
 
 [tags]
 dig	dig
diff --git a/tests/analyzer/test_names/segmentation.dat b/tests/analyzer/test_names/segmentation.dat
index 4bac5b3..2fb6a49 100644
--- a/tests/analyzer/test_names/segmentation.dat
+++ b/tests/analyzer/test_names/segmentation.dat
@@ -27,9 +27,9 @@ dig
 samodz
 
 [lexemes]
-kropka	.:interp
-przecinek	,:interp
-dywiz	-:interp
+kropka	.	interp
+przecinek	,	interp
+dywiz	-	interp
 
 [tags]
 dig	dig
diff --git a/tests/analyzer/test_qualifiers/segmentation.dat b/tests/analyzer/test_qualifiers/segmentation.dat
index 4bac5b3..2fb6a49 100644
--- a/tests/analyzer/test_qualifiers/segmentation.dat
+++ b/tests/analyzer/test_qualifiers/segmentation.dat
@@ -27,9 +27,9 @@ dig
 samodz
 
 [lexemes]
-kropka	.:interp
-przecinek	,:interp
-dywiz	-:interp
+kropka	.	interp
+przecinek	,	interp
+dywiz	-	interp
 
 [tags]
 dig	dig
diff --git a/tests/analyzer/test_segtypes/ARGS b/tests/analyzer/test_segtypes/ARGS
new file mode 100644
index 0000000..4fd99ea
--- /dev/null
+++ b/tests/analyzer/test_segtypes/ARGS
@@ -0,0 +1 @@
+--aggl permissive
diff --git a/tests/analyzer/test_segtypes/dictionary.tab b/tests/analyzer/test_segtypes/dictionary.tab
new file mode 100644
index 0000000..109a0bb
--- /dev/null
+++ b/tests/analyzer/test_segtypes/dictionary.tab
@@ -0,0 +1,11 @@
+mikro	mikro	prefs
+euro	euro	prefs
+super	super	prefs
+kot	kot	subst:sg:nom:m1	imie	mikro|zzz
+kot	kot	subst:sg:nom:m1	nazwisko	euro
+kot	kot	subst:sg:nom:m1		xxx|yyy|super
+kot	kot	subst:sg:nom:m1		samodzielnie|zzz
+kot	kot	subst:sg:nom:m2	imie	samodzielnie
+kot	kot	adj:sg:acc:m3:pos		nigdy
+pies	pies	subst:sg:acc:m3		aaa|zzz|euro
+pies	pies	subst:sg:nom:m1	nazwisko	yyy|zzz|samodzielnie
diff --git a/tests/analyzer/test_segtypes/input.txt b/tests/analyzer/test_segtypes/input.txt
new file mode 100644
index 0000000..ba1c944
--- /dev/null
+++ b/tests/analyzer/test_segtypes/input.txt
@@ -0,0 +1,9 @@
+kot
+eurokot
+superkot
+mikrokot
+kotkot
+pies
+europies
+superpies
+mikropies
diff --git a/tests/analyzer/test_segtypes/output.txt b/tests/analyzer/test_segtypes/output.txt
new file mode 100644
index 0000000..86e12d2
--- /dev/null
+++ b/tests/analyzer/test_segtypes/output.txt
@@ -0,0 +1,11 @@
+[0,1,kot,kot,subst:sg:nom:m1,_,samodzielnie|zzz
+ 0,1,kot,kot,subst:sg:nom:m2,imie,samodzielnie]
+[0,1,eurokot,eurokot,subst:sg:nom:m1,nazwisko,euro]
+[0,1,superkot,superkot,subst:sg:nom:m1,_,super|xxx|yyy]
+[0,1,mikrokot,mikrokot,subst:sg:nom:m1,imie,mikro|zzz]
+[0,1,kotkot,kotkot,ign,_,_]
+[0,1,pies,pies,subst:sg:nom:m1,nazwisko,samodzielnie|yyy|zzz]
+[0,1,europies,europies,subst:sg:acc:m3,_,aaa|zzz|euro]
+[0,1,superpies,superpies,ign,_,_]
+[0,1,mikropies,mikropies,ign,_,_]
+
diff --git a/tests/analyzer/test_segtypes/segmentation.dat b/tests/analyzer/test_segtypes/segmentation.dat
new file mode 100644
index 0000000..1914f71
--- /dev/null
+++ b/tests/analyzer/test_segtypes/segmentation.dat
@@ -0,0 +1,45 @@
+[options]
+aggl=strict permissive isolated
+praet=split composite
+
+[combinations]
+
+samodzielnie
+mikro> tylko_z_mikro
+euro> tylko_z_euro
+super> tylko_z_super
+
+[segment types]
+tylko_z_mikro
+tylko_z_euro
+tylko_z_super
+samodzielnie
+nigdy
+mikro
+euro
+super
+
+[lexemes]
+tylko_z_mikro	kot	subst:%	name=imie	labels=zzz
+tylko_z_euro	kot	subst:%	name=nazwisko
+tylko_z_super	kot	subst:%	labels=xxx|yyy
+samodzielnie	kot	subst:%
+
+mikro	mikro	%
+euro	euro	%
+super	super	%
+
+[tags]
+tylko_z_euro	subst:%	labels=aaa
+samodzielnie	subst:%
+nigdy	%
+
+[separator chars]
+# ,
+44
+
+# .
+46
+
+# ;
+59
diff --git a/tests/analyzer/test_segtypes/tagset.dat b/tests/analyzer/test_segtypes/tagset.dat
new file mode 100644
index 0000000..b04a3aa
--- /dev/null
+++ b/tests/analyzer/test_segtypes/tagset.dat
@@ -0,0 +1,774 @@
+#!TAGSET-ID pl.sgjp.morfeusz-0.5.0
+
+[TAGS]
+# special: unknown word (ignotum):
+0	ign
+# special: space/blank:
+1	sp
+# NOUNS
+694	subst:sg:nom:m1
+695	subst:sg:nom:m2
+696	subst:sg:nom:m3
+697	subst:sg:nom:n1
+698	subst:sg:nom:n2
+693	subst:sg:nom:f
+676	subst:sg:gen:m1
+677	subst:sg:gen:m2
+678	subst:sg:gen:m3
+679	subst:sg:gen:n1
+680	subst:sg:gen:n2
+675	subst:sg:gen:f
+670	subst:sg:dat:m1
+671	subst:sg:dat:m2
+672	subst:sg:dat:m3
+673	subst:sg:dat:n1
+674	subst:sg:dat:n2
+669	subst:sg:dat:f
+664	subst:sg:acc:m1
+665	subst:sg:acc:m2
+666	subst:sg:acc:m3
+667	subst:sg:acc:n1
+668	subst:sg:acc:n2
+663	subst:sg:acc:f
+682	subst:sg:inst:m1
+683	subst:sg:inst:m2
+684	subst:sg:inst:m3
+685	subst:sg:inst:n1
+686	subst:sg:inst:n2
+681	subst:sg:inst:f
+688	subst:sg:loc:m1
+689	subst:sg:loc:m2
+690	subst:sg:loc:m3
+691	subst:sg:loc:n1
+692	subst:sg:loc:n2
+687	subst:sg:loc:f
+700	subst:sg:voc:m1
+701	subst:sg:voc:m2
+702	subst:sg:voc:m3
+703	subst:sg:voc:n1
+704	subst:sg:voc:n2
+699	subst:sg:voc:f
+646	subst:pl:nom:m1
+647	subst:pl:nom:m2
+648	subst:pl:nom:m3
+649	subst:pl:nom:n1
+650	subst:pl:nom:n2
+651	subst:pl:nom:p1
+652	subst:pl:nom:p2
+653	subst:pl:nom:p3
+645	subst:pl:nom:f
+619	subst:pl:gen:m1
+620	subst:pl:gen:m2
+621	subst:pl:gen:m3
+622	subst:pl:gen:n1
+623	subst:pl:gen:n2
+624	subst:pl:gen:p1
+625	subst:pl:gen:p2
+626	subst:pl:gen:p3
+618	subst:pl:gen:f
+610	subst:pl:dat:m1
+611	subst:pl:dat:m2
+612	subst:pl:dat:m3
+613	subst:pl:dat:n1
+614	subst:pl:dat:n2
+615	subst:pl:dat:p1
+616	subst:pl:dat:p2
+617	subst:pl:dat:p3
+609	subst:pl:dat:f
+601	subst:pl:acc:m1
+602	subst:pl:acc:m2
+603	subst:pl:acc:m3
+604	subst:pl:acc:n1
+605	subst:pl:acc:n2
+606	subst:pl:acc:p1
+607	subst:pl:acc:p2
+608	subst:pl:acc:p3
+600	subst:pl:acc:f
+628	subst:pl:inst:m1
+629	subst:pl:inst:m2
+630	subst:pl:inst:m3
+631	subst:pl:inst:n1
+632	subst:pl:inst:n2
+633	subst:pl:inst:p1
+634	subst:pl:inst:p2
+635	subst:pl:inst:p3
+627	subst:pl:inst:f
+637	subst:pl:loc:m1
+638	subst:pl:loc:m2
+639	subst:pl:loc:m3
+640	subst:pl:loc:n1
+641	subst:pl:loc:n2
+642	subst:pl:loc:p1
+643	subst:pl:loc:p2
+644	subst:pl:loc:p3
+636	subst:pl:loc:f
+654	subst:pl:voc:f
+655	subst:pl:voc:m1
+656	subst:pl:voc:m2
+657	subst:pl:voc:m3
+658	subst:pl:voc:n1
+659	subst:pl:voc:n2
+660	subst:pl:voc:p1
+661	subst:pl:voc:p2
+662	subst:pl:voc:p3
+# depreciative nominal flexeme:
+149	depr:pl:nom:m2
+150	depr:pl:voc:m2
+# nominal compounds forming form:
+599	substa
+# PERSONAL PRONOUNS
+443	ppron12:sg:acc:m1.m2.m3.f.n1.n2:pri:akc
+444	ppron12:sg:acc:m1.m2.m3.f.n1.n2:pri:nakc
+445	ppron12:sg:acc:m1.m2.m3.f.n1.n2:sec:akc
+446	ppron12:sg:acc:m1.m2.m3.f.n1.n2:sec:nakc
+447	ppron12:sg:dat:m1.m2.m3.f.n1.n2:pri:akc
+448	ppron12:sg:dat:m1.m2.m3.f.n1.n2:pri:nakc
+449	ppron12:sg:dat:m1.m2.m3.f.n1.n2:sec:akc
+450	ppron12:sg:dat:m1.m2.m3.f.n1.n2:sec:nakc
+451	ppron12:sg:gen:m1.m2.m3.f.n1.n2:pri:akc
+452	ppron12:sg:gen:m1.m2.m3.f.n1.n2:pri:nakc
+453	ppron12:sg:gen:m1.m2.m3.f.n1.n2:sec:akc
+454	ppron12:sg:gen:m1.m2.m3.f.n1.n2:sec:nakc
+455	ppron12:sg:inst:m1.m2.m3.f.n1.n2:pri
+456	ppron12:sg:inst:m1.m2.m3.f.n1.n2:sec
+457	ppron12:sg:loc:m1.m2.m3.f.n1.n2:pri
+458	ppron12:sg:loc:m1.m2.m3.f.n1.n2:sec
+459	ppron12:sg:nom:m1.m2.m3.f.n1.n2:pri
+460	ppron12:sg:nom:m1.m2.m3.f.n1.n2:sec
+461	ppron12:sg:voc:m1.m2.m3.f.n1.n2:sec
+429	ppron12:pl:acc:_:pri
+430	ppron12:pl:acc:_:sec
+431	ppron12:pl:dat:_:pri
+432	ppron12:pl:dat:_:sec
+433	ppron12:pl:gen:_:pri
+434	ppron12:pl:gen:_:sec
+435	ppron12:pl:inst:_:pri
+436	ppron12:pl:inst:_:sec
+437	ppron12:pl:loc:_:pri
+438	ppron12:pl:loc:_:sec
+439	ppron12:pl:nom:_:pri
+440	ppron12:pl:nom:_:sec
+441	ppron12:pl:voc:_:pri
+442	ppron12:pl:voc:_:sec
+474	ppron3:sg:acc:f:ter:_:npraep
+475	ppron3:sg:acc:f:ter:_:praep
+476	ppron3:sg:acc:m1.m2.m3:ter:akc:npraep
+477	ppron3:sg:acc:m1.m2.m3:ter:akc:praep
+478	ppron3:sg:acc:m1.m2.m3:ter:nakc:npraep
+479	ppron3:sg:acc:m1.m2.m3:ter:nakc:praep
+480	ppron3:sg:acc:n1.n2:ter:_:npraep
+481	ppron3:sg:acc:n1.n2:ter:_:praep
+482	ppron3:sg:dat:f:ter:_:npraep
+483	ppron3:sg:dat:f:ter:_:praep
+484	ppron3:sg:dat:m1.m2.m3:ter:akc:npraep
+485	ppron3:sg:dat:m1.m2.m3:ter:nakc:npraep
+486	ppron3:sg:dat:m1.m2.m3:ter:_:praep
+487	ppron3:sg:dat:n1.n2:ter:akc:npraep
+488	ppron3:sg:dat:n1.n2:ter:nakc:npraep
+489	ppron3:sg:dat:n1.n2:ter:_:praep
+490	ppron3:sg:gen.acc:m1.m2.m3:ter:nakc:praep
+491	ppron3:sg:gen:f:ter:_:npraep
+492	ppron3:sg:gen:f:ter:_:praep
+493	ppron3:sg:gen:m1.m2.m3:ter:akc:npraep
+494	ppron3:sg:gen:m1.m2.m3:ter:akc:praep
+495	ppron3:sg:gen:m1.m2.m3:ter:nakc:npraep
+496	ppron3:sg:gen:m1.m2.m3:ter:nakc:praep
+497	ppron3:sg:gen:n1.n2:ter:akc:npraep
+498	ppron3:sg:gen:n1.n2:ter:nakc:npraep
+499	ppron3:sg:gen:n1.n2:ter:_:praep
+500	ppron3:sg:inst:f:ter:_:praep
+501	ppron3:sg:inst:m1.m2.m3:ter:_:_
+502	ppron3:sg:inst:n1.n2:ter:_:_
+503	ppron3:sg:loc:f:ter:_:_
+504	ppron3:sg:loc:m1.m2.m3:ter:_:_
+505	ppron3:sg:loc:n1.n2:ter:_:_
+506	ppron3:sg:nom:f:ter:_:_
+507	ppron3:sg:nom:m1.m2.m3:ter:_:_
+508	ppron3:sg:nom:n1.n2:ter:_:_
+462	ppron3:pl:acc:m1.p1:ter:_:npraep
+463	ppron3:pl:acc:m1.p1:ter:_:praep
+464	ppron3:pl:acc:m2.m3.f.n1.n2.p2.p3:ter:_:npraep
+465	ppron3:pl:acc:m2.m3.f.n1.n2.p2.p3:ter:_:praep
+466	ppron3:pl:dat:_:ter:_:npraep
+467	ppron3:pl:dat:_:ter:_:praep
+468	ppron3:pl:gen:_:ter:_:npraep
+469	ppron3:pl:gen:_:ter:_:praep
+470	ppron3:pl:inst:_:ter:_:_
+471	ppron3:pl:loc:_:ter:_:_
+472	ppron3:pl:nom:m1.p1:ter:_:_
+473	ppron3:pl:nom:m2.m3.f.n1.n2.p2.p3:ter:_:_
+# PRONOUN ‘SIEBIE’
+594	siebie:acc
+595	siebie:dat
+596	siebie:gen
+597	siebie:inst
+598	siebie:loc
+# ADJECTIVES
+5	adj:pl:acc:m1.p1:com
+6	adj:pl:acc:m1.p1:pos
+7	adj:pl:acc:m1.p1:sup
+8	adj:pl:acc:m2.m3.f.n1.n2.p2.p3:com
+9	adj:pl:acc:m2.m3.f.n1.n2.p2.p3:pos
+10	adj:pl:acc:m2.m3.f.n1.n2.p2.p3:sup
+11	adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:com
+12	adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
+13	adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
+14	adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:com
+15	adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
+16	adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
+17	adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:com
+18	adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
+19	adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
+20	adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:com
+21	adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
+22	adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
+23	adj:pl:nom:m1.p1:pos
+24	adj:pl:nom:m2.m3.f.n1.n2.p2.p3:pos
+25	adj:pl:nom.voc:m1.p1:com
+26	adj:pl:nom.voc:m1.p1:pos
+27	adj:pl:nom.voc:m1.p1:sup
+28	adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:com
+29	adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:pos
+30	adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:sup
+31	adj:sg:acc:f:com
+32	adj:sg:acc:f:pos
+33	adj:sg:acc:f:sup
+34	adj:sg:acc:m1.m2:com
+35	adj:sg:acc:m1.m2:pos
+36	adj:sg:acc:m1.m2:sup
+37	adj:sg:acc:m3:com
+38	adj:sg:acc:m3:pos
+39	adj:sg:acc:m3:sup
+40	adj:sg:acc:n1.n2:com
+41	adj:sg:acc:n1.n2:pos
+42	adj:sg:acc:n1.n2:sup
+43	adj:sg:dat:f:com
+44	adj:sg:dat:f:pos
+45	adj:sg:dat:f:sup
+46	adj:sg:dat:m1.m2.m3.n1.n2:com
+47	adj:sg:dat:m1.m2.m3.n1.n2:pos
+48	adj:sg:dat:m1.m2.m3.n1.n2:sup
+49	adj:sg:gen:f:com
+50	adj:sg:gen:f:pos
+51	adj:sg:gen:f:sup
+52	adj:sg:gen:m1.m2.m3.n1.n2:com
+53	adj:sg:gen:m1.m2.m3.n1.n2:pos
+54	adj:sg:gen:m1.m2.m3.n1.n2:sup
+55	adj:sg:inst:f:com
+56	adj:sg:inst:f:pos
+57	adj:sg:inst:f:sup
+58	adj:sg:inst:m1.m2.m3.n1.n2:com
+59	adj:sg:inst:m1.m2.m3.n1.n2:pos
+60	adj:sg:inst:m1.m2.m3.n1.n2:sup
+61	adj:sg:loc:f:com
+62	adj:sg:loc:f:pos
+63	adj:sg:loc:f:sup
+64	adj:sg:loc:m1.m2.m3.n1.n2:com
+65	adj:sg:loc:m1.m2.m3.n1.n2:pos
+66	adj:sg:loc:m1.m2.m3.n1.n2:sup
+67	adj:sg:nom:f:pos
+68	adj:sg:nom:m1.m2.m3:pos
+69	adj:sg:nom:n1.n2:pos
+70	adj:sg:nom.voc:f:com
+71	adj:sg:nom.voc:f:pos
+72	adj:sg:nom.voc:f:sup
+73	adj:sg:nom.voc:m1.m2.m3:com
+74	adj:sg:nom.voc:m1.m2.m3:pos
+75	adj:sg:nom.voc:m1.m2.m3:sup
+76	adj:sg:nom.voc:n1.n2:com
+77	adj:sg:nom.voc:n1.n2:pos
+78	adj:sg:nom.voc:n1.n2:sup
+# adjectival compounds forming form:
+2	adja
+# predicative adjective:
+3	adjc
+# post-prepositional adjective:
+4	adjp
+# VERBS
+# finitive (present/future) flexeme:
+153	fin:pl:pri:imperf
+154	fin:pl:pri:imperf.perf
+155	fin:pl:pri:perf
+156	fin:pl:sec:imperf
+157	fin:pl:sec:imperf.perf
+158	fin:pl:sec:perf
+159	fin:pl:ter:imperf
+160	fin:pl:ter:imperf.perf
+161	fin:pl:ter:perf
+162	fin:sg:pri:imperf
+163	fin:sg:pri:imperf.perf
+164	fin:sg:pri:perf
+165	fin:sg:sec:imperf
+166	fin:sg:sec:imperf.perf
+167	fin:sg:sec:perf
+168	fin:sg:ter:imperf
+169	fin:sg:ter:imperf.perf
+170	fin:sg:ter:perf
+# past flexeme:
+# praet=split (unsued otherwise):
+509	praet:pl:m1.p1:imperf
+510	praet:pl:m1.p1:imperf.perf
+511	praet:pl:m1.p1:perf
+521	praet:pl:m2.m3.f.n1.n2.p2.p3:imperf
+522	praet:pl:m2.m3.f.n1.n2.p2.p3:imperf.perf
+523	praet:pl:m2.m3.f.n1.n2.p2.p3:perf
+533	praet:sg:f:imperf
+534	praet:sg:f:imperf.perf
+535	praet:sg:f:perf
+545	praet:sg:m1.m2.m3:imperf
+546	praet:sg:m1.m2.m3:imperf:agl
+547	praet:sg:m1.m2.m3:imperf:nagl
+548	praet:sg:m1.m2.m3:imperf.perf
+549	praet:sg:m1.m2.m3:perf
+550	praet:sg:m1.m2.m3:perf:agl
+551	praet:sg:m1.m2.m3:perf:nagl
+561	praet:sg:n1.n2:imperf
+562	praet:sg:n1.n2:imperf.perf
+563	praet:sg:n1.n2:perf
+# praet=composite (unsued otherwise):
+512	praet:pl:m1.p1:pri:imperf
+513	praet:pl:m1.p1:pri:imperf.perf
+514	praet:pl:m1.p1:pri:perf
+515	praet:pl:m1.p1:sec:imperf
+516	praet:pl:m1.p1:sec:imperf.perf
+517	praet:pl:m1.p1:sec:perf
+518	praet:pl:m1.p1:ter:imperf
+519	praet:pl:m1.p1:ter:imperf.perf
+520	praet:pl:m1.p1:ter:perf
+524	praet:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf
+525	praet:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf.perf
+526	praet:pl:m2.m3.f.n1.n2.p2.p3:pri:perf
+527	praet:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
+528	praet:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf.perf
+529	praet:pl:m2.m3.f.n1.n2.p2.p3:sec:perf
+530	praet:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
+531	praet:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf.perf
+532	praet:pl:m2.m3.f.n1.n2.p2.p3:ter:perf
+536	praet:sg:f:pri:imperf
+537	praet:sg:f:pri:imperf.perf
+538	praet:sg:f:pri:perf
+539	praet:sg:f:sec:imperf
+540	praet:sg:f:sec:imperf.perf
+541	praet:sg:f:sec:perf
+542	praet:sg:f:ter:imperf
+543	praet:sg:f:ter:imperf.perf
+544	praet:sg:f:ter:perf
+552	praet:sg:m1.m2.m3:pri:imperf
+553	praet:sg:m1.m2.m3:pri:imperf.perf
+554	praet:sg:m1.m2.m3:pri:perf
+555	praet:sg:m1.m2.m3:sec:imperf
+556	praet:sg:m1.m2.m3:sec:imperf.perf
+557	praet:sg:m1.m2.m3:sec:perf
+558	praet:sg:m1.m2.m3:ter:imperf
+559	praet:sg:m1.m2.m3:ter:imperf.perf
+560	praet:sg:m1.m2.m3:ter:perf
+564	praet:sg:n1.n2:pri:imperf
+565	praet:sg:n1.n2:pri:imperf.perf
+566	praet:sg:n1.n2:pri:perf
+567	praet:sg:n1.n2:sec:imperf
+568	praet:sg:n1.n2:sec:imperf.perf
+569	praet:sg:n1.n2:sec:perf
+570	praet:sg:n1.n2:ter:imperf
+571	praet:sg:n1.n2:ter:imperf.perf
+572	praet:sg:n1.n2:ter:perf
+# conditional mood (used only with praet=composite)
+100	cond:pl:m1.p1:pri:imperf
+101	cond:pl:m1.p1:pri:imperf.perf
+102	cond:pl:m1.p1:pri:perf
+103	cond:pl:m1.p1:sec:imperf
+104	cond:pl:m1.p1:sec:imperf.perf
+105	cond:pl:m1.p1:sec:perf
+106	cond:pl:m1.p1:ter:imperf
+107	cond:pl:m1.p1:ter:imperf.perf
+108	cond:pl:m1.p1:ter:perf
+109	cond:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf
+110	cond:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf.perf
+111	cond:pl:m2.m3.f.n1.n2.p2.p3:pri:perf
+112	cond:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
+113	cond:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf.perf
+114	cond:pl:m2.m3.f.n1.n2.p2.p3:sec:perf
+115	cond:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
+116	cond:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf.perf
+117	cond:pl:m2.m3.f.n1.n2.p2.p3:ter:perf
+118	cond:sg:f:pri:imperf
+119	cond:sg:f:pri:imperf.perf
+120	cond:sg:f:pri:perf
+121	cond:sg:f:sec:imperf
+122	cond:sg:f:sec:imperf.perf
+123	cond:sg:f:sec:perf
+124	cond:sg:f:ter:imperf
+125	cond:sg:f:ter:imperf.perf
+126	cond:sg:f:ter:perf
+127	cond:sg:m1.m2.m3:pri:imperf
+128	cond:sg:m1.m2.m3:pri:imperf.perf
+129	cond:sg:m1.m2.m3:pri:perf
+130	cond:sg:m1.m2.m3:sec:imperf
+131	cond:sg:m1.m2.m3:sec:imperf.perf
+132	cond:sg:m1.m2.m3:sec:perf
+133	cond:sg:m1.m2.m3:ter:imperf
+134	cond:sg:m1.m2.m3:ter:imperf.perf
+135	cond:sg:m1.m2.m3:ter:perf
+136	cond:sg:n1.n2:imperf
+137	cond:sg:n1.n2:imperf.perf
+138	cond:sg:n1.n2:perf
+139	cond:sg:n1.n2:pri:imperf
+140	cond:sg:n1.n2:pri:imperf.perf
+141	cond:sg:n1.n2:pri:perf
+142	cond:sg:n1.n2:sec:imperf
+143	cond:sg:n1.n2:sec:imperf.perf
+144	cond:sg:n1.n2:sec:perf
+145	cond:sg:n1.n2:ter:imperf
+146	cond:sg:n1.n2:ter:imperf.perf
+147	cond:sg:n1.n2:ter:perf
+# impersonal flexeme:
+219	imps:imperf
+220	imps:imperf.perf
+221	imps:perf
+# imperative flexeme:
+222	impt:pl:pri:imperf
+223	impt:pl:pri:imperf.perf
+224	impt:pl:pri:perf
+225	impt:pl:sec:imperf
+226	impt:pl:sec:imperf.perf
+227	impt:pl:sec:perf
+228	impt:sg:sec:imperf
+229	impt:sg:sec:imperf.perf
+230	impt:sg:sec:perf
+# infinitival flexeme:
+231	inf:imperf
+232	inf:imperf.perf
+233	inf:perf
+# agglutinative forms of ‘być’:
+83	aglt:pl:pri:imperf:nwok
+84	aglt:pl:pri:imperf:wok
+85	aglt:pl:sec:imperf:nwok
+86	aglt:pl:sec:imperf:wok
+87	aglt:sg:pri:imperf:nwok
+88	aglt:sg:pri:imperf:wok
+89	aglt:sg:sec:imperf:nwok
+90	aglt:sg:sec:imperf:wok
+# future forms of ‘być’:
+91	bedzie:pl:pri:imperf
+92	bedzie:pl:sec:imperf
+93	bedzie:pl:ter:imperf
+94	bedzie:sg:pri:imperf
+95	bedzie:sg:sec:imperf
+96	bedzie:sg:ter:imperf
+# ‘winien’ type verbs:
+705	winien:pl:m1.p1:imperf
+706	winien:pl:m1.p1:pri:imperf
+707	winien:pl:m1.p1:sec:imperf
+708	winien:pl:m1.p1:ter:imperf
+709	winien:pl:m2.m3.f.n1.n2.p2.p3:imperf
+710	winien:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
+711	winien:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
+712	winien:sg:f:imperf
+713	winien:sg:f:pri:imperf
+714	winien:sg:f:sec:imperf
+715	winien:sg:f:ter:imperf
+716	winien:sg:m1.m2.m3:imperf
+717	winien:sg:m1.m2.m3:pri:imperf
+718	winien:sg:m1.m2.m3:sec:imperf
+719	winien:sg:m1.m2.m3:ter:imperf
+720	winien:sg:n1.n2:imperf
+721	winien:sg:n1.n2:pri:imperf
+722	winien:sg:n1.n2:sec:imperf
+723	winien:sg:n1.n2:ter:imperf
+# predicative flexeme:
+573	pred
+# gerunds
+171	ger:pl:dat.loc:n2:imperf:aff
+172	ger:pl:dat.loc:n2:imperf:neg
+173	ger:pl:dat.loc:n2:imperf.perf:aff
+174	ger:pl:dat.loc:n2:imperf.perf:neg
+175	ger:pl:dat.loc:n2:perf:aff
+176	ger:pl:dat.loc:n2:perf:neg
+177	ger:pl:gen:n2:imperf:aff
+178	ger:pl:gen:n2:imperf:neg
+179	ger:pl:gen:n2:imperf.perf:aff
+180	ger:pl:gen:n2:imperf.perf:neg
+181	ger:pl:gen:n2:perf:aff
+182	ger:pl:gen:n2:perf:neg
+183	ger:pl:inst:n2:imperf:aff
+184	ger:pl:inst:n2:imperf:neg
+185	ger:pl:inst:n2:imperf.perf:aff
+186	ger:pl:inst:n2:imperf.perf:neg
+187	ger:pl:inst:n2:perf:aff
+188	ger:pl:inst:n2:perf:neg
+189	ger:pl:nom.acc:n2:imperf:aff
+190	ger:pl:nom.acc:n2:imperf:neg
+191	ger:pl:nom.acc:n2:imperf.perf:aff
+192	ger:pl:nom.acc:n2:imperf.perf:neg
+193	ger:pl:nom.acc:n2:perf:aff
+194	ger:pl:nom.acc:n2:perf:neg
+195	ger:sg:dat.loc:n2:imperf:aff
+196	ger:sg:dat.loc:n2:imperf:neg
+197	ger:sg:dat.loc:n2:imperf.perf:aff
+198	ger:sg:dat.loc:n2:imperf.perf:neg
+199	ger:sg:dat.loc:n2:perf:aff
+200	ger:sg:dat.loc:n2:perf:neg
+201	ger:sg:gen:n2:imperf:aff
+202	ger:sg:gen:n2:imperf:neg
+203	ger:sg:gen:n2:imperf.perf:aff
+204	ger:sg:gen:n2:imperf.perf:neg
+205	ger:sg:gen:n2:perf:aff
+206	ger:sg:gen:n2:perf:neg
+207	ger:sg:inst:n2:imperf:aff
+208	ger:sg:inst:n2:imperf:neg
+209	ger:sg:inst:n2:imperf.perf:aff
+210	ger:sg:inst:n2:imperf.perf:neg
+211	ger:sg:inst:n2:perf:aff
+212	ger:sg:inst:n2:perf:neg
+213	ger:sg:nom.acc:n2:imperf:aff
+214	ger:sg:nom.acc:n2:imperf:neg
+215	ger:sg:nom.acc:n2:imperf.perf:aff
+216	ger:sg:nom.acc:n2:imperf.perf:neg
+217	ger:sg:nom.acc:n2:perf:aff
+218	ger:sg:nom.acc:n2:perf:neg
+# participles
+# adverbial participles:
+332	pcon:imperf
+331	pant:perf
+# adjectival active participle:
+267	pact:pl:acc:m1.p1:imperf:aff
+268	pact:pl:acc:m1.p1:imperf:neg
+269	pact:pl:acc:m1.p1:imperf.perf:aff
+270	pact:pl:acc:m1.p1:imperf.perf:neg
+271	pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+272	pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+273	pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+274	pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+275	pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+276	pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+277	pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+278	pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+279	pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+280	pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+281	pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+282	pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+283	pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:aff
+284	pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:neg
+285	pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:aff
+286	pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:neg
+287	pact:pl:nom.voc:m1.p1:imperf:aff
+288	pact:pl:nom.voc:m1.p1:imperf:neg
+289	pact:pl:nom.voc:m1.p1:imperf.perf:aff
+290	pact:pl:nom.voc:m1.p1:imperf.perf:neg
+291	pact:sg:acc.inst:f:imperf:aff
+292	pact:sg:acc.inst:f:imperf:neg
+293	pact:sg:acc.inst:f:imperf.perf:aff
+294	pact:sg:acc.inst:f:imperf.perf:neg
+295	pact:sg:acc:m1.m2:imperf:aff
+296	pact:sg:acc:m1.m2:imperf:neg
+297	pact:sg:acc:m1.m2:imperf.perf:aff
+298	pact:sg:acc:m1.m2:imperf.perf:neg
+299	pact:sg:acc:m3:imperf:aff
+300	pact:sg:acc:m3:imperf:neg
+301	pact:sg:acc:m3:imperf.perf:aff
+302	pact:sg:acc:m3:imperf.perf:neg
+303	pact:sg:dat:m1.m2.m3.n1.n2:imperf:aff
+304	pact:sg:dat:m1.m2.m3.n1.n2:imperf:neg
+305	pact:sg:dat:m1.m2.m3.n1.n2:imperf.perf:aff
+306	pact:sg:dat:m1.m2.m3.n1.n2:imperf.perf:neg
+307	pact:sg:gen.dat.loc:f:imperf:aff
+308	pact:sg:gen.dat.loc:f:imperf:neg
+309	pact:sg:gen.dat.loc:f:imperf.perf:aff
+310	pact:sg:gen.dat.loc:f:imperf.perf:neg
+311	pact:sg:gen:m1.m2.m3.n1.n2:imperf:aff
+312	pact:sg:gen:m1.m2.m3.n1.n2:imperf:neg
+313	pact:sg:gen:m1.m2.m3.n1.n2:imperf.perf:aff
+314	pact:sg:gen:m1.m2.m3.n1.n2:imperf.perf:neg
+315	pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf:aff
+316	pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf:neg
+317	pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:aff
+318	pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:neg
+319	pact:sg:nom.acc.voc:n1.n2:imperf:aff
+320	pact:sg:nom.acc.voc:n1.n2:imperf:neg
+321	pact:sg:nom.acc.voc:n1.n2:imperf.perf:aff
+322	pact:sg:nom.acc.voc:n1.n2:imperf.perf:neg
+323	pact:sg:nom.voc:f:imperf:aff
+324	pact:sg:nom.voc:f:imperf:neg
+325	pact:sg:nom.voc:f:imperf.perf:aff
+326	pact:sg:nom.voc:f:imperf.perf:neg
+327	pact:sg:nom.voc:m1.m2.m3:imperf:aff
+328	pact:sg:nom.voc:m1.m2.m3:imperf:neg
+329	pact:sg:nom.voc:m1.m2.m3:imperf.perf:aff
+330	pact:sg:nom.voc:m1.m2.m3:imperf.perf:neg
+# adjectival passive participle:
+333	ppas:pl:acc:m1.p1:imperf:aff
+334	ppas:pl:acc:m1.p1:imperf:neg
+335	ppas:pl:acc:m1.p1:imperf.perf:aff
+336	ppas:pl:acc:m1.p1:imperf.perf:neg
+337	ppas:pl:acc:m1.p1:perf:aff
+338	ppas:pl:acc:m1.p1:perf:neg
+339	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+340	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+341	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+342	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+343	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
+344	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
+345	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+346	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+347	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+348	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+349	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
+350	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
+351	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+352	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+353	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+354	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+355	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
+356	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
+357	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:aff
+358	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:neg
+359	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:aff
+360	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:neg
+361	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:perf:aff
+362	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:perf:neg
+363	ppas:pl:nom.voc:m1.p1:imperf:aff
+364	ppas:pl:nom.voc:m1.p1:imperf:neg
+365	ppas:pl:nom.voc:m1.p1:imperf.perf:aff
+366	ppas:pl:nom.voc:m1.p1:imperf.perf:neg
+367	ppas:pl:nom.voc:m1.p1:perf:aff
+368	ppas:pl:nom.voc:m1.p1:perf:neg
+369	ppas:sg:acc.inst:f:imperf:aff
+370	ppas:sg:acc.inst:f:imperf:neg
+371	ppas:sg:acc.inst:f:imperf.perf:aff
+372	ppas:sg:acc.inst:f:imperf.perf:neg
+373	ppas:sg:acc.inst:f:perf:aff
+374	ppas:sg:acc.inst:f:perf:neg
+375	ppas:sg:acc:m1.m2:imperf:aff
+376	ppas:sg:acc:m1.m2:imperf:neg
+377	ppas:sg:acc:m1.m2:imperf.perf:aff
+378	ppas:sg:acc:m1.m2:imperf.perf:neg
+379	ppas:sg:acc:m1.m2:perf:aff
+380	ppas:sg:acc:m1.m2:perf:neg
+381	ppas:sg:acc:m3:imperf:aff
+382	ppas:sg:acc:m3:imperf:neg
+383	ppas:sg:acc:m3:imperf.perf:aff
+384	ppas:sg:acc:m3:imperf.perf:neg
+385	ppas:sg:acc:m3:perf:aff
+386	ppas:sg:acc:m3:perf:neg
+387	ppas:sg:dat:m1.m2.m3.n1.n2:imperf:aff
+388	ppas:sg:dat:m1.m2.m3.n1.n2:imperf:neg
+389	ppas:sg:dat:m1.m2.m3.n1.n2:imperf.perf:aff
+390	ppas:sg:dat:m1.m2.m3.n1.n2:imperf.perf:neg
+391	ppas:sg:dat:m1.m2.m3.n1.n2:perf:aff
+392	ppas:sg:dat:m1.m2.m3.n1.n2:perf:neg
+393	ppas:sg:gen.dat.loc:f:imperf:aff
+394	ppas:sg:gen.dat.loc:f:imperf:neg
+395	ppas:sg:gen.dat.loc:f:imperf.perf:aff
+396	ppas:sg:gen.dat.loc:f:imperf.perf:neg
+397	ppas:sg:gen.dat.loc:f:perf:aff
+398	ppas:sg:gen.dat.loc:f:perf:neg
+399	ppas:sg:gen:m1.m2.m3.n1.n2:imperf:aff
+400	ppas:sg:gen:m1.m2.m3.n1.n2:imperf:neg
+401	ppas:sg:gen:m1.m2.m3.n1.n2:imperf.perf:aff
+402	ppas:sg:gen:m1.m2.m3.n1.n2:imperf.perf:neg
+403	ppas:sg:gen:m1.m2.m3.n1.n2:perf:aff
+404	ppas:sg:gen:m1.m2.m3.n1.n2:perf:neg
+405	ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf:aff
+406	ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf:neg
+407	ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:aff
+408	ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:neg
+409	ppas:sg:inst.loc:m1.m2.m3.n1.n2:perf:aff
+410	ppas:sg:inst.loc:m1.m2.m3.n1.n2:perf:neg
+411	ppas:sg:nom.acc.voc:n1.n2:imperf:aff
+412	ppas:sg:nom.acc.voc:n1.n2:imperf:neg
+413	ppas:sg:nom.acc.voc:n1.n2:imperf.perf:aff
+414	ppas:sg:nom.acc.voc:n1.n2:imperf.perf:neg
+415	ppas:sg:nom.acc.voc:n1.n2:perf:aff
+416	ppas:sg:nom.acc.voc:n1.n2:perf:neg
+417	ppas:sg:nom.voc:f:imperf:aff
+418	ppas:sg:nom.voc:f:imperf:neg
+419	ppas:sg:nom.voc:f:imperf.perf:aff
+420	ppas:sg:nom.voc:f:imperf.perf:neg
+421	ppas:sg:nom.voc:f:perf:aff
+422	ppas:sg:nom.voc:f:perf:neg
+423	ppas:sg:nom.voc:m1.m2.m3:imperf:aff
+424	ppas:sg:nom.voc:m1.m2.m3:imperf:neg
+425	ppas:sg:nom.voc:m1.m2.m3:imperf.perf:aff
+426	ppas:sg:nom.voc:m1.m2.m3:imperf.perf:neg
+427	ppas:sg:nom.voc:m1.m2.m3:perf:aff
+428	ppas:sg:nom.voc:m1.m2.m3:perf:neg
+# NUMERALS
+239	num:pl:acc:m1:rec
+240	num:pl:dat.loc:n1.p1.p2:congr.rec
+241	num:pl:dat:m1.m2.m3.n2.f:congr
+242	num:pl:gen.dat.inst.loc:m1.m2.m3.f.n1.n2.p1.p2:congr
+243	num:pl:gen.dat.inst.loc:m1.m2.m3.f.n2:congr
+244	num:pl:gen.dat.loc:m1.m2.m3.n2.f:congr
+245	num:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2:congr
+246	num:pl:gen.loc:m1.m2.m3.n2.f:congr
+247	num:pl:gen:n1.p1.p2:rec
+248	num:pl:inst:f:congr
+249	num:pl:inst:m1.m2.m3.f.n1.n2.p1.p2:congr
+250	num:pl:inst:m1.m2.m3.f.n2:congr
+251	num:pl:inst:m1.m2.m3.n2:congr
+252	num:pl:inst:m1.m2.m3.n2.f:congr
+253	num:pl:inst:n1.p1.p2:rec
+254	num:pl:nom.acc:m1.m2.m3.f.n1.n2.p1.p2:rec
+255	num:pl:nom.acc.voc:f:congr
+256	num:pl:nom.acc.voc:m1:rec
+257	num:pl:nom.acc.voc:m2.m3.f.n1.n2.p1.p2:rec
+258	num:pl:nom.acc.voc:m2.m3.f.n2:rec
+259	num:pl:nom.acc.voc:m2.m3.n2:congr
+260	num:pl:nom.acc.voc:m2.m3.n2.f:congr
+261	num:pl:nom.acc.voc:n1.p1.p2:rec
+262	num:pl:nom.gen.dat.inst.acc.loc.voc:m1.m2.m3.f.n1.n2.p1.p2:rec
+263	num:pl:nom.voc:m1:congr
+264	num:pl:nom.voc:m1:rec
+265	num:sg:nom.gen.dat.inst.acc.loc.voc:f:rec
+266	num:sg:nom.gen.dat.inst.acc.loc.voc:m1.m2.m3.n1.n2:rec
+# numeral compounds forming form:
+238	num:comp
+# PREPOSITIONS
+578	prep:acc
+579	prep:acc:nwok
+580	prep:acc:wok
+581	prep:dat
+582	prep:gen
+583	prep:gen:nwok
+584	prep:gen:wok
+585	prep:inst
+586	prep:inst:nwok
+587	prep:inst:wok
+588	prep:loc
+589	prep:loc:nwok
+590	prep:loc:wok
+591	prep:nom
+# ADVERBS
+79	adv
+80	adv:com
+81	adv:pos
+82	adv:sup
+# OTHER
+# kubliki (particles):
+592	qub
+# conjunctions:
+148	conj
+# complementizers:
+99	comp
+# interjections:
+234	interj
+# burkinostki (bound words):
+98	burk
+# abbreviations:
+97	brev:pun
+97	brev:npun
+# punctuation:
+235	interp
+# digits:
+151	dig
+# Roman digits:
+593	romandig
+# emoticons:
+152	emoticon
+# prefixes:
+574	prefa
+575	prefppas
+576	prefs
+577	prefv
+# (special) 
+236	naj
+237	nie
diff --git a/tests/generator/test_additional_atomic_segments/segmentation.dat b/tests/generator/test_additional_atomic_segments/segmentation.dat
index 51f32db..91b43ed 100644
--- a/tests/generator/test_additional_atomic_segments/segmentation.dat
+++ b/tests/generator/test_additional_atomic_segments/segmentation.dat
@@ -33,9 +33,9 @@ adj
 samodz
 
 [lexemes]
-kropka	.:interp
-przecinek	,:interp
-dywiz	-:interp
+kropka	.	interp
+przecinek	,	interp
+dywiz	-	interp
 
 [tags]
 dig	dig
diff --git a/tests/generator/test_digits/segmentation.dat b/tests/generator/test_digits/segmentation.dat
index 4bac5b3..2fb6a49 100644
--- a/tests/generator/test_digits/segmentation.dat
+++ b/tests/generator/test_digits/segmentation.dat
@@ -27,9 +27,9 @@ dig
 samodz
 
 [lexemes]
-kropka	.:interp
-przecinek	,:interp
-dywiz	-:interp
+kropka	.	interp
+przecinek	,	interp
+dywiz	-	interp
 
 [tags]
 dig	dig
diff --git a/tests/generator/test_names/segmentation.dat b/tests/generator/test_names/segmentation.dat
index 4bac5b3..2fb6a49 100644
--- a/tests/generator/test_names/segmentation.dat
+++ b/tests/generator/test_names/segmentation.dat
@@ -27,9 +27,9 @@ dig
 samodz
 
 [lexemes]
-kropka	.:interp
-przecinek	,:interp
-dywiz	-:interp
+kropka	.	interp
+przecinek	,	interp
+dywiz	-	interp
 
 [tags]
 dig	dig
diff --git a/tests/generator/test_qualifiers/segmentation.dat b/tests/generator/test_qualifiers/segmentation.dat
index 4bac5b3..2fb6a49 100644
--- a/tests/generator/test_qualifiers/segmentation.dat
+++ b/tests/generator/test_qualifiers/segmentation.dat
@@ -27,9 +27,9 @@ dig
 samodz
 
 [lexemes]
-kropka	.:interp
-przecinek	,:interp
-dywiz	-:interp
+kropka	.	interp
+przecinek	,	interp
+dywiz	-	interp
 
 [tags]
 dig	dig
diff --git a/tests/generator/test_segtypes/ARGS b/tests/generator/test_segtypes/ARGS
new file mode 100644
index 0000000..4fd99ea
--- /dev/null
+++ b/tests/generator/test_segtypes/ARGS
@@ -0,0 +1 @@
+--aggl permissive
diff --git a/tests/generator/test_segtypes/dictionary.tab b/tests/generator/test_segtypes/dictionary.tab
new file mode 100644
index 0000000..109a0bb
--- /dev/null
+++ b/tests/generator/test_segtypes/dictionary.tab
@@ -0,0 +1,11 @@
+mikro	mikro	prefs
+euro	euro	prefs
+super	super	prefs
+kot	kot	subst:sg:nom:m1	imie	mikro|zzz
+kot	kot	subst:sg:nom:m1	nazwisko	euro
+kot	kot	subst:sg:nom:m1		xxx|yyy|super
+kot	kot	subst:sg:nom:m1		samodzielnie|zzz
+kot	kot	subst:sg:nom:m2	imie	samodzielnie
+kot	kot	adj:sg:acc:m3:pos		nigdy
+pies	pies	subst:sg:acc:m3		aaa|zzz|euro
+pies	pies	subst:sg:nom:m1	nazwisko	yyy|zzz|samodzielnie
diff --git a/tests/generator/test_segtypes/input.txt b/tests/generator/test_segtypes/input.txt
new file mode 100644
index 0000000..ba1c944
--- /dev/null
+++ b/tests/generator/test_segtypes/input.txt
@@ -0,0 +1,9 @@
+kot
+eurokot
+superkot
+mikrokot
+kotkot
+pies
+europies
+superpies
+mikropies
diff --git a/tests/generator/test_segtypes/output.txt b/tests/generator/test_segtypes/output.txt
new file mode 100644
index 0000000..21f6e70
--- /dev/null
+++ b/tests/generator/test_segtypes/output.txt
@@ -0,0 +1,11 @@
+[kot,kot,subst:sg:nom:m1,_,samodzielnie|zzz
+ kot,kot,subst:sg:nom:m2,imie,samodzielnie]
+[eurokot,eurokot,subst:sg:nom:m1,nazwisko,euro]
+[superkot,superkot,subst:sg:nom:m1,_,super|xxx|yyy]
+[mikrokot,mikrokot,subst:sg:nom:m1,imie,mikro|zzz]
+[kotkot,kotkot,ign,_,_]
+[pies,pies,subst:sg:nom:m1,nazwisko,samodzielnie|yyy|zzz]
+[europies,europies,subst:sg:acc:m3,_,aaa|zzz|euro]
+[superpies,superpies,ign,_,_]
+[mikropies,mikropies,ign,_,_]
+
diff --git a/tests/generator/test_segtypes/segmentation.dat b/tests/generator/test_segtypes/segmentation.dat
new file mode 100644
index 0000000..1914f71
--- /dev/null
+++ b/tests/generator/test_segtypes/segmentation.dat
@@ -0,0 +1,45 @@
+[options]
+aggl=strict permissive isolated
+praet=split composite
+
+[combinations]
+
+samodzielnie
+mikro> tylko_z_mikro
+euro> tylko_z_euro
+super> tylko_z_super
+
+[segment types]
+tylko_z_mikro
+tylko_z_euro
+tylko_z_super
+samodzielnie
+nigdy
+mikro
+euro
+super
+
+[lexemes]
+tylko_z_mikro	kot	subst:%	name=imie	labels=zzz
+tylko_z_euro	kot	subst:%	name=nazwisko
+tylko_z_super	kot	subst:%	labels=xxx|yyy
+samodzielnie	kot	subst:%
+
+mikro	mikro	%
+euro	euro	%
+super	super	%
+
+[tags]
+tylko_z_euro	subst:%	labels=aaa
+samodzielnie	subst:%
+nigdy	%
+
+[separator chars]
+# ,
+44
+
+# .
+46
+
+# ;
+59
diff --git a/tests/generator/test_segtypes/tagset.dat b/tests/generator/test_segtypes/tagset.dat
new file mode 100644
index 0000000..b04a3aa
--- /dev/null
+++ b/tests/generator/test_segtypes/tagset.dat
@@ -0,0 +1,774 @@
+#!TAGSET-ID pl.sgjp.morfeusz-0.5.0
+
+[TAGS]
+# special: unknown word (ignotum):
+0	ign
+# special: space/blank:
+1	sp
+# NOUNS
+694	subst:sg:nom:m1
+695	subst:sg:nom:m2
+696	subst:sg:nom:m3
+697	subst:sg:nom:n1
+698	subst:sg:nom:n2
+693	subst:sg:nom:f
+676	subst:sg:gen:m1
+677	subst:sg:gen:m2
+678	subst:sg:gen:m3
+679	subst:sg:gen:n1
+680	subst:sg:gen:n2
+675	subst:sg:gen:f
+670	subst:sg:dat:m1
+671	subst:sg:dat:m2
+672	subst:sg:dat:m3
+673	subst:sg:dat:n1
+674	subst:sg:dat:n2
+669	subst:sg:dat:f
+664	subst:sg:acc:m1
+665	subst:sg:acc:m2
+666	subst:sg:acc:m3
+667	subst:sg:acc:n1
+668	subst:sg:acc:n2
+663	subst:sg:acc:f
+682	subst:sg:inst:m1
+683	subst:sg:inst:m2
+684	subst:sg:inst:m3
+685	subst:sg:inst:n1
+686	subst:sg:inst:n2
+681	subst:sg:inst:f
+688	subst:sg:loc:m1
+689	subst:sg:loc:m2
+690	subst:sg:loc:m3
+691	subst:sg:loc:n1
+692	subst:sg:loc:n2
+687	subst:sg:loc:f
+700	subst:sg:voc:m1
+701	subst:sg:voc:m2
+702	subst:sg:voc:m3
+703	subst:sg:voc:n1
+704	subst:sg:voc:n2
+699	subst:sg:voc:f
+646	subst:pl:nom:m1
+647	subst:pl:nom:m2
+648	subst:pl:nom:m3
+649	subst:pl:nom:n1
+650	subst:pl:nom:n2
+651	subst:pl:nom:p1
+652	subst:pl:nom:p2
+653	subst:pl:nom:p3
+645	subst:pl:nom:f
+619	subst:pl:gen:m1
+620	subst:pl:gen:m2
+621	subst:pl:gen:m3
+622	subst:pl:gen:n1
+623	subst:pl:gen:n2
+624	subst:pl:gen:p1
+625	subst:pl:gen:p2
+626	subst:pl:gen:p3
+618	subst:pl:gen:f
+610	subst:pl:dat:m1
+611	subst:pl:dat:m2
+612	subst:pl:dat:m3
+613	subst:pl:dat:n1
+614	subst:pl:dat:n2
+615	subst:pl:dat:p1
+616	subst:pl:dat:p2
+617	subst:pl:dat:p3
+609	subst:pl:dat:f
+601	subst:pl:acc:m1
+602	subst:pl:acc:m2
+603	subst:pl:acc:m3
+604	subst:pl:acc:n1
+605	subst:pl:acc:n2
+606	subst:pl:acc:p1
+607	subst:pl:acc:p2
+608	subst:pl:acc:p3
+600	subst:pl:acc:f
+628	subst:pl:inst:m1
+629	subst:pl:inst:m2
+630	subst:pl:inst:m3
+631	subst:pl:inst:n1
+632	subst:pl:inst:n2
+633	subst:pl:inst:p1
+634	subst:pl:inst:p2
+635	subst:pl:inst:p3
+627	subst:pl:inst:f
+637	subst:pl:loc:m1
+638	subst:pl:loc:m2
+639	subst:pl:loc:m3
+640	subst:pl:loc:n1
+641	subst:pl:loc:n2
+642	subst:pl:loc:p1
+643	subst:pl:loc:p2
+644	subst:pl:loc:p3
+636	subst:pl:loc:f
+654	subst:pl:voc:f
+655	subst:pl:voc:m1
+656	subst:pl:voc:m2
+657	subst:pl:voc:m3
+658	subst:pl:voc:n1
+659	subst:pl:voc:n2
+660	subst:pl:voc:p1
+661	subst:pl:voc:p2
+662	subst:pl:voc:p3
+# depreciative nominal flexeme:
+149	depr:pl:nom:m2
+150	depr:pl:voc:m2
+# nominal compounds forming form:
+599	substa
+# PERSONAL PRONOUNS
+443	ppron12:sg:acc:m1.m2.m3.f.n1.n2:pri:akc
+444	ppron12:sg:acc:m1.m2.m3.f.n1.n2:pri:nakc
+445	ppron12:sg:acc:m1.m2.m3.f.n1.n2:sec:akc
+446	ppron12:sg:acc:m1.m2.m3.f.n1.n2:sec:nakc
+447	ppron12:sg:dat:m1.m2.m3.f.n1.n2:pri:akc
+448	ppron12:sg:dat:m1.m2.m3.f.n1.n2:pri:nakc
+449	ppron12:sg:dat:m1.m2.m3.f.n1.n2:sec:akc
+450	ppron12:sg:dat:m1.m2.m3.f.n1.n2:sec:nakc
+451	ppron12:sg:gen:m1.m2.m3.f.n1.n2:pri:akc
+452	ppron12:sg:gen:m1.m2.m3.f.n1.n2:pri:nakc
+453	ppron12:sg:gen:m1.m2.m3.f.n1.n2:sec:akc
+454	ppron12:sg:gen:m1.m2.m3.f.n1.n2:sec:nakc
+455	ppron12:sg:inst:m1.m2.m3.f.n1.n2:pri
+456	ppron12:sg:inst:m1.m2.m3.f.n1.n2:sec
+457	ppron12:sg:loc:m1.m2.m3.f.n1.n2:pri
+458	ppron12:sg:loc:m1.m2.m3.f.n1.n2:sec
+459	ppron12:sg:nom:m1.m2.m3.f.n1.n2:pri
+460	ppron12:sg:nom:m1.m2.m3.f.n1.n2:sec
+461	ppron12:sg:voc:m1.m2.m3.f.n1.n2:sec
+429	ppron12:pl:acc:_:pri
+430	ppron12:pl:acc:_:sec
+431	ppron12:pl:dat:_:pri
+432	ppron12:pl:dat:_:sec
+433	ppron12:pl:gen:_:pri
+434	ppron12:pl:gen:_:sec
+435	ppron12:pl:inst:_:pri
+436	ppron12:pl:inst:_:sec
+437	ppron12:pl:loc:_:pri
+438	ppron12:pl:loc:_:sec
+439	ppron12:pl:nom:_:pri
+440	ppron12:pl:nom:_:sec
+441	ppron12:pl:voc:_:pri
+442	ppron12:pl:voc:_:sec
+474	ppron3:sg:acc:f:ter:_:npraep
+475	ppron3:sg:acc:f:ter:_:praep
+476	ppron3:sg:acc:m1.m2.m3:ter:akc:npraep
+477	ppron3:sg:acc:m1.m2.m3:ter:akc:praep
+478	ppron3:sg:acc:m1.m2.m3:ter:nakc:npraep
+479	ppron3:sg:acc:m1.m2.m3:ter:nakc:praep
+480	ppron3:sg:acc:n1.n2:ter:_:npraep
+481	ppron3:sg:acc:n1.n2:ter:_:praep
+482	ppron3:sg:dat:f:ter:_:npraep
+483	ppron3:sg:dat:f:ter:_:praep
+484	ppron3:sg:dat:m1.m2.m3:ter:akc:npraep
+485	ppron3:sg:dat:m1.m2.m3:ter:nakc:npraep
+486	ppron3:sg:dat:m1.m2.m3:ter:_:praep
+487	ppron3:sg:dat:n1.n2:ter:akc:npraep
+488	ppron3:sg:dat:n1.n2:ter:nakc:npraep
+489	ppron3:sg:dat:n1.n2:ter:_:praep
+490	ppron3:sg:gen.acc:m1.m2.m3:ter:nakc:praep
+491	ppron3:sg:gen:f:ter:_:npraep
+492	ppron3:sg:gen:f:ter:_:praep
+493	ppron3:sg:gen:m1.m2.m3:ter:akc:npraep
+494	ppron3:sg:gen:m1.m2.m3:ter:akc:praep
+495	ppron3:sg:gen:m1.m2.m3:ter:nakc:npraep
+496	ppron3:sg:gen:m1.m2.m3:ter:nakc:praep
+497	ppron3:sg:gen:n1.n2:ter:akc:npraep
+498	ppron3:sg:gen:n1.n2:ter:nakc:npraep
+499	ppron3:sg:gen:n1.n2:ter:_:praep
+500	ppron3:sg:inst:f:ter:_:praep
+501	ppron3:sg:inst:m1.m2.m3:ter:_:_
+502	ppron3:sg:inst:n1.n2:ter:_:_
+503	ppron3:sg:loc:f:ter:_:_
+504	ppron3:sg:loc:m1.m2.m3:ter:_:_
+505	ppron3:sg:loc:n1.n2:ter:_:_
+506	ppron3:sg:nom:f:ter:_:_
+507	ppron3:sg:nom:m1.m2.m3:ter:_:_
+508	ppron3:sg:nom:n1.n2:ter:_:_
+462	ppron3:pl:acc:m1.p1:ter:_:npraep
+463	ppron3:pl:acc:m1.p1:ter:_:praep
+464	ppron3:pl:acc:m2.m3.f.n1.n2.p2.p3:ter:_:npraep
+465	ppron3:pl:acc:m2.m3.f.n1.n2.p2.p3:ter:_:praep
+466	ppron3:pl:dat:_:ter:_:npraep
+467	ppron3:pl:dat:_:ter:_:praep
+468	ppron3:pl:gen:_:ter:_:npraep
+469	ppron3:pl:gen:_:ter:_:praep
+470	ppron3:pl:inst:_:ter:_:_
+471	ppron3:pl:loc:_:ter:_:_
+472	ppron3:pl:nom:m1.p1:ter:_:_
+473	ppron3:pl:nom:m2.m3.f.n1.n2.p2.p3:ter:_:_
+# PRONOUN ‘SIEBIE’
+594	siebie:acc
+595	siebie:dat
+596	siebie:gen
+597	siebie:inst
+598	siebie:loc
+# ADJECTIVES
+5	adj:pl:acc:m1.p1:com
+6	adj:pl:acc:m1.p1:pos
+7	adj:pl:acc:m1.p1:sup
+8	adj:pl:acc:m2.m3.f.n1.n2.p2.p3:com
+9	adj:pl:acc:m2.m3.f.n1.n2.p2.p3:pos
+10	adj:pl:acc:m2.m3.f.n1.n2.p2.p3:sup
+11	adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:com
+12	adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
+13	adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
+14	adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:com
+15	adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
+16	adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
+17	adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:com
+18	adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
+19	adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
+20	adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:com
+21	adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
+22	adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
+23	adj:pl:nom:m1.p1:pos
+24	adj:pl:nom:m2.m3.f.n1.n2.p2.p3:pos
+25	adj:pl:nom.voc:m1.p1:com
+26	adj:pl:nom.voc:m1.p1:pos
+27	adj:pl:nom.voc:m1.p1:sup
+28	adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:com
+29	adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:pos
+30	adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:sup
+31	adj:sg:acc:f:com
+32	adj:sg:acc:f:pos
+33	adj:sg:acc:f:sup
+34	adj:sg:acc:m1.m2:com
+35	adj:sg:acc:m1.m2:pos
+36	adj:sg:acc:m1.m2:sup
+37	adj:sg:acc:m3:com
+38	adj:sg:acc:m3:pos
+39	adj:sg:acc:m3:sup
+40	adj:sg:acc:n1.n2:com
+41	adj:sg:acc:n1.n2:pos
+42	adj:sg:acc:n1.n2:sup
+43	adj:sg:dat:f:com
+44	adj:sg:dat:f:pos
+45	adj:sg:dat:f:sup
+46	adj:sg:dat:m1.m2.m3.n1.n2:com
+47	adj:sg:dat:m1.m2.m3.n1.n2:pos
+48	adj:sg:dat:m1.m2.m3.n1.n2:sup
+49	adj:sg:gen:f:com
+50	adj:sg:gen:f:pos
+51	adj:sg:gen:f:sup
+52	adj:sg:gen:m1.m2.m3.n1.n2:com
+53	adj:sg:gen:m1.m2.m3.n1.n2:pos
+54	adj:sg:gen:m1.m2.m3.n1.n2:sup
+55	adj:sg:inst:f:com
+56	adj:sg:inst:f:pos
+57	adj:sg:inst:f:sup
+58	adj:sg:inst:m1.m2.m3.n1.n2:com
+59	adj:sg:inst:m1.m2.m3.n1.n2:pos
+60	adj:sg:inst:m1.m2.m3.n1.n2:sup
+61	adj:sg:loc:f:com
+62	adj:sg:loc:f:pos
+63	adj:sg:loc:f:sup
+64	adj:sg:loc:m1.m2.m3.n1.n2:com
+65	adj:sg:loc:m1.m2.m3.n1.n2:pos
+66	adj:sg:loc:m1.m2.m3.n1.n2:sup
+67	adj:sg:nom:f:pos
+68	adj:sg:nom:m1.m2.m3:pos
+69	adj:sg:nom:n1.n2:pos
+70	adj:sg:nom.voc:f:com
+71	adj:sg:nom.voc:f:pos
+72	adj:sg:nom.voc:f:sup
+73	adj:sg:nom.voc:m1.m2.m3:com
+74	adj:sg:nom.voc:m1.m2.m3:pos
+75	adj:sg:nom.voc:m1.m2.m3:sup
+76	adj:sg:nom.voc:n1.n2:com
+77	adj:sg:nom.voc:n1.n2:pos
+78	adj:sg:nom.voc:n1.n2:sup
+# adjectival compounds forming form:
+2	adja
+# predicative adjective:
+3	adjc
+# post-prepositional adjective:
+4	adjp
+# VERBS
+# finitive (present/future) flexeme:
+153	fin:pl:pri:imperf
+154	fin:pl:pri:imperf.perf
+155	fin:pl:pri:perf
+156	fin:pl:sec:imperf
+157	fin:pl:sec:imperf.perf
+158	fin:pl:sec:perf
+159	fin:pl:ter:imperf
+160	fin:pl:ter:imperf.perf
+161	fin:pl:ter:perf
+162	fin:sg:pri:imperf
+163	fin:sg:pri:imperf.perf
+164	fin:sg:pri:perf
+165	fin:sg:sec:imperf
+166	fin:sg:sec:imperf.perf
+167	fin:sg:sec:perf
+168	fin:sg:ter:imperf
+169	fin:sg:ter:imperf.perf
+170	fin:sg:ter:perf
+# past flexeme:
+# praet=split (unsued otherwise):
+509	praet:pl:m1.p1:imperf
+510	praet:pl:m1.p1:imperf.perf
+511	praet:pl:m1.p1:perf
+521	praet:pl:m2.m3.f.n1.n2.p2.p3:imperf
+522	praet:pl:m2.m3.f.n1.n2.p2.p3:imperf.perf
+523	praet:pl:m2.m3.f.n1.n2.p2.p3:perf
+533	praet:sg:f:imperf
+534	praet:sg:f:imperf.perf
+535	praet:sg:f:perf
+545	praet:sg:m1.m2.m3:imperf
+546	praet:sg:m1.m2.m3:imperf:agl
+547	praet:sg:m1.m2.m3:imperf:nagl
+548	praet:sg:m1.m2.m3:imperf.perf
+549	praet:sg:m1.m2.m3:perf
+550	praet:sg:m1.m2.m3:perf:agl
+551	praet:sg:m1.m2.m3:perf:nagl
+561	praet:sg:n1.n2:imperf
+562	praet:sg:n1.n2:imperf.perf
+563	praet:sg:n1.n2:perf
+# praet=composite (unsued otherwise):
+512	praet:pl:m1.p1:pri:imperf
+513	praet:pl:m1.p1:pri:imperf.perf
+514	praet:pl:m1.p1:pri:perf
+515	praet:pl:m1.p1:sec:imperf
+516	praet:pl:m1.p1:sec:imperf.perf
+517	praet:pl:m1.p1:sec:perf
+518	praet:pl:m1.p1:ter:imperf
+519	praet:pl:m1.p1:ter:imperf.perf
+520	praet:pl:m1.p1:ter:perf
+524	praet:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf
+525	praet:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf.perf
+526	praet:pl:m2.m3.f.n1.n2.p2.p3:pri:perf
+527	praet:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
+528	praet:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf.perf
+529	praet:pl:m2.m3.f.n1.n2.p2.p3:sec:perf
+530	praet:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
+531	praet:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf.perf
+532	praet:pl:m2.m3.f.n1.n2.p2.p3:ter:perf
+536	praet:sg:f:pri:imperf
+537	praet:sg:f:pri:imperf.perf
+538	praet:sg:f:pri:perf
+539	praet:sg:f:sec:imperf
+540	praet:sg:f:sec:imperf.perf
+541	praet:sg:f:sec:perf
+542	praet:sg:f:ter:imperf
+543	praet:sg:f:ter:imperf.perf
+544	praet:sg:f:ter:perf
+552	praet:sg:m1.m2.m3:pri:imperf
+553	praet:sg:m1.m2.m3:pri:imperf.perf
+554	praet:sg:m1.m2.m3:pri:perf
+555	praet:sg:m1.m2.m3:sec:imperf
+556	praet:sg:m1.m2.m3:sec:imperf.perf
+557	praet:sg:m1.m2.m3:sec:perf
+558	praet:sg:m1.m2.m3:ter:imperf
+559	praet:sg:m1.m2.m3:ter:imperf.perf
+560	praet:sg:m1.m2.m3:ter:perf
+564	praet:sg:n1.n2:pri:imperf
+565	praet:sg:n1.n2:pri:imperf.perf
+566	praet:sg:n1.n2:pri:perf
+567	praet:sg:n1.n2:sec:imperf
+568	praet:sg:n1.n2:sec:imperf.perf
+569	praet:sg:n1.n2:sec:perf
+570	praet:sg:n1.n2:ter:imperf
+571	praet:sg:n1.n2:ter:imperf.perf
+572	praet:sg:n1.n2:ter:perf
+# conditional mood (used only with praet=composite)
+100	cond:pl:m1.p1:pri:imperf
+101	cond:pl:m1.p1:pri:imperf.perf
+102	cond:pl:m1.p1:pri:perf
+103	cond:pl:m1.p1:sec:imperf
+104	cond:pl:m1.p1:sec:imperf.perf
+105	cond:pl:m1.p1:sec:perf
+106	cond:pl:m1.p1:ter:imperf
+107	cond:pl:m1.p1:ter:imperf.perf
+108	cond:pl:m1.p1:ter:perf
+109	cond:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf
+110	cond:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf.perf
+111	cond:pl:m2.m3.f.n1.n2.p2.p3:pri:perf
+112	cond:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
+113	cond:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf.perf
+114	cond:pl:m2.m3.f.n1.n2.p2.p3:sec:perf
+115	cond:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
+116	cond:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf.perf
+117	cond:pl:m2.m3.f.n1.n2.p2.p3:ter:perf
+118	cond:sg:f:pri:imperf
+119	cond:sg:f:pri:imperf.perf
+120	cond:sg:f:pri:perf
+121	cond:sg:f:sec:imperf
+122	cond:sg:f:sec:imperf.perf
+123	cond:sg:f:sec:perf
+124	cond:sg:f:ter:imperf
+125	cond:sg:f:ter:imperf.perf
+126	cond:sg:f:ter:perf
+127	cond:sg:m1.m2.m3:pri:imperf
+128	cond:sg:m1.m2.m3:pri:imperf.perf
+129	cond:sg:m1.m2.m3:pri:perf
+130	cond:sg:m1.m2.m3:sec:imperf
+131	cond:sg:m1.m2.m3:sec:imperf.perf
+132	cond:sg:m1.m2.m3:sec:perf
+133	cond:sg:m1.m2.m3:ter:imperf
+134	cond:sg:m1.m2.m3:ter:imperf.perf
+135	cond:sg:m1.m2.m3:ter:perf
+136	cond:sg:n1.n2:imperf
+137	cond:sg:n1.n2:imperf.perf
+138	cond:sg:n1.n2:perf
+139	cond:sg:n1.n2:pri:imperf
+140	cond:sg:n1.n2:pri:imperf.perf
+141	cond:sg:n1.n2:pri:perf
+142	cond:sg:n1.n2:sec:imperf
+143	cond:sg:n1.n2:sec:imperf.perf
+144	cond:sg:n1.n2:sec:perf
+145	cond:sg:n1.n2:ter:imperf
+146	cond:sg:n1.n2:ter:imperf.perf
+147	cond:sg:n1.n2:ter:perf
+# impersonal flexeme:
+219	imps:imperf
+220	imps:imperf.perf
+221	imps:perf
+# imperative flexeme:
+222	impt:pl:pri:imperf
+223	impt:pl:pri:imperf.perf
+224	impt:pl:pri:perf
+225	impt:pl:sec:imperf
+226	impt:pl:sec:imperf.perf
+227	impt:pl:sec:perf
+228	impt:sg:sec:imperf
+229	impt:sg:sec:imperf.perf
+230	impt:sg:sec:perf
+# infinitival flexeme:
+231	inf:imperf
+232	inf:imperf.perf
+233	inf:perf
+# agglutinative forms of ‘być’:
+83	aglt:pl:pri:imperf:nwok
+84	aglt:pl:pri:imperf:wok
+85	aglt:pl:sec:imperf:nwok
+86	aglt:pl:sec:imperf:wok
+87	aglt:sg:pri:imperf:nwok
+88	aglt:sg:pri:imperf:wok
+89	aglt:sg:sec:imperf:nwok
+90	aglt:sg:sec:imperf:wok
+# future forms of ‘być’:
+91	bedzie:pl:pri:imperf
+92	bedzie:pl:sec:imperf
+93	bedzie:pl:ter:imperf
+94	bedzie:sg:pri:imperf
+95	bedzie:sg:sec:imperf
+96	bedzie:sg:ter:imperf
+# ‘winien’ type verbs:
+705	winien:pl:m1.p1:imperf
+706	winien:pl:m1.p1:pri:imperf
+707	winien:pl:m1.p1:sec:imperf
+708	winien:pl:m1.p1:ter:imperf
+709	winien:pl:m2.m3.f.n1.n2.p2.p3:imperf
+710	winien:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
+711	winien:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
+712	winien:sg:f:imperf
+713	winien:sg:f:pri:imperf
+714	winien:sg:f:sec:imperf
+715	winien:sg:f:ter:imperf
+716	winien:sg:m1.m2.m3:imperf
+717	winien:sg:m1.m2.m3:pri:imperf
+718	winien:sg:m1.m2.m3:sec:imperf
+719	winien:sg:m1.m2.m3:ter:imperf
+720	winien:sg:n1.n2:imperf
+721	winien:sg:n1.n2:pri:imperf
+722	winien:sg:n1.n2:sec:imperf
+723	winien:sg:n1.n2:ter:imperf
+# predicative flexeme:
+573	pred
+# gerunds
+171	ger:pl:dat.loc:n2:imperf:aff
+172	ger:pl:dat.loc:n2:imperf:neg
+173	ger:pl:dat.loc:n2:imperf.perf:aff
+174	ger:pl:dat.loc:n2:imperf.perf:neg
+175	ger:pl:dat.loc:n2:perf:aff
+176	ger:pl:dat.loc:n2:perf:neg
+177	ger:pl:gen:n2:imperf:aff
+178	ger:pl:gen:n2:imperf:neg
+179	ger:pl:gen:n2:imperf.perf:aff
+180	ger:pl:gen:n2:imperf.perf:neg
+181	ger:pl:gen:n2:perf:aff
+182	ger:pl:gen:n2:perf:neg
+183	ger:pl:inst:n2:imperf:aff
+184	ger:pl:inst:n2:imperf:neg
+185	ger:pl:inst:n2:imperf.perf:aff
+186	ger:pl:inst:n2:imperf.perf:neg
+187	ger:pl:inst:n2:perf:aff
+188	ger:pl:inst:n2:perf:neg
+189	ger:pl:nom.acc:n2:imperf:aff
+190	ger:pl:nom.acc:n2:imperf:neg
+191	ger:pl:nom.acc:n2:imperf.perf:aff
+192	ger:pl:nom.acc:n2:imperf.perf:neg
+193	ger:pl:nom.acc:n2:perf:aff
+194	ger:pl:nom.acc:n2:perf:neg
+195	ger:sg:dat.loc:n2:imperf:aff
+196	ger:sg:dat.loc:n2:imperf:neg
+197	ger:sg:dat.loc:n2:imperf.perf:aff
+198	ger:sg:dat.loc:n2:imperf.perf:neg
+199	ger:sg:dat.loc:n2:perf:aff
+200	ger:sg:dat.loc:n2:perf:neg
+201	ger:sg:gen:n2:imperf:aff
+202	ger:sg:gen:n2:imperf:neg
+203	ger:sg:gen:n2:imperf.perf:aff
+204	ger:sg:gen:n2:imperf.perf:neg
+205	ger:sg:gen:n2:perf:aff
+206	ger:sg:gen:n2:perf:neg
+207	ger:sg:inst:n2:imperf:aff
+208	ger:sg:inst:n2:imperf:neg
+209	ger:sg:inst:n2:imperf.perf:aff
+210	ger:sg:inst:n2:imperf.perf:neg
+211	ger:sg:inst:n2:perf:aff
+212	ger:sg:inst:n2:perf:neg
+213	ger:sg:nom.acc:n2:imperf:aff
+214	ger:sg:nom.acc:n2:imperf:neg
+215	ger:sg:nom.acc:n2:imperf.perf:aff
+216	ger:sg:nom.acc:n2:imperf.perf:neg
+217	ger:sg:nom.acc:n2:perf:aff
+218	ger:sg:nom.acc:n2:perf:neg
+# participles
+# adverbial participles:
+332	pcon:imperf
+331	pant:perf
+# adjectival active participle:
+267	pact:pl:acc:m1.p1:imperf:aff
+268	pact:pl:acc:m1.p1:imperf:neg
+269	pact:pl:acc:m1.p1:imperf.perf:aff
+270	pact:pl:acc:m1.p1:imperf.perf:neg
+271	pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+272	pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+273	pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+274	pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+275	pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+276	pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+277	pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+278	pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+279	pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+280	pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+281	pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+282	pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+283	pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:aff
+284	pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:neg
+285	pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:aff
+286	pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:neg
+287	pact:pl:nom.voc:m1.p1:imperf:aff
+288	pact:pl:nom.voc:m1.p1:imperf:neg
+289	pact:pl:nom.voc:m1.p1:imperf.perf:aff
+290	pact:pl:nom.voc:m1.p1:imperf.perf:neg
+291	pact:sg:acc.inst:f:imperf:aff
+292	pact:sg:acc.inst:f:imperf:neg
+293	pact:sg:acc.inst:f:imperf.perf:aff
+294	pact:sg:acc.inst:f:imperf.perf:neg
+295	pact:sg:acc:m1.m2:imperf:aff
+296	pact:sg:acc:m1.m2:imperf:neg
+297	pact:sg:acc:m1.m2:imperf.perf:aff
+298	pact:sg:acc:m1.m2:imperf.perf:neg
+299	pact:sg:acc:m3:imperf:aff
+300	pact:sg:acc:m3:imperf:neg
+301	pact:sg:acc:m3:imperf.perf:aff
+302	pact:sg:acc:m3:imperf.perf:neg
+303	pact:sg:dat:m1.m2.m3.n1.n2:imperf:aff
+304	pact:sg:dat:m1.m2.m3.n1.n2:imperf:neg
+305	pact:sg:dat:m1.m2.m3.n1.n2:imperf.perf:aff
+306	pact:sg:dat:m1.m2.m3.n1.n2:imperf.perf:neg
+307	pact:sg:gen.dat.loc:f:imperf:aff
+308	pact:sg:gen.dat.loc:f:imperf:neg
+309	pact:sg:gen.dat.loc:f:imperf.perf:aff
+310	pact:sg:gen.dat.loc:f:imperf.perf:neg
+311	pact:sg:gen:m1.m2.m3.n1.n2:imperf:aff
+312	pact:sg:gen:m1.m2.m3.n1.n2:imperf:neg
+313	pact:sg:gen:m1.m2.m3.n1.n2:imperf.perf:aff
+314	pact:sg:gen:m1.m2.m3.n1.n2:imperf.perf:neg
+315	pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf:aff
+316	pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf:neg
+317	pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:aff
+318	pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:neg
+319	pact:sg:nom.acc.voc:n1.n2:imperf:aff
+320	pact:sg:nom.acc.voc:n1.n2:imperf:neg
+321	pact:sg:nom.acc.voc:n1.n2:imperf.perf:aff
+322	pact:sg:nom.acc.voc:n1.n2:imperf.perf:neg
+323	pact:sg:nom.voc:f:imperf:aff
+324	pact:sg:nom.voc:f:imperf:neg
+325	pact:sg:nom.voc:f:imperf.perf:aff
+326	pact:sg:nom.voc:f:imperf.perf:neg
+327	pact:sg:nom.voc:m1.m2.m3:imperf:aff
+328	pact:sg:nom.voc:m1.m2.m3:imperf:neg
+329	pact:sg:nom.voc:m1.m2.m3:imperf.perf:aff
+330	pact:sg:nom.voc:m1.m2.m3:imperf.perf:neg
+# adjectival passive participle:
+333	ppas:pl:acc:m1.p1:imperf:aff
+334	ppas:pl:acc:m1.p1:imperf:neg
+335	ppas:pl:acc:m1.p1:imperf.perf:aff
+336	ppas:pl:acc:m1.p1:imperf.perf:neg
+337	ppas:pl:acc:m1.p1:perf:aff
+338	ppas:pl:acc:m1.p1:perf:neg
+339	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+340	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+341	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+342	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+343	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
+344	ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
+345	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+346	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+347	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+348	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+349	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
+350	ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
+351	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
+352	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
+353	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
+354	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
+355	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
+356	ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
+357	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:aff
+358	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:neg
+359	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:aff
+360	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:neg
+361	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:perf:aff
+362	ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:perf:neg
+363	ppas:pl:nom.voc:m1.p1:imperf:aff
+364	ppas:pl:nom.voc:m1.p1:imperf:neg
+365	ppas:pl:nom.voc:m1.p1:imperf.perf:aff
+366	ppas:pl:nom.voc:m1.p1:imperf.perf:neg
+367	ppas:pl:nom.voc:m1.p1:perf:aff
+368	ppas:pl:nom.voc:m1.p1:perf:neg
+369	ppas:sg:acc.inst:f:imperf:aff
+370	ppas:sg:acc.inst:f:imperf:neg
+371	ppas:sg:acc.inst:f:imperf.perf:aff
+372	ppas:sg:acc.inst:f:imperf.perf:neg
+373	ppas:sg:acc.inst:f:perf:aff
+374	ppas:sg:acc.inst:f:perf:neg
+375	ppas:sg:acc:m1.m2:imperf:aff
+376	ppas:sg:acc:m1.m2:imperf:neg
+377	ppas:sg:acc:m1.m2:imperf.perf:aff
+378	ppas:sg:acc:m1.m2:imperf.perf:neg
+379	ppas:sg:acc:m1.m2:perf:aff
+380	ppas:sg:acc:m1.m2:perf:neg
+381	ppas:sg:acc:m3:imperf:aff
+382	ppas:sg:acc:m3:imperf:neg
+383	ppas:sg:acc:m3:imperf.perf:aff
+384	ppas:sg:acc:m3:imperf.perf:neg
+385	ppas:sg:acc:m3:perf:aff
+386	ppas:sg:acc:m3:perf:neg
+387	ppas:sg:dat:m1.m2.m3.n1.n2:imperf:aff
+388	ppas:sg:dat:m1.m2.m3.n1.n2:imperf:neg
+389	ppas:sg:dat:m1.m2.m3.n1.n2:imperf.perf:aff
+390	ppas:sg:dat:m1.m2.m3.n1.n2:imperf.perf:neg
+391	ppas:sg:dat:m1.m2.m3.n1.n2:perf:aff
+392	ppas:sg:dat:m1.m2.m3.n1.n2:perf:neg
+393	ppas:sg:gen.dat.loc:f:imperf:aff
+394	ppas:sg:gen.dat.loc:f:imperf:neg
+395	ppas:sg:gen.dat.loc:f:imperf.perf:aff
+396	ppas:sg:gen.dat.loc:f:imperf.perf:neg
+397	ppas:sg:gen.dat.loc:f:perf:aff
+398	ppas:sg:gen.dat.loc:f:perf:neg
+399	ppas:sg:gen:m1.m2.m3.n1.n2:imperf:aff
+400	ppas:sg:gen:m1.m2.m3.n1.n2:imperf:neg
+401	ppas:sg:gen:m1.m2.m3.n1.n2:imperf.perf:aff
+402	ppas:sg:gen:m1.m2.m3.n1.n2:imperf.perf:neg
+403	ppas:sg:gen:m1.m2.m3.n1.n2:perf:aff
+404	ppas:sg:gen:m1.m2.m3.n1.n2:perf:neg
+405	ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf:aff
+406	ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf:neg
+407	ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:aff
+408	ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:neg
+409	ppas:sg:inst.loc:m1.m2.m3.n1.n2:perf:aff
+410	ppas:sg:inst.loc:m1.m2.m3.n1.n2:perf:neg
+411	ppas:sg:nom.acc.voc:n1.n2:imperf:aff
+412	ppas:sg:nom.acc.voc:n1.n2:imperf:neg
+413	ppas:sg:nom.acc.voc:n1.n2:imperf.perf:aff
+414	ppas:sg:nom.acc.voc:n1.n2:imperf.perf:neg
+415	ppas:sg:nom.acc.voc:n1.n2:perf:aff
+416	ppas:sg:nom.acc.voc:n1.n2:perf:neg
+417	ppas:sg:nom.voc:f:imperf:aff
+418	ppas:sg:nom.voc:f:imperf:neg
+419	ppas:sg:nom.voc:f:imperf.perf:aff
+420	ppas:sg:nom.voc:f:imperf.perf:neg
+421	ppas:sg:nom.voc:f:perf:aff
+422	ppas:sg:nom.voc:f:perf:neg
+423	ppas:sg:nom.voc:m1.m2.m3:imperf:aff
+424	ppas:sg:nom.voc:m1.m2.m3:imperf:neg
+425	ppas:sg:nom.voc:m1.m2.m3:imperf.perf:aff
+426	ppas:sg:nom.voc:m1.m2.m3:imperf.perf:neg
+427	ppas:sg:nom.voc:m1.m2.m3:perf:aff
+428	ppas:sg:nom.voc:m1.m2.m3:perf:neg
+# NUMERALS
+239	num:pl:acc:m1:rec
+240	num:pl:dat.loc:n1.p1.p2:congr.rec
+241	num:pl:dat:m1.m2.m3.n2.f:congr
+242	num:pl:gen.dat.inst.loc:m1.m2.m3.f.n1.n2.p1.p2:congr
+243	num:pl:gen.dat.inst.loc:m1.m2.m3.f.n2:congr
+244	num:pl:gen.dat.loc:m1.m2.m3.n2.f:congr
+245	num:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2:congr
+246	num:pl:gen.loc:m1.m2.m3.n2.f:congr
+247	num:pl:gen:n1.p1.p2:rec
+248	num:pl:inst:f:congr
+249	num:pl:inst:m1.m2.m3.f.n1.n2.p1.p2:congr
+250	num:pl:inst:m1.m2.m3.f.n2:congr
+251	num:pl:inst:m1.m2.m3.n2:congr
+252	num:pl:inst:m1.m2.m3.n2.f:congr
+253	num:pl:inst:n1.p1.p2:rec
+254	num:pl:nom.acc:m1.m2.m3.f.n1.n2.p1.p2:rec
+255	num:pl:nom.acc.voc:f:congr
+256	num:pl:nom.acc.voc:m1:rec
+257	num:pl:nom.acc.voc:m2.m3.f.n1.n2.p1.p2:rec
+258	num:pl:nom.acc.voc:m2.m3.f.n2:rec
+259	num:pl:nom.acc.voc:m2.m3.n2:congr
+260	num:pl:nom.acc.voc:m2.m3.n2.f:congr
+261	num:pl:nom.acc.voc:n1.p1.p2:rec
+262	num:pl:nom.gen.dat.inst.acc.loc.voc:m1.m2.m3.f.n1.n2.p1.p2:rec
+263	num:pl:nom.voc:m1:congr
+264	num:pl:nom.voc:m1:rec
+265	num:sg:nom.gen.dat.inst.acc.loc.voc:f:rec
+266	num:sg:nom.gen.dat.inst.acc.loc.voc:m1.m2.m3.n1.n2:rec
+# numeral compounds forming form:
+238	num:comp
+# PREPOSITIONS
+578	prep:acc
+579	prep:acc:nwok
+580	prep:acc:wok
+581	prep:dat
+582	prep:gen
+583	prep:gen:nwok
+584	prep:gen:wok
+585	prep:inst
+586	prep:inst:nwok
+587	prep:inst:wok
+588	prep:loc
+589	prep:loc:nwok
+590	prep:loc:wok
+591	prep:nom
+# ADVERBS
+79	adv
+80	adv:com
+81	adv:pos
+82	adv:sup
+# OTHER
+# kubliki (particles):
+592	qub
+# conjunctions:
+148	conj
+# complementizers:
+99	comp
+# interjections:
+234	interj
+# burkinostki (bound words):
+98	burk
+# abbreviations:
+97	brev:pun
+97	brev:npun
+# punctuation:
+235	interp
+# digits:
+151	dig
+# Roman digits:
+593	romandig
+# emoticons:
+152	emoticon
+# prefixes:
+574	prefa
+575	prefppas
+576	prefs
+577	prefv
+# (special) 
+236	naj
+237	nie
--
libgit2 0.22.2