llt-form_builder 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +8 -0
  9. data/lib/llt/form/adjective.rb +19 -0
  10. data/lib/llt/form/adverb.rb +13 -0
  11. data/lib/llt/form/cardinal.rb +31 -0
  12. data/lib/llt/form/conjunction.rb +7 -0
  13. data/lib/llt/form/declinable.rb +23 -0
  14. data/lib/llt/form/demonstrative_pronoun.rb +7 -0
  15. data/lib/llt/form/ethnic.rb +6 -0
  16. data/lib/llt/form/fp.rb +6 -0
  17. data/lib/llt/form/gerund.rb +9 -0
  18. data/lib/llt/form/gerundive.rb +12 -0
  19. data/lib/llt/form/indefinite_pronoun.rb +7 -0
  20. data/lib/llt/form/infinitive.rb +13 -0
  21. data/lib/llt/form/interrogative_pronoun.rb +7 -0
  22. data/lib/llt/form/noun.rb +17 -0
  23. data/lib/llt/form/participle.rb +9 -0
  24. data/lib/llt/form/personal_pronoun.rb +13 -0
  25. data/lib/llt/form/ppa.rb +6 -0
  26. data/lib/llt/form/ppp.rb +6 -0
  27. data/lib/llt/form/preposition.rb +32 -0
  28. data/lib/llt/form/pronoun.rb +17 -0
  29. data/lib/llt/form/relative_pronoun.rb +7 -0
  30. data/lib/llt/form/subjunction.rb +7 -0
  31. data/lib/llt/form/supinum.rb +6 -0
  32. data/lib/llt/form/uninflectable.rb +22 -0
  33. data/lib/llt/form/verb.rb +28 -0
  34. data/lib/llt/form/verbal_noun.rb +18 -0
  35. data/lib/llt/form.rb +80 -0
  36. data/lib/llt/form_builder/adjective_builder.rb +86 -0
  37. data/lib/llt/form_builder/adverb_builder.rb +25 -0
  38. data/lib/llt/form_builder/declinable_builder.rb +164 -0
  39. data/lib/llt/form_builder/ethnic_builder.rb +17 -0
  40. data/lib/llt/form_builder/fp_builder.rb +13 -0
  41. data/lib/llt/form_builder/gerund_builder.rb +37 -0
  42. data/lib/llt/form_builder/gerundive_builder.rb +24 -0
  43. data/lib/llt/form_builder/helpers/adjective_like_building.rb +29 -0
  44. data/lib/llt/form_builder/helpers/pronoun_segments.rb +226 -0
  45. data/lib/llt/form_builder/helpers/stem_hash_parser.rb +263 -0
  46. data/lib/llt/form_builder/helpers/verb_segments.rb +562 -0
  47. data/lib/llt/form_builder/infinitivum_builder.rb +19 -0
  48. data/lib/llt/form_builder/irregular_gerund_builder.rb +7 -0
  49. data/lib/llt/form_builder/irregular_gerundive_builder.rb +7 -0
  50. data/lib/llt/form_builder/irregular_ppa_builder.rb +7 -0
  51. data/lib/llt/form_builder/irregular_praesens_builder.rb +5 -0
  52. data/lib/llt/form_builder/irregular_praesens_infinitivum_builder.rb +5 -0
  53. data/lib/llt/form_builder/noun_builder.rb +24 -0
  54. data/lib/llt/form_builder/perfectum_builder.rb +14 -0
  55. data/lib/llt/form_builder/perfectum_infinitivum_builder.rb +7 -0
  56. data/lib/llt/form_builder/personal_pronoun_builder.rb +107 -0
  57. data/lib/llt/form_builder/ppa_builder.rb +20 -0
  58. data/lib/llt/form_builder/ppp_builder.rb +10 -0
  59. data/lib/llt/form_builder/praesens_builder.rb +41 -0
  60. data/lib/llt/form_builder/praesens_infinitivum_builder.rb +9 -0
  61. data/lib/llt/form_builder/pronoun_builder.rb +106 -0
  62. data/lib/llt/form_builder/supinum_builder.rb +23 -0
  63. data/lib/llt/form_builder/verb_builder.rb +37 -0
  64. data/lib/llt/form_builder/version.rb +5 -0
  65. data/lib/llt/form_builder.rb +370 -0
  66. data/lib/llt/stem/adjective_pack.rb +122 -0
  67. data/lib/llt/stem/adjective_stem.rb +23 -0
  68. data/lib/llt/stem/ethnic_stem.rb +9 -0
  69. data/lib/llt/stem/noun_pack.rb +14 -0
  70. data/lib/llt/stem/noun_stem.rb +26 -0
  71. data/lib/llt/stem/pack.rb +46 -0
  72. data/lib/llt/stem/verb_pack.rb +53 -0
  73. data/lib/llt/stem/verb_stem.rb +18 -0
  74. data/lib/llt/stem.rb +145 -0
  75. data/lib/llt/stem_builder.rb +53 -0
  76. data/llt-form_builder.gemspec +30 -0
  77. data/spec/lib/llt/form/adjective_spec.rb +10 -0
  78. data/spec/lib/llt/form/adverb_spec.rb +17 -0
  79. data/spec/lib/llt/form/conjunction_spec.rb +23 -0
  80. data/spec/lib/llt/form/demonstrative_pronoun_spec.rb +14 -0
  81. data/spec/lib/llt/form/fp_spec.rb +12 -0
  82. data/spec/lib/llt/form/functions_spec.rb +13 -0
  83. data/spec/lib/llt/form/gerund_spec.rb +10 -0
  84. data/spec/lib/llt/form/gerundive_spec.rb +13 -0
  85. data/spec/lib/llt/form/noun_spec.rb +18 -0
  86. data/spec/lib/llt/form/ppa_spec.rb +12 -0
  87. data/spec/lib/llt/form/ppp_spec.rb +12 -0
  88. data/spec/lib/llt/form/preposition_spec.rb +43 -0
  89. data/spec/lib/llt/form/supinum_spec.rb +9 -0
  90. data/spec/lib/llt/form/verb_spec.rb +14 -0
  91. data/spec/lib/llt/form_builder/adjective_builder_spec.rb +182 -0
  92. data/spec/lib/llt/form_builder/adverb_builder_spec.rb +27 -0
  93. data/spec/lib/llt/form_builder/ethnic_builder_spec.rb +17 -0
  94. data/spec/lib/llt/form_builder/form_builder_spec.rb +16 -0
  95. data/spec/lib/llt/form_builder/fp_builder_spec.rb +42 -0
  96. data/spec/lib/llt/form_builder/gerund_builder_spec.rb +80 -0
  97. data/spec/lib/llt/form_builder/gerundive_builder_spec.rb +102 -0
  98. data/spec/lib/llt/form_builder/helpers/stem_hash_parser_spec.rb +197 -0
  99. data/spec/lib/llt/form_builder/irregular_gerund_builder_spec.rb +22 -0
  100. data/spec/lib/llt/form_builder/irregular_gerundive_builder_spec.rb +21 -0
  101. data/spec/lib/llt/form_builder/irregular_praesens_builder_spec.rb +14 -0
  102. data/spec/lib/llt/form_builder/irregular_praesens_infinitivum_builder_spec.rb +32 -0
  103. data/spec/lib/llt/form_builder/noun_builder_spec.rb +245 -0
  104. data/spec/lib/llt/form_builder/personal_pronoun_builder_spec.rb +49 -0
  105. data/spec/lib/llt/form_builder/ppa_builder_spec.rb +137 -0
  106. data/spec/lib/llt/form_builder/ppp_builder_spec.rb +45 -0
  107. data/spec/lib/llt/form_builder/pronoun_builder_spec.rb +203 -0
  108. data/spec/lib/llt/form_builder/supinum_builder_spec.rb +24 -0
  109. data/spec/lib/llt/form_builder/verb_builder_spec.rb +557 -0
  110. data/spec/lib/llt/form_spec.rb +27 -0
  111. data/spec/lib/llt/stem/adjective_pack_spec.rb +78 -0
  112. data/spec/lib/llt/stem/adjective_stem_spec.rb +15 -0
  113. data/spec/lib/llt/stem/noun_pack_spec.rb +20 -0
  114. data/spec/lib/llt/stem/noun_stem_spec.rb +14 -0
  115. data/spec/lib/llt/stem/verb_pack_spec.rb +56 -0
  116. data/spec/lib/llt/stem_builder_spec.rb +20 -0
  117. data/spec/spec_helper.rb +21 -0
  118. metadata +330 -0
