Commit caadb80095e7f7cc0889e08e52aa762a23a0533d

Authored by Michał Lenart
1 parent 50793551

- dodawanie wszystkich "atomowych" i samodzielnych segmentów dla generatora

- dodanie "magii" ze zmianą typów segmentów z sierżantem

git-svn-id: svn://svn.nlp.ipipan.waw.pl/morfeusz/trunk@273 ff4e3ee1-f430-4e82-ade0-24591c43f1fd
fsabuilder/morfeuszbuilder/fsa/common.py
... ... @@ -80,7 +80,8 @@ class Interpretation4Analyzer(object):
80 80 tuple(self.encodedForm.casePattern),
81 81 tuple(self.orthCasePattern),
82 82 self.tagnum,
83   - self.namenum)
  83 + self.namenum,
  84 + self.typenum)
84 85  
85 86 def __eq__(self, other):
86 87 if isinstance(other, Interpretation4Analyzer):
... ... @@ -109,7 +110,8 @@ class Interpretation4Generator(object):
109 110 self.encodedForm.cutLength,
110 111 tuple(self.encodedForm.suffixToAdd),
111 112 # tuple(self.encodedForm.casePattern),
112   - self.namenum)
  113 + self.namenum,
  114 + self.typenum)
113 115  
114 116 def __eq__(self, other):
115 117 if isinstance(other, Interpretation4Generator):
... ...
fsabuilder/morfeuszbuilder/fsa/convertinput.py
... ... @@ -14,9 +14,10 @@ def _mergeEntries(inputLines, lowercase):
14 14 for key, interp in inputLines:
15 15 key = key.lower() if lowercase else key
16 16 # print 'key=', key, 'interp=', interp
17   - if not key:
18   - print 'key=', key, 'interp=', interp
19   - assert key
  17 +# if not key:
  18 +# print 'key=', key, 'interp=', interp
  19 +# assert key
  20 + assert key
20 21 if prevKey and prevKey == key:
21 22 prevInterps.append(interp)
22 23 else:
... ... @@ -64,6 +65,15 @@ class PolimorfConverter4Analyzer(object):
64 65 typenum = self.segmentRulesManager.lexeme2SegmentTypeNum(base, tagnum)
65 66 qualifiers = qualifier.split('|') if qualifier else frozenset([u''])
66 67 qualsnum = self.qualifiersMap[frozenset(qualifiers)]
  68 +
  69 + assert not (
  70 + self.segmentRulesManager.shiftOrthMagic.shouldReplaceLemmaWithOrth(typenum)
  71 + and self.segmentRulesManager.shiftOrthMagic.getNewSegnum4ShiftOrth(typenum) != None)
  72 +
  73 + if self.segmentRulesManager.shiftOrthMagic.shouldReplaceLemmaWithOrth(typenum):
  74 + # print 'replace %s %s %s %d with %s %s %s %d' % (orth, base, tag, typenum, orth, orth, tag, typenum)
  75 + base = orth
  76 +
67 77 yield '\t'.join((
68 78 orth.encode(self.inputEncoding),
69 79 base.encode(self.inputEncoding),
... ... @@ -71,7 +81,18 @@ class PolimorfConverter4Analyzer(object):
71 81 str(namenum),
72 82 str(typenum),
73 83 str(qualsnum)))
74   - #~ qualifier.encode(self.inputEncoding)))
  84 +
  85 + if self.segmentRulesManager.shiftOrthMagic.getNewSegnum4ShiftOrth(typenum) != None:
  86 + # print 'add to existing %s %s %s %d also this: %s %s %s %d' % (orth, base, tag, typenum, orth, orth, tag, self.segmentRulesManager.shiftOrthMagic.getNewSegnum4ShiftOrth(typenum))
  87 + base = orth
  88 + typenum = self.segmentRulesManager.shiftOrthMagic.getNewSegnum4ShiftOrth(typenum)
  89 + yield '\t'.join((
  90 + orth.encode(self.inputEncoding),
  91 + base.encode(self.inputEncoding),
  92 + str(tagnum),
  93 + str(namenum),
  94 + str(typenum),
  95 + str(qualsnum)))
75 96  
76 97 # input lines are encoded and partially parsed
77 98 def _sortLines(self, inputLines):
... ... @@ -89,7 +110,7 @@ class PolimorfConverter4Analyzer(object):
89 110 #~ qualifiers = qualifierStr.split('|') if qualifierStr else []
90 111 qualsnum = int(qualsnum)
91 112 yield (orth, Interpretation4Analyzer(orth, base, tagnum, namenum, typenum, qualsnum))
92   -
  113 +
93 114 def convert(self, inputLines):
94 115 return _mergeEntries(self._reallyParseLines(self._sortLines(self._partiallyParseLines(inputLines))), lowercase=True)
95 116  
... ... @@ -120,15 +141,11 @@ class PolimorfConverter4Generator(object):
120 141 qualifiers = qualifier.split('|') if qualifier else frozenset([u''])
121 142 qualsnum = self.qualifiersMap[frozenset(qualifiers)]
122 143 typenum = self.segmentRulesManager.lexeme2SegmentTypeNum(base, tagnum)
123   -
124   - #~ print '\t'.join((
125   - #~ orth.encode(self.inputEncoding),
126   - #~ base.encode(self.inputEncoding),
127   - #~ str(tagnum),
128   - #~ str(namenum),
129   - #~ str(typenum),
130   - #~ homonymId.encode(self.inputEncoding),
131   - #~ qualifier.encode(self.inputEncoding)))
  144 +
  145 + if self.segmentRulesManager.shiftOrthMagic.shouldReplaceLemmaWithOrth(typenum):
  146 + # print 'replace %s %s %s %d with %s %s %s %d' % (orth, base, tag, typenum, orth, orth, tag, typenum)
  147 + base = orth
  148 +
132 149 yield '\t'.join((
133 150 orth.encode(self.inputEncoding),
134 151 base.encode(self.inputEncoding),
... ... @@ -137,6 +154,18 @@ class PolimorfConverter4Generator(object):
137 154 str(typenum),
138 155 homonymId.encode(self.inputEncoding),
139 156 str(qualsnum)))
  157 +
  158 + if self.segmentRulesManager.shiftOrthMagic.getNewSegnum4ShiftOrth(typenum) != None:
  159 + base = orth
  160 + typenum = self.segmentRulesManager.shiftOrthMagic.getNewSegnum4ShiftOrth(typenum)
  161 + yield '\t'.join((
  162 + orth.encode(self.inputEncoding),
  163 + base.encode(self.inputEncoding),
  164 + str(tagnum),
  165 + str(namenum),
  166 + str(typenum),
  167 + homonymId.encode(self.inputEncoding),
  168 + str(qualsnum)))
140 169 else:
141 170 logging.warn('Ignoring line: "%s" - contains empty lemma', line.strip())
142 171  
... ...
fsabuilder/morfeuszbuilder/fsa/encode.py
... ... @@ -47,21 +47,6 @@ class Encoder(object):
47 47 u'Too many segment types. The limit is %d' % limits.MAX_SEGMENT_TYPES)
48 48 return bytearray([typenum])
49 49  
50   - #~ def _encodeQualifiers(self, qualifiers):
51   - #~ res = bytearray()
52   - #~ key = frozenset(qualifiers)
53   - #~ if key in self.qualifiersMap:
54   - #~ exceptions.validate(key in self.qualifiersMap, u'Unknown qualifiers: %s' % qualifiers)
55   - #~ n = self.qualifiersMap[key]
56   - #~ else:
57   - #~ n = len(self.qualifiersMap)
58   - #~ self.qualifiersMap[key] = n
59   - #~ exceptions.validate(
60   - #~ n <= limits.MAX_QUALIFIERS_COMBINATIONS,
61   - #~ u'Too many qualifiers combinations. The limit is %d' % limits.MAX_QUALIFIERS_COMBINATIONS)
62   - #~ res.extend(htons(n))
63   - #~ return res
64   -
65 50 def _hasUpperPrefix(self, casePattern):
66 51 for i in range(len(casePattern) + 1):
67 52 if all(casePattern[:i]) and not any(casePattern[i:]):
... ... @@ -99,7 +84,6 @@ class Encoder(object):
99 84  
100 85 segnum2Interps = self._groupInterpsByType(interpsList)
101 86  
102   -
103 87 res = bytearray()
104 88  
105 89 for typenum, interpsList in segnum2Interps.iteritems():
... ...
fsabuilder/morfeuszbuilder/segrules/rules.py
... ... @@ -13,6 +13,7 @@ class SegmentRule(object):
13 13  
14 14 self.weak = False
15 15 self.linenum = linenum
  16 + self.autogenerated = False
16 17  
17 18 def setWeak(self, weak):
18 19 self.weak = weak
... ... @@ -36,16 +37,27 @@ class SegmentRule(object):
36 37 def isShiftOrthRule(self):
37 38 raise NotImplementedError()
38 39  
  40 + def getAtomicRules(self):
  41 + raise NotImplementedError()
  42 +
  43 + def getAdditionalAtomicRules4Generator(self):
  44 + raise NotImplementedError()
  45 +
  46 + def __repr__(self):
  47 + return str(self)
  48 +
39 49 class TagRule(SegmentRule):
40 50  
41   - def __init__(self, segnum, shiftOrth, segtype, linenum):
  51 + def __init__(self, segnum, shiftOrth, segtype, linenum, weak=False):
42 52 self.segnum = segnum
43 53 self.segtype = segtype
44 54 self.shiftOrth = shiftOrth
45 55 self.linenum = linenum
46   -
  56 + self.weak = weak
  57 + self.autogenerated = False
  58 +
47 59 def addToNFA(self, fsa):
48   - endState = RulesNFAState(self, final=True, weak=self.weak)
  60 + endState = RulesNFAState(self, final=True, weak=self.weak, autogenerated=self.autogenerated)