@@ -0,0 +1,25 @@
1
+ module LLT
2
+ class AdverbBuilder < AdjectiveBuilder
3
+ endings_defined_through :inflection_class, :stem, :comparatio
4
+ validate :ending, :comparison_sign
5
+
6
+ def initialize(stem)
7
+ extract_normalized_args!(stem)
8
+ @options = stem[:options] || {}
9
+ @validate = @options.any?
10
+ downcase_all_stems
11
+ end
12
+
13
+ def compute
14
+ # endings is not an array in this case, just a plain string
15
+ new_form(ending: endings)
16
+ end
17
+
18
+ def comparativus_extraction(stem, args)
19
+ stem.match(/(#{marker(:IUS)})$/)
20
+ new_stem = stem.chomp($1) # do not use chomp! as other forms will get severed
21
+ raise "No comparison sign for comparative present" if new_stem == stem
22
+ [new_stem, $1]
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,164 @@
1
+ module LLT
2
+ class DeclinableBuilder < FormBuilder
3
+ attr_reader :sexus, :comparatio
4
+
5
+ def initialize(stem)
6
+ super
7
+ @irregular_forms = extended_special_forms(irregulars_with_nominative(stem))
8
+ @additional_forms = extended_special_forms(stem[:additional_forms])
9
+ end
10
+
11
+ def compute
12
+ with_replacements(regular_forms) + additional_forms
13
+ end
14
+
15
+ def indices
16
+ { casus: [0, 1, 2, 3, 4, 5],
17
+ numerus: [0, 6],
18
+ sexus: [0, 12, 24] }
19
+ end
20
+
21
+ def index_of_ending(casus, numerus, sexus = nil)
22
+ casus + (numerus == 1 ? -1 : 5)
23
+ end
24
+ alias :ioe :index_of_ending
25
+
26
+ def casus_numerus_sexus_by_index(index, sexus = @sexus)
27
+ # superflous method - could be solved through
28
+ # attributes_by_index, however this is noticably faster and thus stays
29
+
30
+ if index < 6
31
+ [index + 1, 1, sexus]
32
+ else
33
+ [index - 5, 2, sexus]
34
+ end
35
+ end
36
+
37
+ def regular_forms
38
+ endings.each_with_index.map do |ending, i|
39
+ next unless @lookup_indices.include?(i)
40
+ new_form_through_index(ending, i)
41
+ end.compact # compact because of next steps
42
+ end
43
+
44
+ def new_form_through_index(ending, i)
45
+ casus, numerus, sexus = casus_numerus_sexus_by_index(i)
46
+ ending = ending.to_s
47
+ new_form(ending: ending, casus: casus, numerus: numerus, sexus: sexus, index: i)
48
+ end
49
+
50
+ def extended_special_forms(specials)
51
+ specials = specials || []
52
+ specials + specials.each_with_object([]) do |(string, *attr), arr|
53
+ new_attributes(*attr).each { |new_attr| arr << [string, *new_attr] }
54
+ end
55
+ end
56
+
57
+ def irregulars_with_nominative(stem)
58
+ i = if @nom
59
+ irreg = nominatives
60
+ if irregs = stem[:irregular_forms]
61
+ irregs + irreg
62
+ else
63
+ irreg
64
+ end
65
+ else
66
+ stem[:irregular_forms] || []
67
+ end
68
+
69
+ i + proper_vocative
70
+ end
71
+
72
+ def new_attributes(*attrs)
73
+ casus, numerus, sexus = *attrs
74
+ sexus = sexus || @sexus
75
+ new_attrs = []
76
+
77
+ if ioe(casus, numerus) == 0
78
+ new_attrs << [5, 1, sexus] unless regular_o_declension? || pronominal_declension?
79
+ if sexus == :n
80
+ new_attrs << [4, 1, sexus]
81
+ end
82
+ end
83
+
84
+ new_attrs
85
+ end
86
+
87
+ def proper_vocative
88
+ o_declension_on_ius? ? [[@stem, 5, 1]] : []
89
+ end
90
+
91
+ def regular_o_declension?
92
+ @inflection_class == 2 && @nom.to_s =~ /us$/ # to_s because it might be nil
93
+ end
94
+
95
+ def pronominal_declension?
96
+ end
97
+
98
+ def o_declension_on_ius?
99
+ @inflection_class == 2 && @stem.end_with?("i") && @sexus == :m # is there a neutrum like that?
100
+ end
101
+
102
+ def additional_forms
103
+ @additional_forms.map do |string, *attrs|
104
+ casus, numerus, sexus = *attrs
105
+ i = ioe(casus, numerus, sexus)
106
+ if @lookup_indices.include?(i)
107
+ new_special_form(string: string, casus: casus, numerus: numerus, sexus: sexus, index: i)
108
+ end
109
+ end.compact
110
+ end
111
+
112
+ def with_replacements(regular_forms)
113
+ @irregular_forms.each do |string, *attrs|
114
+ casus, numerus, sexus = *attrs
115
+ i = ioe(casus, numerus, sexus)
116
+ if @lookup_indices.include?(i)
117
+ next unless ri = regular_forms.find_index { |f| f.index == i }
118
+ regular_forms[ri] = new_special_form(string: string, casus: casus, numerus: numerus, sexus: sexus, index: i)
119
+ end
120
+ end
121
+ regular_forms
122
+ end
123
+
124
+ def new_special_form(args)
125
+ args = args.merge(default_args)
126
+ string = args[:string]
127
+ i = index_of_ending(args[:casus], args[:numerus], args[:sexus])
128
+ ending = special_ending(string, i).to_s
129
+ form_class.new(args.merge(stem: string.chomp(ending), ending: ending))
130
+ end
131
+
132
+ def special_ending(word, index)
133
+ endings_path.constants.each do |const|
134
+ ending = endings_path.const_get(const)[index]
135
+ return ending if word.end_with?(ending.to_s)
136
+ end
137
+ nil
138
+ end
139
+
140
+ def er_nominative_possible?
141
+ # only Noun and Adjective override this, as they can have a nominative on er.
142
+ # other Declinables like Gerundives don't need this
143
+ false
144
+ end
145
+
146
+ # this is a slight hack to handle O Declension on er.
147
+ # the Endings constants for noun has US at its first position,
148
+ # this guarantees a match even when the ending is empty (which means that the passsed along
149
+ # nominative value shall be used.
150
+ # similar conditions will need to be written for A decl on as.
151
+ def endings_lookup(ending, x)
152
+ if ending.empty?
153
+ if er_nominative_possible?
154
+ # not sure if this needs further safeties - asking explicitly for er?
155
+ # well it does! 2013-10-08 - fili!
156
+ return x.to_s =~ /^(us|e)$/
157
+ elsif o_declension_on_ius?
158
+ return x.to_s =~ /^e$/
159
+ end
160
+ end
161
+ super
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,17 @@
1
+ module LLT
2
+ class EthnicBuilder < DeclinableBuilder
3
+ builds_like_an :adjective
4
+ uses_endings_of :adjective
5
+
6
+ endings_defined_through :inflection_class, :number_of_endings
7
+
8
+ def initialize(stem)
9
+ @number_of_endings = (stem[:inflection_class] == 1 ? 3 : 2)
10
+ super
11
+ end
12
+
13
+ def stays_capitalized
14
+ true
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module LLT
2
+ class FpBuilder < DeclinableBuilder
3
+ builds_like_an :adjective
4
+ builds_with :tempus, :modus, :genus, :extension
5
+
6
+ validate :extension
7
+
8
+ has_modus t.participium
9
+ has_genus t.activum
10
+ has_tempus t.futurum
11
+ has_extension "ur"
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ module LLT
2
+ class GerundBuilder < DeclinableBuilder
3
+ builds_with :modus, :extension, :prefix
4
+
5
+ has_extension "nd"
6
+ has_modus t.gerundium
7
+
8
+ look_up :thematic
9
+
10
+ validate :extension
11
+
12
+ def indices
13
+ { casus: [nil, 0, 1, 2, nil, 3],
14
+ numerus: [0],
15
+ sexus: [0] }
16
+ end
17
+
18
+ def index_of_ending(casus, numerus, sexus = nil)
19
+ case casus
20
+ when 2 then 0
21
+ when 3 then 1
22
+ when 4 then 2
23
+ when 6 then 3
24
+ end
25
+ end
26
+ alias :ioe :index_of_ending
27
+
28
+ def casus_numerus_sexus_by_index(index, sexus = nil)
29
+ case index
30
+ when 0 then [2, 1, :n]
31
+ when 1 then [3, 1, :n]
32
+ when 2 then [4, 1, :n]
33
+ when 3 then [6, 1, :n]
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,24 @@
1
+ module LLT
2
+ class GerundiveBuilder < DeclinableBuilder
3
+ builds_like_an :adjective
4
+ builds_with :modus, :extension, :prefix
5
+
6
+ has_extension "nd"
7
+ has_modus t.gerundivum
8
+
9
+ look_up :thematic
10
+
11
+ validate :extension
12
+
13
+ # Allows archaic forms like audiundi
14
+ def validation_rule(args, validator)
15
+ if args[:inflection_class] == 4 && validator == :thematic
16
+ if args[validator] == "e" && @options[validator] =~ /^[eu]$/
17
+ keep_given_value(args, validator, :archaic)
18
+ end
19
+ else
20
+ super
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ module LLT
2
+ class FormBuilder
3
+ module AdjectiveLikeBuilding
4
+ def casus_numerus_sexus_by_index(i, sexus = nil)
5
+ # superflous method - code be solved through attributes_by_index,
6
+ # however this is noticably faster and thus stays
7
+
8
+ mod, sexus = case i
9
+ when 0..11 then [ 0, :m]
10
+ when 12..23 then [12, :f]
11
+ else [24, :n]
12
+ end
13
+ i -= mod
14
+
15
+ super(i, sexus)
16
+ end
17
+
18
+ def index_of_ending(casus, numerus, sexus = nil)
19
+ i = super
20
+ case sexus
21
+ when :f then i + 12
22
+ when :n then i + 24
23
+ else i
24
+ end
25
+ end
26
+ alias :ioe :index_of_ending
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,226 @@
1
+ require 'llt/helpers'
2
+ require 'llt/constants/particles'
3
+
4
+ module LLT
5
+ class FormBuilder
6
+ class PronounSegments
7
+ extend Helpers::Constantize
8
+ include Helpers::Initialize
9
+
10
+ class << self
11
+ def get(request, args)
12
+ cl = constant_by_type(args[:inflection_class], prefix: "pronoun", namespace: self)
13
+ cl.new(args).send(request)
14
+ end
15
+
16
+ def particle(arg)
17
+ define_method(:particle) { arg }
18
+ end
19
+
20
+ def stem(arg)
21
+ define_method(:stem) { arg }
22
+ end
23
+
24
+ def prefixed_particle(arg)
25
+ define_method(:prefixed_particle) { arg }
26
+ end
27
+
28
+ def n(const)
29
+ LLT::Constants::Particles.const_get(const)
30
+ end
31
+ end
32
+
33
+ def initialize(args)
34
+ extract_args!(args)
35
+ end
36
+
37
+ def init_keys
38
+ %i{ casus numerus sexus }
39
+ end
40
+
41
+ def n(const)
42
+ self.class.n(const)
43
+ end
44
+
45
+ def particle
46
+ ""
47
+ end
48
+
49
+ def prefixed_particle
50
+ ""
51
+ end
52
+
53
+ class PronounHic < PronounSegments
54
+ def particle
55
+ if (@numerus == 1 && @casus != 2) || (@sexus == :n && @numerus == 2 && (@casus == 1 || @casus == 4))
56
+ n(:C)
57
+ else
58
+ ""
59
+ end
60
+ end
61
+
62
+ def stem
63
+ if @numerus == 1 && (@casus == 2 || @casus == 3)
64
+ "hu"
65
+ else
66
+ "h"
67
+ end
68
+ end
69
+ end
70
+
71
+ class PronounIlle < PronounSegments
72
+ stem "ill"
73
+ end
74
+
75
+ class PronounIpse < PronounSegments
76
+ stem "ips"
77
+ end
78
+
79
+ class PronounIste < PronounSegments
80
+ stem "ist"
81
+ end
82
+
83
+ class PronounIs < PronounSegments
84
+ def stem
85
+ if @numerus == 1 && ((@casus == 1 && (@sexus == :m || @sexus == :n)) || (@casus == 4 && @sexus == :n)) || @numerus == 2 && @casus == 1 && @sexus == :m
86
+ "i"
87
+ else
88
+ "e"
89
+ end
90
+ end
91
+ end
92
+
93
+ class PronounQui < PronounSegments
94
+ def stem
95
+ if cuius_and_cui
96
+ "cu"
97
+ else
98
+ "qu"
99
+ end
100
+ end
101
+
102
+ def cuius_and_cui
103
+ @numerus == 1 && (@casus == 2 || @casus == 3)
104
+ end
105
+ end
106
+
107
+ class PronounIs < PronounSegments
108
+ def stem
109
+ if @numerus == 1 && ((@casus == 1 && (@sexus == :m || @sexus == :n)) || (@casus == 4 && @sexus == :n)) || @numerus == 2 && @casus == 1 && @sexus == :m
110
+ "i"
111
+ else
112
+ "e"
113
+ end
114
+ end
115
+ end
116
+
117
+ class PronounIdem < PronounIs
118
+ particle n(:DEM)
119
+ end
120
+
121
+ class PronounQui < PronounSegments
122
+ def stem
123
+ if cuius_and_cui
124
+ "cu"
125
+ else
126
+ "qu"
127
+ end
128
+ end
129
+
130
+ def cuius_and_cui
131
+ @numerus == 1 && (@casus == 2 || @casus == 3)
132
+ end
133
+ end
134
+
135
+ PronounQuis = PronounQui
136
+
137
+ class PronounQuidam < PronounQui
138
+ particle n(:DAM)
139
+ end
140
+
141
+ class PronounQuicumque < PronounQui
142
+ particle n(:CUMQUE)
143
+ end
144
+
145
+ class PronounQuinam < PronounQui
146
+ particle n(:NAM)
147
+ end
148
+
149
+ class PronounQuispiam < PronounQui
150
+ particle n(:PIAM)
151
+ end
152
+
153
+ class PronounQuilibet < PronounQui
154
+ particle n(:LIBET)
155
+ end
156
+
157
+ class PronounQuivis < PronounQui
158
+ particle n(:VIS)
159
+ end
160
+
161
+ class PronounQuisqueS < PronounQui
162
+ particle n(:QUE)
163
+ end
164
+ PronounQuisque = PronounQuisqueS
165
+
166
+ class PronounQuisquam < PronounQui
167
+ particle n(:QUAM)
168
+ end
169
+
170
+ class PronounUnusquisque < PronounQui
171
+ particle n(:QUE)
172
+
173
+ def prefixed_particle
174
+ opts = { casus: @casus, numerus: @numerus, sexus: @sexus, validate: true }
175
+ args = { type: :adjective, stem: "un", inflection_class: 5,
176
+ noe: 3, comparatio: :positivus, options: opts }
177
+ FormBuilder.build(args).first.to_s
178
+ end
179
+ end
180
+ class PronounUnusquisqueS < PronounUnusquisque
181
+ def prefixed_particle
182
+ # unaquisque does not exist - unusquisque is for m and f
183
+ if @casus == 1 && @numerus == 1 && @sexus != :n
184
+ "unus"
185
+ else
186
+ super
187
+ end
188
+ end
189
+ end
190
+
191
+ class PronounQuisquis < PronounQui
192
+ def init_keys
193
+ super << :ending
194
+ end
195
+
196
+ def particle
197
+ stem + @ending
198
+ end
199
+ end
200
+
201
+ class PronounAliqui < PronounQui
202
+ prefixed_particle n(:ALI)
203
+ end
204
+ PronounAliquis = PronounAliqui
205
+
206
+ class PronounUter < PronounSegments
207
+ def stem
208
+ if uter
209
+ "uter"
210
+ else
211
+ "utr"
212
+ end
213
+ end
214
+
215
+ def uter
216
+ @casus == 1 && @numerus == 1 && @sexus == :m
217
+ end
218
+ end
219
+
220
+ class PronounUterque < PronounUter
221
+ particle n(:QUE)
222
+ end
223
+
224
+ end
225
+ end
226
+ end