49 61 self._doAddToNFA(fsa.initialState, endState)
50 62  
51 63 def _doAddToNFA(self, startState, endState):
... ... @@ -68,6 +80,14 @@ class TagRule(SegmentRule):
68 80 def isShiftOrthRule(self):
69 81 return self.shiftOrth
70 82  
  83 + def getAtomicRules(self):
  84 + yield self
  85 +
  86 + def getAdditionalAtomicRules4Generator(self):
  87 + res = [ copy.deepcopy(self) ]
  88 + res[0].autogenerated = True
  89 + return res
  90 +
71 91 class UnaryRule(SegmentRule):
72 92  
73 93 def __init__(self, child, linenum):
... ... @@ -78,6 +98,13 @@ class UnaryRule(SegmentRule):
78 98 def isShiftOrthRule(self):
79 99 return self.child.isShiftOrthRule()
80 100  
  101 + def getAtomicRules(self):
  102 + for leaf in self.child.getAtomicRules():
  103 + yield leaf
  104 +
  105 + def getAdditionalAtomicRules4Generator(self):
  106 + return self.child.getAdditionalAtomicRules4Generator()
  107 +
81 108 class ComplexRule(SegmentRule):
82 109  
83 110 def __init__(self, children, linenum):
... ... @@ -86,13 +113,19 @@ class ComplexRule(SegmentRule):
86 113 assert not any(map(lambda c: c.isSinkRule(), children))
87 114  
88 115 def addToNFA(self, fsa):
89   - endState = RulesNFAState(self, final=True, weak=self.weak)
  116 + endState = RulesNFAState(self, final=True, weak=self.weak, autogenerated=self.autogenerated)
90 117 self._doAddToNFA(fsa.initialState, endState)
91 118  
  119 + def getAtomicRules(self):
  120 + for child in self.children:
  121 + for leaf in child.getAtomicRules():
  122 + yield leaf
  123 +
92 124 class ConcatRule(ComplexRule):
93 125  
94 126 def __init__(self, children, linenum):
95 127 super(ConcatRule, self).__init__(children, linenum)
  128 + assert type(children) == list
96 129  
97 130 def _doAddToNFA(self, startState, endState):
98 131 currStartState = startState
... ... @@ -129,7 +162,27 @@ class ConcatRule(ComplexRule):
129 162 res = ConcatRule(newChildren, self.linenum)
130 163 res.setWeak(self.weak)
131 164 return res
132   -
  165 +
  166 + def getAdditionalAtomicRules4Generator(self):
  167 + res = []
  168 + currShiftOrthRule = None
  169 + for rule in list(self.children):
  170 + if rule.isShiftOrthRule():
  171 + if currShiftOrthRule:
  172 + currShiftOrthRule = ConcatRule([currShiftOrthRule, rule], rule.linenum)
  173 + else:
  174 + currShiftOrthRule = rule
  175 + else:
  176 + for atomicRule in rule.getAdditionalAtomicRules4Generator():
  177 + if currShiftOrthRule:
  178 + res.append(ConcatRule([currShiftOrthRule, atomicRule], atomicRule.linenum))
  179 + else:
  180 + res.append(atomicRule)
  181 + currShiftOrthRule = None
  182 + for rule in res:
  183 + rule.autogenerated = True
  184 + return res
  185 +
133 186 class OrRule(ComplexRule):
134 187  
135 188 def __init__(self, children, linenum):
... ... @@ -161,6 +214,12 @@ class OrRule(ComplexRule):
161 214 res = OrRule(newChildren, self.linenum)
162 215 res.setWeak(self.weak)
163 216 return res
  217 +
  218 + def getAdditionalAtomicRules4Generator(self):
  219 + res = []
  220 + for rule in self.children:
  221 + res.extend(rule.getAdditionalAtomicRules4Generator())
  222 + return res
164 223  
165 224 class ZeroOrMoreRule(UnaryRule):
166 225  
... ... @@ -245,3 +304,6 @@ class SinkRule(SegmentRule):
245 304  
246 305 def __str__(self):
247 306 return '<<REMOVED>>'
  307 +
  308 + def getAdditionalAtomicRules4Generator(self):
  309 + return []
248 310 \ No newline at end of file
... ...
fsabuilder/morfeuszbuilder/segrules/rulesManager.py
... ... @@ -7,6 +7,7 @@ import logging
7 7 from morfeuszbuilder.utils.serializationUtils import htons, htonl
8 8 from morfeuszbuilder.utils import serializationUtils
9 9 from morfeuszbuilder.utils import exceptions
  10 +import shiftOrthMagic
10 11  
11 12 class RulesManager(object):
12 13  
... ... @@ -15,6 +16,7 @@ class RulesManager(object):
15 16 self.segtypes = segtypes
16 17 self.separatorsList = separatorsList
17 18 self.defaultOptions = None
  19 + self.shiftOrthMagic = shiftOrthMagic.ShiftOrthMagic()
18 20  
19 21 def _options2Key(self, optionsMap):
20 22 return frozenset(optionsMap.items())
... ...
fsabuilder/morfeuszbuilder/segrules/rulesNFA.py
... ... @@ -10,13 +10,14 @@ class RulesNFAState(object):
10 10  
11 11 statesCounter = 0
12 12  
13   - def __init__(self, rule, initial=False, final=False, weak=False):
  13 + def __init__(self, rule, initial=False, final=False, weak=False, autogenerated=False):
14 14 self.rule = rule
15 15 self.transitionsMap = {}
16 16 # self.transitionsDataMap = {}
17 17 self.initial = initial
18 18 self.final = final
19 19 self.weak = weak
  20 + self.autogenerated = autogenerated
20 21 self.idx = RulesNFAState.statesCounter
21 22 RulesNFAState.statesCounter += 1
22 23  
... ... @@ -69,12 +70,19 @@ class RulesNFA(object):
69 70 return res
70 71  
71 72 def _doConvertState(self, dfaState, nfaStates, nfaSubset2DFAState):
72   - if not all(map(lambda state: state.weak, filter(lambda state: state.final, nfaStates))) \
73   - and any(map(lambda state: state.weak, filter(lambda state: state.final, nfaStates))):
  73 + weakHits = map(
  74 + lambda state: state.weak,
  75 + filter(
  76 + lambda state: state.final and not state.autogenerated,
  77 + nfaStates))
  78 + if not all(weakHits) \
  79 + and any(weakHits):
74 80 weakState = list(filter(lambda state: state.final and state.weak, nfaStates))[0]
75 81 nonWeakState = list(filter(lambda state: state.final and not state.weak, nfaStates))[0]
76 82 raise InconsistentStateWeaknessException(weakState, nonWeakState)
77   - weak = any(map(lambda state: state.weak and state.final, nfaStates))
  83 + weak = any(map(
  84 + lambda state: state.weak and state.final,
  85 + filter(lambda state: not state.autogenerated, nfaStates)))
78 86 final = any(map(lambda state: state.final, nfaStates))
79 87 # assert not weak or not final
80 88 if final:
... ...
fsabuilder/morfeuszbuilder/segrules/rulesParser.py
... ... @@ -28,15 +28,17 @@ class RulesParser(object):
28 28 except Exception as ex:
29 29 raise exceptions.ConfigFileException(segtypesConfigFile.filename, lineNum, u'Error in [options] section: %s' % str(ex))
30 30 return res
31   -
  31 +
  32 + def _key2DefAsKey(self, key2Def):
  33 + return frozenset(key2Def.items())
  34 +
32 35 def parse(self, filename):
33 36  
34 37 segtypesConfigFile = configFile.ConfigFile(filename,
35 38 [
36 39 'options',
37 40 'combinations',
38   - 'generator combinations',
39   - 'tags',
  41 + 'tags',
40 42 'lexemes',
41 43 'segment types',
42 44 'separator chars'])
... ... @@ -53,14 +55,11 @@ class RulesParser(object):
53 55 for define in defs:
54 56 def2Key[define] = key
55 57  
56   - firstNFA = None
  58 + resultsMap = {}
57 59 for idx, defs in enumerate(itertools.product(*key2Defs.values())):
58 60 key2Def = dict([(def2Key[define], define) for define in defs])
59   - print key2Def
60   - nfa = rulesNFA.RulesNFA()
61   - if not firstNFA:
62   - firstNFA = nfa
63   -# section = 'combinations' if self.rulesType == RulesParser.PARSE4ANALYZER else 'generator combinations'
  61 + currRes = []
  62 + resultsMap[self._key2DefAsKey(key2Def)] = currRes
64 63 combinationEnumeratedLines = segtypesConfigFile.enumerateLinesInSection('combinations', ignoreComments=False)
65 64 combinationEnumeratedLines = list(preprocessor.preprocess(combinationEnumeratedLines, defs, filename))
66 65 for rule in self._doParse(combinationEnumeratedLines, segtypesHelper, filename):
... ... @@ -70,10 +69,28 @@ class RulesParser(object):
70 69 rule.linenum,
71 70 'This rule allows empty segments sequence to be accepted')
72 71 if self.rulesType == RulesParser.PARSE4GENERATOR:
  72 + additionalRules = rule.getAdditionalAtomicRules4Generator()
  73 + for rule in additionalRules:
  74 + rule.autogenerated = True
  75 + currRes.extend(additionalRules)
73 76 rule = rule.transformToGeneratorVersion()
74 77 if not rule.isSinkRule():
75   - rule.addToNFA(nfa)
  78 + currRes.append(rule)
76 79 # nfa.debug()
  80 +
  81 + # if self.rulesType == RulesParser.PARSE4GENERATOR:
  82 + # self.doGeneratorMagic(resultsMap)
  83 +
  84 + self.doShiftOrthMagic(resultsMap, res)
  85 +
  86 + for idx, defs in enumerate(itertools.product(*key2Defs.values())):
  87 + key2Def = dict([(def2Key[define], define) for define in defs])
  88 +
  89 + nfa = rulesNFA.RulesNFA()
  90 +
  91 + for rule in resultsMap[self._key2DefAsKey(key2Def)]:
  92 + rule.addToNFA(nfa)
  93 +
77 94 try:
78 95 dfa = nfa.convertToDFA()
79 96 res.addDFA(key2Def, dfa)
... ... @@ -82,11 +99,9 @@ class RulesParser(object):
82 99 filename,
83 100 ex.weakState.rule.linenum,
84 101 'conflicts with rule at line %d. Segmentation for some chunks can be both weak and non-weak which is illegal.' % ex.nonWeakState.rule.linenum)
85   -# print '********* DFA **************'
86   -# dfa.debug()
87   -# print dfa.tryToRecognize(bytearray([14]))
88 102 if idx == 0:
89 103 res.setDefaultOptions(key2Def)
  104 +
90 105 return res
91 106  
92 107 def _doParse(self, combinationEnumeratedLines, segtypesHelper, filename):
... ... @@ -162,9 +177,31 @@ class RulesParser(object):
162 177 quantRule3.setParseAction(lambda string, loc, toks: self._createQuantRule3(toks[0], int(toks[1], 10), lineNum, line, segtypesHelper))
163 178 optionalRule.setParseAction(lambda string, loc, toks: rules.OptionalRule(toks[0], lineNum))
164 179 oneOrMoreRule.setParseAction(lambda string, loc, toks: rules.ConcatRule([toks[0], rules.ZeroOrMoreRule(toks[0], lineNum)], lineNum))
165   - oneOfRule.setParseAction(lambda string, loc, toks: rules.OrRule(toks, lineNum))
166   - concatRule.setParseAction(lambda string, loc, toks: toks[0] if len(toks) == 1 else rules.ConcatRule(toks, lineNum))
  180 + oneOfRule.setParseAction(lambda string, loc, toks: rules.OrRule(list(toks), lineNum))
  181 + concatRule.setParseAction(lambda string, loc, toks: toks[0] if len(toks) == 1 else rules.ConcatRule(list(toks), lineNum))
167 182 rule.setParseAction(lambda string, loc, toks: toks[0].setWeak(len(toks) == 2))
168 183 parsedRule = pyparseString.pyparseString(rule, lineNum, line, filename)[0]
169 184 # print parsedRule, '-->', parsedRule.transformToGeneratorVersion()
170 185 return parsedRule
  186 +
  187 + # def doGeneratorMagic(self, resultsMap):
  188 + # print resultsMap
  189 + # for _, rules in resultsMap.iteritems():
  190 + # for rule in list(rules):
  191 + # rules.extend(rule.getAdditionalAtomicRules4Generator())
  192 + # print resultsMap
  193 +
  194 + def doShiftOrthMagic(self, resultsMap, rulesManager):
  195 +
  196 + shiftOrthSegtypes = set()
  197 + nonShiftOrthSegtypes = set()
  198 +
  199 + for _, rules in resultsMap.iteritems():
  200 + for rule in rules:
  201 + for atomicRule in rule.getAtomicRules():
  202 + if atomicRule.shiftOrth:
  203 + shiftOrthSegtypes.add(atomicRule.segtype)
  204 + else:
  205 + nonShiftOrthSegtypes.add(atomicRule.segtype)
  206 +
  207 + rulesManager.shiftOrthMagic.doShiftOrthMagic(resultsMap, rulesManager.segtypes, shiftOrthSegtypes, nonShiftOrthSegtypes)
... ...
fsabuilder/morfeuszbuilder/segrules/shiftOrthMagic.py 0 → 100644
  1 +
  2 +import sys
  3 +import logging
  4 +
  5 +class ShiftOrthMagic(object):
  6 +
  7 + def __init__(self):
  8 + # segnum -> newSegnum
  9 + # used to add (orth, orth, newSegnum) to input dictionary for each (orth, lemma, segnum) entry
  10 + self._bothShiftAndNonShiftSegnums = {}
  11 +
  12 + # list of segnums
  13 + # used to replace each (orth, lemma, segnum) with (orth, orth, segnum) in input dictionary
  14 + self._onlyShiftSegnums = set()
  15 +
  16 + def shouldReplaceLemmaWithOrth(self, typenum):
  17 + return typenum in self._onlyShiftSegnums
  18 +
  19 + def getNewSegnum4ShiftOrth(self, typenum):
  20 + return self._bothShiftAndNonShiftSegnums.get(typenum, None)
  21 +
  22 + def doShiftOrthMagic(self, resultsMap, segtypesHelper, shiftOrthSegtypes, nonShiftOrthSegtypes):
  23 +
  24 + nextNewSegnum = segtypesHelper.getMaxSegnum() + 1
  25 +
  26 + additionalIdsMap = {}
  27 +
  28 + for segtype in (shiftOrthSegtypes & nonShiftOrthSegtypes):
  29 + oldSegnum = segtypesHelper.getSegnum4Segtype(segtype)
  30 + if not oldSegnum in self._bothShiftAndNonShiftSegnums:
  31 + self._bothShiftAndNonShiftSegnums[oldSegnum] = nextNewSegnum
  32 + logging.info('')
  33 + additionalIdsMap[nextNewSegnum] = (segtype + '>')
  34 + nextNewSegnum += 1
  35 +
  36 + logging.info('segment number -> additional segment type (with ">")')
  37 + logging.info(str(additionalIdsMap))
  38 +
  39 + for segtype in shiftOrthSegtypes - nonShiftOrthSegtypes:
  40 + self._onlyShiftSegnums.add(segtypesHelper.getSegnum4Segtype(segtype))
  41 +
  42 + for _, rules in resultsMap.iteritems():
  43 + for rule in rules:
  44 + for atomicRule in rule.getAtomicRules():
  45 + if atomicRule.segnum in self._bothShiftAndNonShiftSegnums and atomicRule.shiftOrth:
  46 + # print 'replace segnum %d -> %d' % (atomicRule.segnum, self._bothShiftAndNonShiftSegnums[atomicRule.segnum])
  47 + atomicRule.segnum = self._bothShiftAndNonShiftSegnums[atomicRule.segnum]
... ...
fsabuilder/morfeuszbuilder/tagset/segtypes.py
... ... @@ -186,6 +186,9 @@ class Segtypes(object):
186 186 if res is None:
187 187 res = self._tagnum2Segnum.get(tagnum, None)
188 188 return res
  189 +
  190 + def getMaxSegnum(self):
  191 + return max(self.segnum2Segtype.keys())
189 192  
190 193 class SegtypePattern(object):
191 194  
... ...
morfeusz/MorfeuszImpl.cpp
... ... @@ -181,7 +181,6 @@ namespace morfeusz {
181 181 }
182 182  
183 183 MorfeuszImpl::~MorfeuszImpl() {
184   - cerr << "DELETE MorfeuszImpl" << endl;
185 184 }
186 185  
187 186 const char* getWordEndPtr(const TextReader& reader, const Environment& env) {
... ... @@ -339,6 +338,9 @@ namespace morfeusz {
339 338 const string& homonymId,
340 339 const InterpsGroup& ig,
341 340 vector<SegrulesState>& newSegrulesStates) const {
  341 + if (this->options.debug) {
  342 + std::cerr << "FOUND interps group, segmentType=" << (int) ig.type << std::endl;
  343 + }
342 344 bool caseMatches = env.getCasePatternHelper().checkInterpsGroupOrthCasePatterns(env, reader.getWordStartPtr(), reader.getCurrPtr(), ig);
343 345 if (caseMatches || options.caseHandling == CONDITIONALLY_CASE_SENSITIVE) {
344 346  
... ...
nbproject/configurations.xml
... ... @@ -339,8 +339,6 @@
339 339 ex="false"
340 340 tool="1"
341 341 flavor2="4">
342   - <ccTool flags="2">
343   - </ccTool>
344 342 </item>
345 343 <item path="build/morfeusz/wrappers/morfeuszPERL_wrap.cxx"
346 344 ex="false"
... ... @@ -878,45 +876,29 @@
878 876 </ccTool>
879 877 </item>
880 878 <item path="morfeusz/c_api/ResultsManager.cpp" ex="false" tool="1" flavor2="4">
881   - <ccTool flags="2">
882   - </ccTool>
883 879 </item>
884 880 <item path="morfeusz/case/CaseConverter.cpp" ex="false" tool="1" flavor2="4">
885   - <ccTool flags="2">
886   - </ccTool>
887 881 </item>
888 882 <item path="morfeusz/case/CasePatternHelper.cpp"
889 883 ex="false"
890 884 tool="1"
891 885 flavor2="4">
892   - <ccTool flags="2">
893   - </ccTool>
894 886 </item>
895 887 <item path="morfeusz/case/caseconv.cpp" ex="false" tool="1" flavor2="4">
896   - <ccTool flags="2">
897   - </ccTool>
898 888 </item>
899 889 <item path="morfeusz/charset/CharsetConverter.cpp"
900 890 ex="false"
901 891 tool="1"
902 892 flavor2="4">
903   - <ccTool flags="2">
904   - </ccTool>
905 893 </item>
906 894 <item path="morfeusz/charset/TextReader.cpp" ex="false" tool="1" flavor2="4">
907   - <ccTool flags="2">
908   - </ccTool>
909 895 </item>
910 896 <item path="morfeusz/charset/conversion_tables.cpp"
911 897 ex="false"
912 898 tool="1"
913 899 flavor2="4">
914   - <ccTool flags="2">
915   - </ccTool>
916 900 </item>
917 901 <item path="morfeusz/cli/cli.cpp" ex="false" tool="1" flavor2="4">
918   - <ccTool flags="2">
919   - </ccTool>
920 902 </item>
921 903 <item path="morfeusz/const.cpp" ex="false" tool="1" flavor2="4">
922 904 <ccTool flags="2">
... ... @@ -938,40 +920,28 @@
938 920 ex="false"
939 921 tool="1"
940 922 flavor2="4">
941   - <ccTool flags="2">
942   - </ccTool>
943 923 </item>
944 924 <item path="morfeusz/deserialization/MorphDeserializer.cpp"
945 925 ex="false"
946 926 tool="1"
947 927 flavor2="4">
948   - <ccTool flags="2">
949   - </ccTool>
950 928 </item>
951 929 <item path="morfeusz/deserialization/morphInterps/InterpretedChunksDecoder.cpp"
952 930 ex="false"
953 931 tool="1"
954 932 flavor2="4">
955   - <ccTool flags="2">
956   - </ccTool>
957 933 </item>
958 934 <item path="morfeusz/deserialization/morphInterps/InterpretedChunksDecoder4Analyzer.cpp"
959 935 ex="false"
960 936 tool="1"
961 937 flavor2="4">
962   - <ccTool flags="2">
963   - </ccTool>
964 938 </item>
965 939 <item path="morfeusz/deserialization/morphInterps/InterpretedChunksDecoder4Generator.cpp"
966 940 ex="false"
967 941 tool="1"
968 942 flavor2="4">
969   - <ccTool flags="2">
970   - </ccTool>
971 943 </item>
972 944 <item path="morfeusz/fsa/const.cpp" ex="false" tool="1" flavor2="4">
973   - <ccTool flags="2">
974   - </ccTool>
975 945 </item>
976 946 <item path="morfeusz/morfeusz2_c.cpp" ex="false" tool="1" flavor2="4">
977 947 <ccTool flags="2">
... ... @@ -1020,12 +990,8 @@
1020 990 </ccTool>
1021 991 </item>
1022 992 <item path="morfeusz/segrules/SegrulesFSA.cpp" ex="false" tool="1" flavor2="4">
1023   - <ccTool flags="2">
1024   - </ccTool>
1025 993 </item>
1026 994 <item path="morfeusz/segrules/segrules.cpp" ex="false" tool="1" flavor2="4">
1027   - <ccTool flags="2">
1028   - </ccTool>
1029 995 </item>
1030 996 <item path="morfeusz/test_runner.cpp" ex="false" tool="1" flavor2="4">
1031 997 <ccTool flags="0">
... ...
tests/generator/test_additional_atomic_segments/ARGS 0 → 100644
  1 +--aggl permissive
... ...
tests/generator/test_additional_atomic_segments/dictionary.tab 0 → 100644
  1 +nisko niski adja
  2 +- - interp
  3 +kwasowego kwasowy adj:sg:acc:m3:pos
... ...
tests/generator/test_additional_atomic_segments/input.txt 0 → 100644
  1 +niski
  2 +nisko
  3 +-
  4 +kwasowy
  5 +nisko-kwasowy
  6 +niski-kwasowy
  7 +niskokwasowy
... ...
tests/generator/test_additional_atomic_segments/output.txt 0 → 100644
  1 +[nisko,niski,adja,_,_]
  2 +[nisko,nisko,ign,_,_]
  3 +[-,-,interp,_,_]
  4 +[kwasowego,kwasowy,adj:sg:acc:m3:pos,_,_]
  5 +[nisko-kwasowy,nisko-kwasowy,ign,_,_]
  6 +[niski-kwasowy,niski-kwasowy,ign,_,_]
  7 +[niskokwasowego,niskokwasowy,adj:sg:acc:m3:pos,_,_]
  8 +
... ...
tests/generator/test_additional_atomic_segments/segmentation.dat 0 → 100644
  1 +[options]
  2 +aggl=strict permissive isolated
  3 +praet=split composite
  4 +
  5 +[combinations]
  6 +#define wsz_interp (interp|kropka|przecinek|dywiz)*
  7 +
  8 +#define moze_interp(segmenty) wsz_interp segmenty wsz_interp
  9 +
  10 +# Segmenty występujące samodzielnie:
  11 +#
  12 +# domyślny typ segmentu samodzielnego:
  13 +moze_interp(samodz)
  14 +
  15 +# Pojedyncze znaki interpunkcyjne
  16 +moze_interp(interp|kropka|przecinek|dywiz)
  17 +
  18 +# Liczba zapisana jako ciąg cyfr:
  19 +moze_interp( dig>* dig )
  20 +
  21 +# np. nisko-kwasowy
  22 +moze_interp( adja dywiz adj )
  23 +moze_interp( adja> adj )
  24 +
  25 +[segment types]
  26 +interp
  27 +kropka
  28 +przecinek
  29 +dywiz
  30 +dig
  31 +adja
  32 +adj
  33 +samodz
  34 +
  35 +[lexemes]
  36 +kropka .:interp
  37 +przecinek ,:interp
  38 +dywiz -:interp
  39 +
  40 +[tags]
  41 +dig dig
  42 +interp interp
  43 +adja adja
  44 +adj adj:%
  45 +samodz %
  46 +
  47 +[separator chars]
  48 +# ,
  49 +44
  50 +
  51 +# .
  52 +46
  53 +
  54 +# ;
  55 +59
... ...
tests/generator/test_additional_atomic_segments/tagset.dat 0 → 100644
  1 +#!MORFEUSZ-TAGSET 0.1
  2 +
  3 +[TAGS]
  4 +
  5 +0 ign
  6 +1 sp
  7 +2 adja
  8 +3 adjc
  9 +4 adjp
  10 +5 adj:pl:acc:m1.p1:com
  11 +6 adj:pl:acc:m1.p1:pos
  12 +7 adj:pl:acc:m1.p1:sup
  13 +8 adj:pl:acc:m2.m3.f.n1.n2.p2.p3:com
  14 +9 adj:pl:acc:m2.m3.f.n1.n2.p2.p3:pos
  15 +10 adj:pl:acc:m2.m3.f.n1.n2.p2.p3:sup
  16 +11 adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:com
  17 +12 adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
  18 +13 adj:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
  19 +14 adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:com
  20 +15 adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
  21 +16 adj:pl:gen:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
  22 +17 adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:com
  23 +18 adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
  24 +19 adj:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
  25 +20 adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:com
  26 +21 adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:pos
  27 +22 adj:pl:loc:m1.m2.m3.f.n1.n2.p1.p2.p3:sup
  28 +23 adj:pl:nom:m1.p1:pos
  29 +24 adj:pl:nom:m2.m3.f.n1.n2.p2.p3:pos
  30 +25 adj:pl:nom.voc:m1.p1:com
  31 +26 adj:pl:nom.voc:m1.p1:pos
  32 +27 adj:pl:nom.voc:m1.p1:sup
  33 +28 adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:com
  34 +29 adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:pos
  35 +30 adj:pl:nom.voc:m2.m3.f.n1.n2.p2.p3:sup
  36 +31 adj:sg:acc:f:com
  37 +32 adj:sg:acc:f:pos
  38 +33 adj:sg:acc:f:sup
  39 +34 adj:sg:acc:m1.m2:com
  40 +35 adj:sg:acc:m1.m2:pos
  41 +36 adj:sg:acc:m1.m2:sup
  42 +37 adj:sg:acc:m3:com
  43 +38 adj:sg:acc:m3:pos
  44 +39 adj:sg:acc:m3:sup
  45 +40 adj:sg:acc:n1.n2:com
  46 +41 adj:sg:acc:n1.n2:pos
  47 +42 adj:sg:acc:n1.n2:sup
  48 +43 adj:sg:dat:f:com
  49 +44 adj:sg:dat:f:pos
  50 +45 adj:sg:dat:f:sup
  51 +46 adj:sg:dat:m1.m2.m3.n1.n2:com
  52 +47 adj:sg:dat:m1.m2.m3.n1.n2:pos
  53 +48 adj:sg:dat:m1.m2.m3.n1.n2:sup
  54 +49 adj:sg:gen:f:com
  55 +50 adj:sg:gen:f:pos
  56 +51 adj:sg:gen:f:sup
  57 +52 adj:sg:gen:m1.m2.m3.n1.n2:com
  58 +53 adj:sg:gen:m1.m2.m3.n1.n2:pos
  59 +54 adj:sg:gen:m1.m2.m3.n1.n2:sup
  60 +55 adj:sg:inst:f:com
  61 +56 adj:sg:inst:f:pos
  62 +57 adj:sg:inst:f:sup
  63 +58 adj:sg:inst:m1.m2.m3.n1.n2:com
  64 +59 adj:sg:inst:m1.m2.m3.n1.n2:pos
  65 +60 adj:sg:inst:m1.m2.m3.n1.n2:sup
  66 +61 adj:sg:loc:f:com
  67 +62 adj:sg:loc:f:pos
  68 +63 adj:sg:loc:f:sup
  69 +64 adj:sg:loc:m1.m2.m3.n1.n2:com
  70 +65 adj:sg:loc:m1.m2.m3.n1.n2:pos
  71 +66 adj:sg:loc:m1.m2.m3.n1.n2:sup
  72 +67 adj:sg:nom:f:pos
  73 +68 adj:sg:nom:m1.m2.m3:pos
  74 +69 adj:sg:nom:n1.n2:pos
  75 +70 adj:sg:nom.voc:f:com
  76 +71 adj:sg:nom.voc:f:pos
  77 +72 adj:sg:nom.voc:f:sup
  78 +73 adj:sg:nom.voc:m1.m2.m3:com
  79 +74 adj:sg:nom.voc:m1.m2.m3:pos
  80 +75 adj:sg:nom.voc:m1.m2.m3:sup
  81 +76 adj:sg:nom.voc:n1.n2:com
  82 +77 adj:sg:nom.voc:n1.n2:pos
  83 +78 adj:sg:nom.voc:n1.n2:sup
  84 +79 adv
  85 +80 adv:com
  86 +81 adv:pos
  87 +82 adv:sup
  88 +83 aglt:pl:pri:imperf:nwok
  89 +84 aglt:pl:pri:imperf:wok
  90 +85 aglt:pl:sec:imperf:nwok
  91 +86 aglt:pl:sec:imperf:wok
  92 +87 aglt:sg:pri:imperf:nwok
  93 +88 aglt:sg:pri:imperf:wok
  94 +89 aglt:sg:sec:imperf:nwok
  95 +90 aglt:sg:sec:imperf:wok
  96 +91 bedzie:pl:pri:imperf
  97 +92 bedzie:pl:sec:imperf
  98 +93 bedzie:pl:ter:imperf
  99 +94 bedzie:sg:pri:imperf
  100 +95 bedzie:sg:sec:imperf
  101 +96 bedzie:sg:ter:imperf
  102 +97 brev:pun
  103 +98 burk
  104 +99 comp
  105 +100 cond:pl:m1.p1:pri:imperf
  106 +101 cond:pl:m1.p1:pri:imperf.perf
  107 +102 cond:pl:m1.p1:pri:perf
  108 +103 cond:pl:m1.p1:sec:imperf
  109 +104 cond:pl:m1.p1:sec:imperf.perf
  110 +105 cond:pl:m1.p1:sec:perf
  111 +106 cond:pl:m1.p1:ter:imperf
  112 +107 cond:pl:m1.p1:ter:imperf.perf
  113 +108 cond:pl:m1.p1:ter:perf
  114 +109 cond:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf
  115 +110 cond:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf.perf
  116 +111 cond:pl:m2.m3.f.n1.n2.p2.p3:pri:perf
  117 +112 cond:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
  118 +113 cond:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf.perf
  119 +114 cond:pl:m2.m3.f.n1.n2.p2.p3:sec:perf
  120 +115 cond:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
  121 +116 cond:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf.perf
  122 +117 cond:pl:m2.m3.f.n1.n2.p2.p3:ter:perf
  123 +118 cond:sg:f:pri:imperf
  124 +119 cond:sg:f:pri:imperf.perf
  125 +120 cond:sg:f:pri:perf
  126 +121 cond:sg:f:sec:imperf
  127 +122 cond:sg:f:sec:imperf.perf
  128 +123 cond:sg:f:sec:perf
  129 +124 cond:sg:f:ter:imperf
  130 +125 cond:sg:f:ter:imperf.perf
  131 +126 cond:sg:f:ter:perf
  132 +127 cond:sg:m1.m2.m3:pri:imperf
  133 +128 cond:sg:m1.m2.m3:pri:imperf.perf
  134 +129 cond:sg:m1.m2.m3:pri:perf
  135 +130 cond:sg:m1.m2.m3:sec:imperf
  136 +131 cond:sg:m1.m2.m3:sec:imperf.perf
  137 +132 cond:sg:m1.m2.m3:sec:perf
  138 +133 cond:sg:m1.m2.m3:ter:imperf
  139 +134 cond:sg:m1.m2.m3:ter:imperf.perf
  140 +135 cond:sg:m1.m2.m3:ter:perf
  141 +136 cond:sg:n1.n2:imperf
  142 +137 cond:sg:n1.n2:imperf.perf
  143 +138 cond:sg:n1.n2:perf
  144 +139 cond:sg:n1.n2:pri:imperf
  145 +140 cond:sg:n1.n2:pri:imperf.perf
  146 +141 cond:sg:n1.n2:pri:perf
  147 +142 cond:sg:n1.n2:sec:imperf
  148 +143 cond:sg:n1.n2:sec:imperf.perf
  149 +144 cond:sg:n1.n2:sec:perf
  150 +145 cond:sg:n1.n2:ter:imperf
  151 +146 cond:sg:n1.n2:ter:imperf.perf
  152 +147 cond:sg:n1.n2:ter:perf
  153 +148 conj
  154 +149 depr:pl:nom:m2
  155 +150 depr:pl:voc:m2
  156 +151 dig
  157 +152 emoticon
  158 +153 fin:pl:pri:imperf
  159 +154 fin:pl:pri:imperf.perf
  160 +155 fin:pl:pri:perf
  161 +156 fin:pl:sec:imperf
  162 +157 fin:pl:sec:imperf.perf
  163 +158 fin:pl:sec:perf
  164 +159 fin:pl:ter:imperf
  165 +160 fin:pl:ter:imperf.perf
  166 +161 fin:pl:ter:perf
  167 +162 fin:sg:pri:imperf
  168 +163 fin:sg:pri:imperf.perf
  169 +164 fin:sg:pri:perf
  170 +165 fin:sg:sec:imperf
  171 +166 fin:sg:sec:imperf.perf
  172 +167 fin:sg:sec:perf
  173 +168 fin:sg:ter:imperf
  174 +169 fin:sg:ter:imperf.perf
  175 +170 fin:sg:ter:perf
  176 +171 ger:pl:dat.loc:n2:imperf:aff
  177 +172 ger:pl:dat.loc:n2:imperf:neg
  178 +173 ger:pl:dat.loc:n2:imperf.perf:aff
  179 +174 ger:pl:dat.loc:n2:imperf.perf:neg
  180 +175 ger:pl:dat.loc:n2:perf:aff
  181 +176 ger:pl:dat.loc:n2:perf:neg
  182 +177 ger:pl:gen:n2:imperf:aff
  183 +178 ger:pl:gen:n2:imperf:neg
  184 +179 ger:pl:gen:n2:imperf.perf:aff
  185 +180 ger:pl:gen:n2:imperf.perf:neg
  186 +181 ger:pl:gen:n2:perf:aff
  187 +182 ger:pl:gen:n2:perf:neg
  188 +183 ger:pl:inst:n2:imperf:aff
  189 +184 ger:pl:inst:n2:imperf:neg
  190 +185 ger:pl:inst:n2:imperf.perf:aff
  191 +186 ger:pl:inst:n2:imperf.perf:neg
  192 +187 ger:pl:inst:n2:perf:aff
  193 +188 ger:pl:inst:n2:perf:neg
  194 +189 ger:pl:nom.acc:n2:imperf:aff
  195 +190 ger:pl:nom.acc:n2:imperf:neg
  196 +191 ger:pl:nom.acc:n2:imperf.perf:aff
  197 +192 ger:pl:nom.acc:n2:imperf.perf:neg
  198 +193 ger:pl:nom.acc:n2:perf:aff
  199 +194 ger:pl:nom.acc:n2:perf:neg
  200 +195 ger:sg:dat.loc:n2:imperf:aff
  201 +196 ger:sg:dat.loc:n2:imperf:neg
  202 +197 ger:sg:dat.loc:n2:imperf.perf:aff
  203 +198 ger:sg:dat.loc:n2:imperf.perf:neg
  204 +199 ger:sg:dat.loc:n2:perf:aff
  205 +200 ger:sg:dat.loc:n2:perf:neg
  206 +201 ger:sg:gen:n2:imperf:aff
  207 +202 ger:sg:gen:n2:imperf:neg
  208 +203 ger:sg:gen:n2:imperf.perf:aff
  209 +204 ger:sg:gen:n2:imperf.perf:neg
  210 +205 ger:sg:gen:n2:perf:aff
  211 +206 ger:sg:gen:n2:perf:neg
  212 +207 ger:sg:inst:n2:imperf:aff
  213 +208 ger:sg:inst:n2:imperf:neg
  214 +209 ger:sg:inst:n2:imperf.perf:aff
  215 +210 ger:sg:inst:n2:imperf.perf:neg
  216 +211 ger:sg:inst:n2:perf:aff
  217 +212 ger:sg:inst:n2:perf:neg
  218 +213 ger:sg:nom.acc:n2:imperf:aff
  219 +214 ger:sg:nom.acc:n2:imperf:neg
  220 +215 ger:sg:nom.acc:n2:imperf.perf:aff
  221 +216 ger:sg:nom.acc:n2:imperf.perf:neg
  222 +217 ger:sg:nom.acc:n2:perf:aff
  223 +218 ger:sg:nom.acc:n2:perf:neg
  224 +219 imps:imperf
  225 +220 imps:imperf.perf
  226 +221 imps:perf
  227 +222 impt:pl:pri:imperf
  228 +223 impt:pl:pri:imperf.perf
  229 +224 impt:pl:pri:perf
  230 +225 impt:pl:sec:imperf
  231 +226 impt:pl:sec:imperf.perf
  232 +227 impt:pl:sec:perf
  233 +228 impt:sg:sec:imperf
  234 +229 impt:sg:sec:imperf.perf
  235 +230 impt:sg:sec:perf
  236 +231 inf:imperf
  237 +232 inf:imperf.perf
  238 +233 inf:perf
  239 +234 interj
  240 +235 interp
  241 +236 naj
  242 +237 nie
  243 +238 num:comp
  244 +239 num:pl:acc:m1:rec
  245 +240 num:pl:dat.loc:n1.p1.p2:congr.rec
  246 +241 num:pl:dat:m1.m2.m3.n2.f:congr
  247 +242 num:pl:gen.dat.inst.loc:m1.m2.m3.f.n1.n2.p1.p2:congr
  248 +243 num:pl:gen.dat.inst.loc:m1.m2.m3.f.n2:congr
  249 +244 num:pl:gen.dat.loc:m1.m2.m3.n2.f:congr
  250 +245 num:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2:congr
  251 +246 num:pl:gen.loc:m1.m2.m3.n2.f:congr
  252 +247 num:pl:gen:n1.p1.p2:rec
  253 +248 num:pl:inst:f:congr
  254 +249 num:pl:inst:m1.m2.m3.f.n1.n2.p1.p2:congr
  255 +250 num:pl:inst:m1.m2.m3.f.n2:congr
  256 +251 num:pl:inst:m1.m2.m3.n2:congr
  257 +252 num:pl:inst:m1.m2.m3.n2.f:congr
  258 +253 num:pl:inst:n1.p1.p2:rec
  259 +254 num:pl:nom.acc:m1.m2.m3.f.n1.n2.p1.p2:rec
  260 +255 num:pl:nom.acc.voc:f:congr
  261 +256 num:pl:nom.acc.voc:m1:rec
  262 +257 num:pl:nom.acc.voc:m2.m3.f.n1.n2.p1.p2:rec
  263 +258 num:pl:nom.acc.voc:m2.m3.f.n2:rec
  264 +259 num:pl:nom.acc.voc:m2.m3.n2:congr
  265 +260 num:pl:nom.acc.voc:m2.m3.n2.f:congr
  266 +261 num:pl:nom.acc.voc:n1.p1.p2:rec
  267 +262 num:pl:nom.gen.dat.inst.acc.loc.voc:m1.m2.m3.f.n1.n2.p1.p2:rec
  268 +263 num:pl:nom.voc:m1:congr
  269 +264 num:pl:nom.voc:m1:rec
  270 +265 num:sg:nom.gen.dat.inst.acc.loc.voc:f:rec
  271 +266 num:sg:nom.gen.dat.inst.acc.loc.voc:m1.m2.m3.n1.n2:rec
  272 +267 pact:pl:acc:m1.p1:imperf:aff
  273 +268 pact:pl:acc:m1.p1:imperf:neg
  274 +269 pact:pl:acc:m1.p1:imperf.perf:aff
  275 +270 pact:pl:acc:m1.p1:imperf.perf:neg
  276 +271 pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
  277 +272 pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
  278 +273 pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
  279 +274 pact:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
  280 +275 pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
  281 +276 pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
  282 +277 pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
  283 +278 pact:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
  284 +279 pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
  285 +280 pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
  286 +281 pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
  287 +282 pact:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
  288 +283 pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:aff
  289 +284 pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:neg
  290 +285 pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:aff
  291 +286 pact:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:neg
  292 +287 pact:pl:nom.voc:m1.p1:imperf:aff
  293 +288 pact:pl:nom.voc:m1.p1:imperf:neg
  294 +289 pact:pl:nom.voc:m1.p1:imperf.perf:aff
  295 +290 pact:pl:nom.voc:m1.p1:imperf.perf:neg
  296 +291 pact:sg:acc.inst:f:imperf:aff
  297 +292 pact:sg:acc.inst:f:imperf:neg
  298 +293 pact:sg:acc.inst:f:imperf.perf:aff
  299 +294 pact:sg:acc.inst:f:imperf.perf:neg
  300 +295 pact:sg:acc:m1.m2:imperf:aff
  301 +296 pact:sg:acc:m1.m2:imperf:neg
  302 +297 pact:sg:acc:m1.m2:imperf.perf:aff
  303 +298 pact:sg:acc:m1.m2:imperf.perf:neg
  304 +299 pact:sg:acc:m3:imperf:aff
  305 +300 pact:sg:acc:m3:imperf:neg
  306 +301 pact:sg:acc:m3:imperf.perf:aff
  307 +302 pact:sg:acc:m3:imperf.perf:neg
  308 +303 pact:sg:dat:m1.m2.m3.n1.n2:imperf:aff
  309 +304 pact:sg:dat:m1.m2.m3.n1.n2:imperf:neg
  310 +305 pact:sg:dat:m1.m2.m3.n1.n2:imperf.perf:aff
  311 +306 pact:sg:dat:m1.m2.m3.n1.n2:imperf.perf:neg
  312 +307 pact:sg:gen.dat.loc:f:imperf:aff
  313 +308 pact:sg:gen.dat.loc:f:imperf:neg
  314 +309 pact:sg:gen.dat.loc:f:imperf.perf:aff
  315 +310 pact:sg:gen.dat.loc:f:imperf.perf:neg
  316 +311 pact:sg:gen:m1.m2.m3.n1.n2:imperf:aff
  317 +312 pact:sg:gen:m1.m2.m3.n1.n2:imperf:neg
  318 +313 pact:sg:gen:m1.m2.m3.n1.n2:imperf.perf:aff
  319 +314 pact:sg:gen:m1.m2.m3.n1.n2:imperf.perf:neg
  320 +315 pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf:aff
  321 +316 pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf:neg
  322 +317 pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:aff
  323 +318 pact:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:neg
  324 +319 pact:sg:nom.acc.voc:n1.n2:imperf:aff
  325 +320 pact:sg:nom.acc.voc:n1.n2:imperf:neg
  326 +321 pact:sg:nom.acc.voc:n1.n2:imperf.perf:aff
  327 +322 pact:sg:nom.acc.voc:n1.n2:imperf.perf:neg
  328 +323 pact:sg:nom.voc:f:imperf:aff
  329 +324 pact:sg:nom.voc:f:imperf:neg
  330 +325 pact:sg:nom.voc:f:imperf.perf:aff
  331 +326 pact:sg:nom.voc:f:imperf.perf:neg
  332 +327 pact:sg:nom.voc:m1.m2.m3:imperf:aff
  333 +328 pact:sg:nom.voc:m1.m2.m3:imperf:neg
  334 +329 pact:sg:nom.voc:m1.m2.m3:imperf.perf:aff
  335 +330 pact:sg:nom.voc:m1.m2.m3:imperf.perf:neg
  336 +331 pant:perf
  337 +332 pcon:imperf
  338 +333 ppas:pl:acc:m1.p1:imperf:aff
  339 +334 ppas:pl:acc:m1.p1:imperf:neg
  340 +335 ppas:pl:acc:m1.p1:imperf.perf:aff
  341 +336 ppas:pl:acc:m1.p1:imperf.perf:neg
  342 +337 ppas:pl:acc:m1.p1:perf:aff
  343 +338 ppas:pl:acc:m1.p1:perf:neg
  344 +339 ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
  345 +340 ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
  346 +341 ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
  347 +342 ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
  348 +343 ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
  349 +344 ppas:pl:dat:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
  350 +345 ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
  351 +346 ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
  352 +347 ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
  353 +348 ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
  354 +349 ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
  355 +350 ppas:pl:gen.loc:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
  356 +351 ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:aff
  357 +352 ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf:neg
  358 +353 ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:aff
  359 +354 ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:imperf.perf:neg
  360 +355 ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:aff
  361 +356 ppas:pl:inst:m1.m2.m3.f.n1.n2.p1.p2.p3:perf:neg
  362 +357 ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:aff
  363 +358 ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf:neg
  364 +359 ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:aff
  365 +360 ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:imperf.perf:neg
  366 +361 ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:perf:aff
  367 +362 ppas:pl:nom.acc.voc:m2.m3.f.n1.n2.p2.p3:perf:neg
  368 +363 ppas:pl:nom.voc:m1.p1:imperf:aff
  369 +364 ppas:pl:nom.voc:m1.p1:imperf:neg
  370 +365 ppas:pl:nom.voc:m1.p1:imperf.perf:aff
  371 +366 ppas:pl:nom.voc:m1.p1:imperf.perf:neg
  372 +367 ppas:pl:nom.voc:m1.p1:perf:aff
  373 +368 ppas:pl:nom.voc:m1.p1:perf:neg
  374 +369 ppas:sg:acc.inst:f:imperf:aff
  375 +370 ppas:sg:acc.inst:f:imperf:neg
  376 +371 ppas:sg:acc.inst:f:imperf.perf:aff
  377 +372 ppas:sg:acc.inst:f:imperf.perf:neg
  378 +373 ppas:sg:acc.inst:f:perf:aff
  379 +374 ppas:sg:acc.inst:f:perf:neg
  380 +375 ppas:sg:acc:m1.m2:imperf:aff
  381 +376 ppas:sg:acc:m1.m2:imperf:neg
  382 +377 ppas:sg:acc:m1.m2:imperf.perf:aff
  383 +378 ppas:sg:acc:m1.m2:imperf.perf:neg
  384 +379 ppas:sg:acc:m1.m2:perf:aff
  385 +380 ppas:sg:acc:m1.m2:perf:neg
  386 +381 ppas:sg:acc:m3:imperf:aff
  387 +382 ppas:sg:acc:m3:imperf:neg
  388 +383 ppas:sg:acc:m3:imperf.perf:aff
  389 +384 ppas:sg:acc:m3:imperf.perf:neg
  390 +385 ppas:sg:acc:m3:perf:aff
  391 +386 ppas:sg:acc:m3:perf:neg
  392 +387 ppas:sg:dat:m1.m2.m3.n1.n2:imperf:aff
  393 +388 ppas:sg:dat:m1.m2.m3.n1.n2:imperf:neg
  394 +389 ppas:sg:dat:m1.m2.m3.n1.n2:imperf.perf:aff
  395 +390 ppas:sg:dat:m1.m2.m3.n1.n2:imperf.perf:neg
  396 +391 ppas:sg:dat:m1.m2.m3.n1.n2:perf:aff
  397 +392 ppas:sg:dat:m1.m2.m3.n1.n2:perf:neg
  398 +393 ppas:sg:gen.dat.loc:f:imperf:aff
  399 +394 ppas:sg:gen.dat.loc:f:imperf:neg
  400 +395 ppas:sg:gen.dat.loc:f:imperf.perf:aff
  401 +396 ppas:sg:gen.dat.loc:f:imperf.perf:neg
  402 +397 ppas:sg:gen.dat.loc:f:perf:aff
  403 +398 ppas:sg:gen.dat.loc:f:perf:neg
  404 +399 ppas:sg:gen:m1.m2.m3.n1.n2:imperf:aff
  405 +400 ppas:sg:gen:m1.m2.m3.n1.n2:imperf:neg
  406 +401 ppas:sg:gen:m1.m2.m3.n1.n2:imperf.perf:aff
  407 +402 ppas:sg:gen:m1.m2.m3.n1.n2:imperf.perf:neg
  408 +403 ppas:sg:gen:m1.m2.m3.n1.n2:perf:aff
  409 +404 ppas:sg:gen:m1.m2.m3.n1.n2:perf:neg
  410 +405 ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf:aff
  411 +406 ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf:neg
  412 +407 ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:aff
  413 +408 ppas:sg:inst.loc:m1.m2.m3.n1.n2:imperf.perf:neg
  414 +409 ppas:sg:inst.loc:m1.m2.m3.n1.n2:perf:aff
  415 +410 ppas:sg:inst.loc:m1.m2.m3.n1.n2:perf:neg
  416 +411 ppas:sg:nom.acc.voc:n1.n2:imperf:aff
  417 +412 ppas:sg:nom.acc.voc:n1.n2:imperf:neg
  418 +413 ppas:sg:nom.acc.voc:n1.n2:imperf.perf:aff
  419 +414 ppas:sg:nom.acc.voc:n1.n2:imperf.perf:neg
  420 +415 ppas:sg:nom.acc.voc:n1.n2:perf:aff
  421 +416 ppas:sg:nom.acc.voc:n1.n2:perf:neg
  422 +417 ppas:sg:nom.voc:f:imperf:aff
  423 +418 ppas:sg:nom.voc:f:imperf:neg
  424 +419 ppas:sg:nom.voc:f:imperf.perf:aff
  425 +420 ppas:sg:nom.voc:f:imperf.perf:neg
  426 +421 ppas:sg:nom.voc:f:perf:aff
  427 +422 ppas:sg:nom.voc:f:perf:neg
  428 +423 ppas:sg:nom.voc:m1.m2.m3:imperf:aff
  429 +424 ppas:sg:nom.voc:m1.m2.m3:imperf:neg
  430 +425 ppas:sg:nom.voc:m1.m2.m3:imperf.perf:aff
  431 +426 ppas:sg:nom.voc:m1.m2.m3:imperf.perf:neg
  432 +427 ppas:sg:nom.voc:m1.m2.m3:perf:aff
  433 +428 ppas:sg:nom.voc:m1.m2.m3:perf:neg
  434 +429 ppron12:pl:acc:_:pri
  435 +430 ppron12:pl:acc:_:sec
  436 +431 ppron12:pl:dat:_:pri
  437 +432 ppron12:pl:dat:_:sec
  438 +433 ppron12:pl:gen:_:pri
  439 +434 ppron12:pl:gen:_:sec
  440 +435 ppron12:pl:inst:_:pri
  441 +436 ppron12:pl:inst:_:sec
  442 +437 ppron12:pl:loc:_:pri
  443 +438 ppron12:pl:loc:_:sec
  444 +439 ppron12:pl:nom:_:pri
  445 +440 ppron12:pl:nom:_:sec
  446 +441 ppron12:pl:voc:_:pri
  447 +442 ppron12:pl:voc:_:sec
  448 +443 ppron12:sg:acc:m1.m2.m3.f.n1.n2:pri:akc
  449 +444 ppron12:sg:acc:m1.m2.m3.f.n1.n2:pri:nakc
  450 +445 ppron12:sg:acc:m1.m2.m3.f.n1.n2:sec:akc
  451 +446 ppron12:sg:acc:m1.m2.m3.f.n1.n2:sec:nakc
  452 +447 ppron12:sg:dat:m1.m2.m3.f.n1.n2:pri:akc
  453 +448 ppron12:sg:dat:m1.m2.m3.f.n1.n2:pri:nakc
  454 +449 ppron12:sg:dat:m1.m2.m3.f.n1.n2:sec:akc
  455 +450 ppron12:sg:dat:m1.m2.m3.f.n1.n2:sec:nakc
  456 +451 ppron12:sg:gen:m1.m2.m3.f.n1.n2:pri:akc
  457 +452 ppron12:sg:gen:m1.m2.m3.f.n1.n2:pri:nakc
  458 +453 ppron12:sg:gen:m1.m2.m3.f.n1.n2:sec:akc
  459 +454 ppron12:sg:gen:m1.m2.m3.f.n1.n2:sec:nakc
  460 +455 ppron12:sg:inst:m1.m2.m3.f.n1.n2:pri
  461 +456 ppron12:sg:inst:m1.m2.m3.f.n1.n2:sec
  462 +457 ppron12:sg:loc:m1.m2.m3.f.n1.n2:pri
  463 +458 ppron12:sg:loc:m1.m2.m3.f.n1.n2:sec
  464 +459 ppron12:sg:nom:m1.m2.m3.f.n1.n2:pri
  465 +460 ppron12:sg:nom:m1.m2.m3.f.n1.n2:sec
  466 +461 ppron12:sg:voc:m1.m2.m3.f.n1.n2:sec
  467 +462 ppron3:pl:acc:m1.p1:ter:_:npraep
  468 +463 ppron3:pl:acc:m1.p1:ter:_:praep
  469 +464 ppron3:pl:acc:m2.m3.f.n1.n2.p2.p3:ter:_:npraep
  470 +465 ppron3:pl:acc:m2.m3.f.n1.n2.p2.p3:ter:_:praep
  471 +466 ppron3:pl:dat:_:ter:_:npraep
  472 +467 ppron3:pl:dat:_:ter:_:praep
  473 +468 ppron3:pl:gen:_:ter:_:npraep
  474 +469 ppron3:pl:gen:_:ter:_:praep
  475 +470 ppron3:pl:inst:_:ter:_:_
  476 +471 ppron3:pl:loc:_:ter:_:_
  477 +472 ppron3:pl:nom:m1.p1:ter:_:_
  478 +473 ppron3:pl:nom:m2.m3.f.n1.n2.p2.p3:ter:_:_
  479 +474 ppron3:sg:acc:f:ter:_:npraep
  480 +475 ppron3:sg:acc:f:ter:_:praep
  481 +476 ppron3:sg:acc:m1.m2.m3:ter:akc:npraep
  482 +477 ppron3:sg:acc:m1.m2.m3:ter:akc:praep
  483 +478 ppron3:sg:acc:m1.m2.m3:ter:nakc:npraep
  484 +479 ppron3:sg:acc:m1.m2.m3:ter:nakc:praep
  485 +480 ppron3:sg:acc:n1.n2:ter:_:npraep
  486 +481 ppron3:sg:acc:n1.n2:ter:_:praep
  487 +482 ppron3:sg:dat:f:ter:_:npraep
  488 +483 ppron3:sg:dat:f:ter:_:praep
  489 +484 ppron3:sg:dat:m1.m2.m3:ter:akc:npraep
  490 +485 ppron3:sg:dat:m1.m2.m3:ter:nakc:npraep
  491 +486 ppron3:sg:dat:m1.m2.m3:ter:_:praep
  492 +487 ppron3:sg:dat:n1.n2:ter:akc:npraep
  493 +488 ppron3:sg:dat:n1.n2:ter:nakc:npraep
  494 +489 ppron3:sg:dat:n1.n2:ter:_:praep
  495 +490 ppron3:sg:gen.acc:m1.m2.m3:ter:nakc:praep
  496 +491 ppron3:sg:gen:f:ter:_:npraep
  497 +492 ppron3:sg:gen:f:ter:_:praep
  498 +493 ppron3:sg:gen:m1.m2.m3:ter:akc:npraep
  499 +494 ppron3:sg:gen:m1.m2.m3:ter:akc:praep
  500 +495 ppron3:sg:gen:m1.m2.m3:ter:nakc:npraep
  501 +496 ppron3:sg:gen:m1.m2.m3:ter:nakc:praep
  502 +497 ppron3:sg:gen:n1.n2:ter:akc:npraep
  503 +498 ppron3:sg:gen:n1.n2:ter:nakc:npraep
  504 +499 ppron3:sg:gen:n1.n2:ter:_:praep
  505 +500 ppron3:sg:inst:f:ter:_:praep
  506 +501 ppron3:sg:inst:m1.m2.m3:ter:_:_
  507 +502 ppron3:sg:inst:n1.n2:ter:_:_
  508 +503 ppron3:sg:loc:f:ter:_:_
  509 +504 ppron3:sg:loc:m1.m2.m3:ter:_:_
  510 +505 ppron3:sg:loc:n1.n2:ter:_:_
  511 +506 ppron3:sg:nom:f:ter:_:_
  512 +507 ppron3:sg:nom:m1.m2.m3:ter:_:_
  513 +508 ppron3:sg:nom:n1.n2:ter:_:_
  514 +509 praet:pl:m1.p1:imperf
  515 +510 praet:pl:m1.p1:imperf.perf
  516 +511 praet:pl:m1.p1:perf
  517 +512 praet:pl:m1.p1:pri:imperf
  518 +513 praet:pl:m1.p1:pri:imperf.perf
  519 +514 praet:pl:m1.p1:pri:perf
  520 +515 praet:pl:m1.p1:sec:imperf
  521 +516 praet:pl:m1.p1:sec:imperf.perf
  522 +517 praet:pl:m1.p1:sec:perf
  523 +518 praet:pl:m1.p1:ter:imperf
  524 +519 praet:pl:m1.p1:ter:imperf.perf
  525 +520 praet:pl:m1.p1:ter:perf
  526 +521 praet:pl:m2.m3.f.n1.n2.p2.p3:imperf
  527 +522 praet:pl:m2.m3.f.n1.n2.p2.p3:imperf.perf
  528 +523 praet:pl:m2.m3.f.n1.n2.p2.p3:perf
  529 +524 praet:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf
  530 +525 praet:pl:m2.m3.f.n1.n2.p2.p3:pri:imperf.perf
  531 +526 praet:pl:m2.m3.f.n1.n2.p2.p3:pri:perf
  532 +527 praet:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
  533 +528 praet:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf.perf
  534 +529 praet:pl:m2.m3.f.n1.n2.p2.p3:sec:perf
  535 +530 praet:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
  536 +531 praet:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf.perf
  537 +532 praet:pl:m2.m3.f.n1.n2.p2.p3:ter:perf
  538 +533 praet:sg:f:imperf
  539 +534 praet:sg:f:imperf.perf
  540 +535 praet:sg:f:perf
  541 +536 praet:sg:f:pri:imperf
  542 +537 praet:sg:f:pri:imperf.perf
  543 +538 praet:sg:f:pri:perf
  544 +539 praet:sg:f:sec:imperf
  545 +540 praet:sg:f:sec:imperf.perf
  546 +541 praet:sg:f:sec:perf
  547 +542 praet:sg:f:ter:imperf
  548 +543 praet:sg:f:ter:imperf.perf
  549 +544 praet:sg:f:ter:perf
  550 +545 praet:sg:m1.m2.m3:imperf
  551 +546 praet:sg:m1.m2.m3:imperf:agl
  552 +547 praet:sg:m1.m2.m3:imperf:nagl
  553 +548 praet:sg:m1.m2.m3:imperf.perf
  554 +549 praet:sg:m1.m2.m3:perf
  555 +550 praet:sg:m1.m2.m3:perf:agl
  556 +551 praet:sg:m1.m2.m3:perf:nagl
  557 +552 praet:sg:m1.m2.m3:pri:imperf
  558 +553 praet:sg:m1.m2.m3:pri:imperf.perf
  559 +554 praet:sg:m1.m2.m3:pri:perf
  560 +555 praet:sg:m1.m2.m3:sec:imperf
  561 +556 praet:sg:m1.m2.m3:sec:imperf.perf
  562 +557 praet:sg:m1.m2.m3:sec:perf
  563 +558 praet:sg:m1.m2.m3:ter:imperf
  564 +559 praet:sg:m1.m2.m3:ter:imperf.perf
  565 +560 praet:sg:m1.m2.m3:ter:perf
  566 +561 praet:sg:n1.n2:imperf
  567 +562 praet:sg:n1.n2:imperf.perf
  568 +563 praet:sg:n1.n2:perf
  569 +564 praet:sg:n1.n2:pri:imperf
  570 +565 praet:sg:n1.n2:pri:imperf.perf
  571 +566 praet:sg:n1.n2:pri:perf
  572 +567 praet:sg:n1.n2:sec:imperf
  573 +568 praet:sg:n1.n2:sec:imperf.perf
  574 +569 praet:sg:n1.n2:sec:perf
  575 +570 praet:sg:n1.n2:ter:imperf
  576 +571 praet:sg:n1.n2:ter:imperf.perf
  577 +572 praet:sg:n1.n2:ter:perf
  578 +573 pred
  579 +574 prefa
  580 +575 prefppas
  581 +576 prefs
  582 +577 prefv
  583 +578 prep:acc
  584 +579 prep:acc:nwok
  585 +580 prep:acc:wok
  586 +581 prep:dat
  587 +582 prep:gen
  588 +583 prep:gen:nwok
  589 +584 prep:gen:wok
  590 +585 prep:inst
  591 +586 prep:inst:nwok
  592 +587 prep:inst:wok
  593 +588 prep:loc
  594 +589 prep:loc:nwok
  595 +590 prep:loc:wok
  596 +591 prep:nom
  597 +592 qub
  598 +593 romandig
  599 +594 siebie:acc
  600 +595 siebie:dat
  601 +596 siebie:gen
  602 +597 siebie:inst
  603 +598 siebie:loc
  604 +599 substa
  605 +600 subst:pl:acc:f
  606 +601 subst:pl:acc:m1
  607 +602 subst:pl:acc:m2
  608 +603 subst:pl:acc:m3
  609 +604 subst:pl:acc:n1
  610 +605 subst:pl:acc:n2
  611 +606 subst:pl:acc:p1
  612 +607 subst:pl:acc:p2
  613 +608 subst:pl:acc:p3
  614 +609 subst:pl:dat:f
  615 +610 subst:pl:dat:m1
  616 +611 subst:pl:dat:m2
  617 +612 subst:pl:dat:m3
  618 +613 subst:pl:dat:n1
  619 +614 subst:pl:dat:n2
  620 +615 subst:pl:dat:p1
  621 +616 subst:pl:dat:p2
  622 +617 subst:pl:dat:p3
  623 +618 subst:pl:gen:f
  624 +619 subst:pl:gen:m1
  625 +620 subst:pl:gen:m2
  626 +621 subst:pl:gen:m3
  627 +622 subst:pl:gen:n1
  628 +623 subst:pl:gen:n2
  629 +624 subst:pl:gen:p1
  630 +625 subst:pl:gen:p2
  631 +626 subst:pl:gen:p3
  632 +627 subst:pl:inst:f
  633 +628 subst:pl:inst:m1
  634 +629 subst:pl:inst:m2
  635 +630 subst:pl:inst:m3
  636 +631 subst:pl:inst:n1
  637 +632 subst:pl:inst:n2
  638 +633 subst:pl:inst:p1
  639 +634 subst:pl:inst:p2
  640 +635 subst:pl:inst:p3
  641 +636 subst:pl:loc:f
  642 +637 subst:pl:loc:m1
  643 +638 subst:pl:loc:m2
  644 +639 subst:pl:loc:m3
  645 +640 subst:pl:loc:n1
  646 +641 subst:pl:loc:n2
  647 +642 subst:pl:loc:p1
  648 +643 subst:pl:loc:p2
  649 +644 subst:pl:loc:p3
  650 +645 subst:pl:nom:f
  651 +646 subst:pl:nom:m1
  652 +647 subst:pl:nom:m2
  653 +648 subst:pl:nom:m3
  654 +649 subst:pl:nom:n1
  655 +650 subst:pl:nom:n2
  656 +651 subst:pl:nom:p1
  657 +652 subst:pl:nom:p2
  658 +653 subst:pl:nom:p3
  659 +654 subst:pl:voc:f
  660 +655 subst:pl:voc:m1
  661 +656 subst:pl:voc:m2
  662 +657 subst:pl:voc:m3
  663 +658 subst:pl:voc:n1
  664 +659 subst:pl:voc:n2
  665 +660 subst:pl:voc:p1
  666 +661 subst:pl:voc:p2
  667 +662 subst:pl:voc:p3
  668 +663 subst:sg:acc:f
  669 +664 subst:sg:acc:m1
  670 +665 subst:sg:acc:m2
  671 +666 subst:sg:acc:m3
  672 +667 subst:sg:acc:n1
  673 +668 subst:sg:acc:n2
  674 +669 subst:sg:dat:f
  675 +670 subst:sg:dat:m1
  676 +671 subst:sg:dat:m2
  677 +672 subst:sg:dat:m3
  678 +673 subst:sg:dat:n1
  679 +674 subst:sg:dat:n2
  680 +675 subst:sg:gen:f
  681 +676 subst:sg:gen:m1
  682 +677 subst:sg:gen:m2
  683 +678 subst:sg:gen:m3
  684 +679 subst:sg:gen:n1
  685 +680 subst:sg:gen:n2
  686 +681 subst:sg:inst:f
  687 +682 subst:sg:inst:m1
  688 +683 subst:sg:inst:m2
  689 +684 subst:sg:inst:m3
  690 +685 subst:sg:inst:n1
  691 +686 subst:sg:inst:n2
  692 +687 subst:sg:loc:f
  693 +688 subst:sg:loc:m1
  694 +689 subst:sg:loc:m2
  695 +690 subst:sg:loc:m3
  696 +691 subst:sg:loc:n1
  697 +692 subst:sg:loc:n2
  698 +693 subst:sg:nom:f
  699 +694 subst:sg:nom:m1
  700 +695 subst:sg:nom:m2
  701 +696 subst:sg:nom:m3
  702 +697 subst:sg:nom:n1
  703 +698 subst:sg:nom:n2
  704 +699 subst:sg:voc:f
  705 +700 subst:sg:voc:m1
  706 +701 subst:sg:voc:m2
  707 +702 subst:sg:voc:m3
  708 +703 subst:sg:voc:n1
  709 +704 subst:sg:voc:n2
  710 +705 winien:pl:m1.p1:imperf
  711 +706 winien:pl:m1.p1:pri:imperf
  712 +707 winien:pl:m1.p1:sec:imperf
  713 +708 winien:pl:m1.p1:ter:imperf
  714 +709 winien:pl:m2.m3.f.n1.n2.p2.p3:imperf
  715 +710 winien:pl:m2.m3.f.n1.n2.p2.p3:sec:imperf
  716 +711 winien:pl:m2.m3.f.n1.n2.p2.p3:ter:imperf
  717 +712 winien:sg:f:imperf
  718 +713 winien:sg:f:pri:imperf
  719 +714 winien:sg:f:sec:imperf
  720 +715 winien:sg:f:ter:imperf
  721 +716 winien:sg:m1.m2.m3:imperf
  722 +717 winien:sg:m1.m2.m3:pri:imperf
  723 +718 winien:sg:m1.m2.m3:sec:imperf
  724 +719 winien:sg:m1.m2.m3:ter:imperf
  725 +720 winien:sg:n1.n2:imperf
  726 +721 winien:sg:n1.n2:pri:imperf
  727 +722 winien:sg:n1.n2:sec:imperf
  728 +723 winien:sg:n1.n2:ter:imperf
... ...