1with TEXT_IO;
2with DIRECT_IO;
3package INFLECTIONS_PACKAGE is
4  package INTEGER_IO is new TEXT_IO.INTEGER_IO(INTEGER);
5  use TEXT_IO;
6
7  --  Generally simple/enumeration types have names ending in _TYPE
8  --            complex/record     types have names ending in _RECORD
9  --            array              types have names ending in _ARRAY
10
11  MAX_STEM_SIZE    : constant := 18;
12  MAX_MEANING_SIZE : constant := 80;
13
14  subtype STEM_TYPE is STRING(1..MAX_STEM_SIZE);
15  NULL_STEM_TYPE : constant STEM_TYPE := (others => ' ');
16
17  package STEM_TYPE_IO is
18    DEFAULT_WIDTH : NATURAL := MAX_STEM_SIZE;
19    procedure GET(F : in FILE_TYPE; D : out STEM_TYPE);
20    procedure GET(D : out STEM_TYPE);
21    procedure PUT(F : in FILE_TYPE; D : in STEM_TYPE);
22    procedure PUT(D : in STEM_TYPE);
23    procedure GET(S : in STRING; D : out STEM_TYPE;
24                                 LAST : out INTEGER);
25    procedure PUT(S : out STRING; D : in STEM_TYPE);
26  end STEM_TYPE_IO;
27
28
29  subtype MEANING_TYPE is STRING(1..MAX_MEANING_SIZE);
30  NULL_MEANING_TYPE : constant MEANING_TYPE := (others => ' ');
31
32  type PART_OF_SPEECH_TYPE is (
33          X,         --  all, none, or unknown
34          N,         --  Noun
35          PRON,      --  PRONoun
36          PACK,      --  PACKON -- artificial for code
37          ADJ,       --  ADJective
38          NUM,       --  NUMeral
39          ADV,       --  ADVerb
40          V,         --  Verb
41          VPAR,      --  Verb PARticiple
42          SUPINE,    --  SUPINE
43          PREP,      --  PREPosition
44          CONJ,      --  CONJunction
45          INTERJ,    --  INTERJection
46          TACKON,    --  TACKON --  artificial for code
47          PREFIX,    --  PREFIX --  here artificial for code
48          SUFFIX     --  SUFFIX --  here artificial for code
49                                );
50
51  package PART_OF_SPEECH_TYPE_IO is
52      new TEXT_IO.ENUMERATION_IO(PART_OF_SPEECH_TYPE);
53
54
55  subtype WHICH_TYPE is NATURAL range 0..9;
56
57  subtype VARIANT_TYPE is NATURAL range 0..9;
58
59  WHICH_TYPE_IO_DEFAULT_WIDTH : INTEGER := 1;
60  VARIANT_TYPE_IO_DEFAULT_WIDTH : INTEGER := 1;
61
62  type DECN_RECORD is
63    record
64      WHICH        : WHICH_TYPE := 0;
65      VAR          : VARIANT_TYPE := 0;
66    end record;
67
68   function "<" (LEFT, RIGHT : DECN_RECORD) return BOOLEAN;
69
70    package DECN_RECORD_IO is
71    DEFAULT_WIDTH : NATURAL;
72    procedure GET(F : in FILE_TYPE; D : out DECN_RECORD);
73    procedure GET(D : out DECN_RECORD);
74    procedure PUT(F : in FILE_TYPE; D : in DECN_RECORD);
75    procedure PUT(D : in DECN_RECORD);
76    procedure GET(S : in STRING; D : out DECN_RECORD;
77                                 LAST : out INTEGER);
78    procedure PUT(S : out STRING; D : in DECN_RECORD);
79  end DECN_RECORD_IO;
80
81
82  type GENDER_TYPE is (
83          X,         --  all, none, or unknown
84          M,         --  Masculine
85          F,         --  Feminine
86          N,         --  Neuter
87          C          --  Common (masculine and/or feminine)
88                       );
89
90  package GENDER_TYPE_IO is new TEXT_IO.ENUMERATION_IO(GENDER_TYPE);
91
92  type CASE_TYPE is (
93          X,         --  all, none, or unknown
94          NOM,       --  NOMinative
95          VOC,       --  VOCative
96          GEN,       --  GENitive
97          LOC,       --  LOCative
98          DAT,       --  DATive
99          ABL,       --  ABLative
100          ACC        --  ACCusitive
101                     );
102
103  package CASE_TYPE_IO is new TEXT_IO.ENUMERATION_IO(CASE_TYPE);
104
105  type NUMBER_TYPE is (
106          X,         --  all, none, or unknown
107          S,         --  Singular
108          P          --  Plural
109                       );
110
111  package NUMBER_TYPE_IO is new TEXT_IO.ENUMERATION_IO(NUMBER_TYPE);
112
113  type PERSON_TYPE is range 0..3;
114  package PERSON_TYPE_IO is new TEXT_IO.INTEGER_IO(PERSON_TYPE);
115
116  type COMPARISON_TYPE is (
117          X,         --  all, none, or unknown
118          POS,       --  POSitive
119          COMP,      --  COMParative
120          SUPER      --  SUPERlative
121                           );
122
123  package COMPARISON_TYPE_IO is new TEXT_IO.ENUMERATION_IO(COMPARISON_TYPE);
124
125  type STEM_KEY_TYPE is new NATURAL range 0..9;
126
127  package STEM_KEY_TYPE_IO is new TEXT_IO.INTEGER_IO(STEM_KEY_TYPE);
128  STEM_KEY_TYPE_IO_DEFAULT_WIDTH : INTEGER := 1;
129
130
131
132  type NUMERAL_SORT_TYPE is (
133         X,          --  all, none, or unknown
134         CARD,       --  CARDinal
135         ORD,        --  ORDinal
136         DIST,       --  DISTributive
137         ADVERB      --  numeral ADVERB
138                            );
139
140
141  package NUMERAL_SORT_TYPE_IO is
142    new TEXT_IO.ENUMERATION_IO(NUMERAL_SORT_TYPE);
143
144
145
146  type TENSE_TYPE is (
147          X,         --  all, none, or unknown
148          PRES,      --  PRESent
149          IMPF,      --  IMPerFect
150          FUT,       --  FUTure
151          PERF,      --  PERFect
152          PLUP,      --  PLUPerfect
153          FUTP       --  FUTure Perfect
154                      );
155
156  package TENSE_TYPE_IO is new TEXT_IO.ENUMERATION_IO(TENSE_TYPE);
157
158  type VOICE_TYPE is (
159          X,         --  all, none, or unknown
160          ACTIVE,    --  ACTIVE
161          PASSIVE    --  PASSIVE
162                      );
163
164  package VOICE_TYPE_IO is new TEXT_IO.ENUMERATION_IO(VOICE_TYPE);
165
166  type MOOD_TYPE is (
167          X,         --  all, none, or unknown
168          IND,       --  INDicative
169          SUB,       --  SUBjunctive
170          IMP,       --  IMPerative
171          INF,       --  INFinative
172          PPL        --  ParticiPLe
173                     );
174
175  package MOOD_TYPE_IO is new TEXT_IO.ENUMERATION_IO(MOOD_TYPE);
176
177  type TENSE_VOICE_MOOD_RECORD is
178    record
179      TENSE : TENSE_TYPE := X;
180      VOICE : VOICE_TYPE := X;
181      MOOD  : MOOD_TYPE  := X;
182    end record;
183
184  package TENSE_VOICE_MOOD_RECORD_IO is
185    DEFAULT_WIDTH : NATURAL;
186    procedure GET(F : in FILE_TYPE; T : out TENSE_VOICE_MOOD_RECORD);
187    procedure GET(T : out TENSE_VOICE_MOOD_RECORD);
188    procedure PUT(F : in FILE_TYPE; T : in TENSE_VOICE_MOOD_RECORD);
189    procedure PUT(T : in TENSE_VOICE_MOOD_RECORD);
190    procedure GET(S : in STRING; T : out TENSE_VOICE_MOOD_RECORD;
191                                 LAST : out INTEGER);
192    procedure PUT(S : out STRING; T : in TENSE_VOICE_MOOD_RECORD);
193  end TENSE_VOICE_MOOD_RECORD_IO;
194
195
196  type NOUN_KIND_TYPE is (
197          X,            --  unknown, nondescript
198          S,            --  Singular "only"           --  not really used
199          M,            --  plural or Multiple "only" --  not really used
200          A,            --  Abstract idea
201          G,            --  Group/collective Name -- Roman(s)
202          N,            --  proper Name
203          P,            --  a Person
204          T,            --  a Thing
205          L,            --  Locale, name of country/city
206          W             --  a place Where
207                           );
208
209  package NOUN_KIND_TYPE_IO is new TEXT_IO.ENUMERATION_IO(NOUN_KIND_TYPE);
210
211  type PRONOUN_KIND_TYPE is (
212          X,            --  unknown, nondescript
213          PERS,         --  PERSonal
214          REL,          --  RELative
215          REFLEX,       --  REFLEXive
216          DEMONS,       --  DEMONStrative
217          INTERR,       --  INTERRogative
218          INDEF,        --  INDEFinite
219          ADJECT        --  ADJECTival
220                             );
221
222  package PRONOUN_KIND_TYPE_IO is
223      new TEXT_IO.ENUMERATION_IO(PRONOUN_KIND_TYPE);
224
225   subtype NUMERAL_VALUE_TYPE is NATURAL range 0..1000;
226
227   NUMERAL_VALUE_TYPE_IO_DEFAULT_WIDTH : INTEGER := 5;
228
229
230   type VERB_KIND_TYPE is (
231          X,         --  all, none, or unknown
232          TO_BE,     --  only the verb TO BE (esse)
233          TO_BEING,  --  compounds of the verb to be (esse)
234          GEN,       --  verb taking the GENitive
235          DAT,       --  verb taking the DATive
236          ABL,       --  verb taking the ABLative
237          TRANS,     --  TRANSitive verb
238          INTRANS,   --  INTRANSitive verb
239          IMPERS,    --  IMPERSonal verb (implied subject 'it', 'they', 'God')
240                     --  agent implied in action, subject in predicate
241          DEP,       --  DEPonent verb
242                     --  only passive form but with active meaning
243          SEMIDEP,   --  SEMIDEPonent verb (forms perfect as deponent)
244                     --  (perfect passive has active force)
245          PERFDEF    --  PERFect DEFinite verb
246                     --  having only perfect stem, but with present force
247                          );
248
249  package VERB_KIND_TYPE_IO is
250      new TEXT_IO.ENUMERATION_IO(VERB_KIND_TYPE);
251
252
253type NOUN_RECORD is
254  record
255    DECL        : DECN_RECORD;
256    CS          : CASE_TYPE := X;
257    NUMBER      : NUMBER_TYPE := X;
258    GENDER      : GENDER_TYPE := X;
259  end record;
260
261 package NOUN_RECORD_IO is
262   DEFAULT_WIDTH : NATURAL;
263   procedure GET(F : in FILE_TYPE; N : out NOUN_RECORD);
264   procedure GET(N : out NOUN_RECORD);
265   procedure PUT(F : in FILE_TYPE; N : in NOUN_RECORD);
266   procedure PUT(N : in NOUN_RECORD);
267   procedure GET(S : in STRING; N : out NOUN_RECORD; LAST : out INTEGER);
268   procedure PUT(S : out STRING; N : in NOUN_RECORD);
269 end NOUN_RECORD_IO;
270
271
272type PRONOUN_RECORD is
273  record
274    DECL        : DECN_RECORD;
275    CS          : CASE_TYPE := X;
276    NUMBER      : NUMBER_TYPE := X;
277    GENDER      : GENDER_TYPE := X;
278  end record;
279
280 package PRONOUN_RECORD_IO is
281   DEFAULT_WIDTH : NATURAL;
282   procedure GET(F : in FILE_TYPE; P : out PRONOUN_RECORD);
283   procedure GET(P : out PRONOUN_RECORD);
284   procedure PUT(F : in FILE_TYPE; P : in PRONOUN_RECORD);
285   procedure PUT(P : in PRONOUN_RECORD);
286   procedure GET(S : in STRING; P : out PRONOUN_RECORD; LAST : out INTEGER);
287   procedure PUT(S : out STRING; P : in PRONOUN_RECORD);
288 end PRONOUN_RECORD_IO;
289
290
291type PROPACK_RECORD is
292  record
293    DECL        : DECN_RECORD;
294    CS          : CASE_TYPE := X;
295    NUMBER      : NUMBER_TYPE := X;
296    GENDER      : GENDER_TYPE := X;
297  end record;
298
299 package PROPACK_RECORD_IO is
300   DEFAULT_WIDTH : NATURAL;
301   procedure GET(F : in FILE_TYPE; P : out PROPACK_RECORD);
302   procedure GET(P : out PROPACK_RECORD);
303   procedure PUT(F : in FILE_TYPE; P : in PROPACK_RECORD);
304   procedure PUT(P : in PROPACK_RECORD);
305   procedure GET(S : in STRING; P : out PROPACK_RECORD; LAST : out INTEGER);
306   procedure PUT(S : out STRING; P : in PROPACK_RECORD);
307 end PROPACK_RECORD_IO;
308
309
310type ADJECTIVE_RECORD is
311  record
312    DECL        : DECN_RECORD;
313    CS          : CASE_TYPE := X;
314    NUMBER      : NUMBER_TYPE := X;
315    GENDER      : GENDER_TYPE := X;
316    CO          : COMPARISON_TYPE := X;
317  end record;
318
319 package ADJECTIVE_RECORD_IO is
320   DEFAULT_WIDTH : NATURAL;
321   procedure GET(F : in FILE_TYPE; A : out ADJECTIVE_RECORD);
322   procedure GET(A : out ADJECTIVE_RECORD);
323   procedure PUT(F : in FILE_TYPE; A : in ADJECTIVE_RECORD);
324   procedure PUT(A : in ADJECTIVE_RECORD);
325   procedure GET(S : in STRING; A : out ADJECTIVE_RECORD; LAST : out INTEGER);
326   procedure PUT(S : out STRING; A : in ADJECTIVE_RECORD);
327 end ADJECTIVE_RECORD_IO;
328
329
330  type NUMERAL_RECORD is
331   record
332     DECL        : DECN_RECORD;
333     CS          : CASE_TYPE := X;
334     NUMBER      : NUMBER_TYPE := X;
335     GENDER      : GENDER_TYPE := X;
336     SORT        : NUMERAL_SORT_TYPE := X;
337  end record;
338
339
340  package NUMERAL_RECORD_IO is
341    DEFAULT_WIDTH : NATURAL;
342    procedure GET(F : in FILE_TYPE; NUM : out NUMERAL_RECORD);
343    procedure GET(NUM : out NUMERAL_RECORD);
344    procedure PUT(F : in FILE_TYPE; NUM : in NUMERAL_RECORD);
345    procedure PUT(NUM : in NUMERAL_RECORD);
346    procedure GET(S : in STRING; NUM : out NUMERAL_RECORD; LAST : out INTEGER);
347    procedure PUT(S : out STRING; NUM : in NUMERAL_RECORD);
348  end NUMERAL_RECORD_IO;
349
350type ADVERB_RECORD is
351  record
352    CO   : COMPARISON_TYPE := X;
353  end record;
354
355 package ADVERB_RECORD_IO is
356   DEFAULT_WIDTH : NATURAL;
357   procedure GET(F : in FILE_TYPE; A : out ADVERB_RECORD);
358   procedure GET(A : out ADVERB_RECORD);
359   procedure PUT(F : in FILE_TYPE; A : in ADVERB_RECORD);
360   procedure PUT(A : in ADVERB_RECORD);
361   procedure GET(S : in STRING; A : out ADVERB_RECORD; LAST : out INTEGER);
362   procedure PUT(S : out STRING; A : in ADVERB_RECORD);
363 end ADVERB_RECORD_IO;
364
365
366type VERB_RECORD is
367  record
368    CON         : DECN_RECORD;
369    TENSE_VOICE_MOOD  : TENSE_VOICE_MOOD_RECORD;
370    PERSON      : PERSON_TYPE := 0;
371    NUMBER      : NUMBER_TYPE := X;
372  end record;
373
374 package VERB_RECORD_IO is
375   DEFAULT_WIDTH : NATURAL;
376   procedure GET(F : in FILE_TYPE; V : out VERB_RECORD);
377   procedure GET(V : out VERB_RECORD);
378   procedure PUT(F : in FILE_TYPE; V : in VERB_RECORD);
379   procedure PUT(V : in VERB_RECORD);
380   procedure GET(S : in STRING; V : out VERB_RECORD; LAST : out INTEGER);
381   procedure PUT(S : out STRING; V : in VERB_RECORD);
382 end VERB_RECORD_IO;
383
384
385type VPAR_RECORD is
386  record
387    CON         : DECN_RECORD;
388    CS          : CASE_TYPE := X;
389    NUMBER      : NUMBER_TYPE := X;
390    GENDER      : GENDER_TYPE := X;
391    TENSE_VOICE_MOOD  : TENSE_VOICE_MOOD_RECORD;
392  end record;
393
394 package VPAR_RECORD_IO is
395   DEFAULT_WIDTH : NATURAL;
396   procedure GET(F : in FILE_TYPE; VP : out VPAR_RECORD);
397   procedure GET(VP : out VPAR_RECORD);
398   procedure PUT(F : in FILE_TYPE; VP : in VPAR_RECORD);
399   procedure PUT(VP : in VPAR_RECORD);
400   procedure GET(S : in STRING; VP : out VPAR_RECORD; LAST : out INTEGER);
401   procedure PUT(S : out STRING; VP : in VPAR_RECORD);
402 end VPAR_RECORD_IO;
403
404
405type SUPINE_RECORD is
406  record
407    CON         : DECN_RECORD;
408    CS          : CASE_TYPE := X;
409    NUMBER      : NUMBER_TYPE := X;
410    GENDER      : GENDER_TYPE := X;
411  end record;
412
413 package SUPINE_RECORD_IO is
414   DEFAULT_WIDTH : NATURAL;
415   procedure GET(F : in FILE_TYPE; VP : out SUPINE_RECORD);
416   procedure GET(VP : out SUPINE_RECORD);
417   procedure PUT(F : in FILE_TYPE; VP : in SUPINE_RECORD);
418   procedure PUT(VP : in SUPINE_RECORD);
419   procedure GET(S : in STRING; VP : out SUPINE_RECORD; LAST : out INTEGER);
420   procedure PUT(S : out STRING; VP : in SUPINE_RECORD);
421 end SUPINE_RECORD_IO;
422
423
424type PREPOSITION_RECORD is
425  record
426    OBJ : CASE_TYPE := X;
427  end record;
428
429 package PREPOSITION_RECORD_IO is
430   DEFAULT_WIDTH : NATURAL;
431   procedure GET(F : in FILE_TYPE; P : out PREPOSITION_RECORD);
432   procedure GET(P : out PREPOSITION_RECORD);
433   procedure PUT(F : in FILE_TYPE; P : in PREPOSITION_RECORD);
434   procedure PUT(P : in PREPOSITION_RECORD);
435   procedure GET(S : in STRING; P : out PREPOSITION_RECORD; LAST : out INTEGER);
436   procedure PUT(S : out STRING; P : in PREPOSITION_RECORD);
437 end PREPOSITION_RECORD_IO;
438
439
440type CONJUNCTION_RECORD is
441  record
442    null;
443  end record;
444
445 package CONJUNCTION_RECORD_IO is
446   DEFAULT_WIDTH : NATURAL;
447   procedure GET(F : in FILE_TYPE; C : out CONJUNCTION_RECORD);
448   procedure GET(C : out CONJUNCTION_RECORD);
449   procedure PUT(F : in FILE_TYPE; C : in CONJUNCTION_RECORD);
450   procedure PUT(C : in CONJUNCTION_RECORD);
451   procedure GET(S : in STRING; C : out CONJUNCTION_RECORD; LAST : out INTEGER);
452   procedure PUT(S : out STRING; C : in CONJUNCTION_RECORD);
453 end CONJUNCTION_RECORD_IO;
454
455
456type INTERJECTION_RECORD is
457  record
458    null;
459  end record;
460
461 package INTERJECTION_RECORD_IO is
462   DEFAULT_WIDTH : NATURAL;
463   procedure GET(F : in FILE_TYPE; I : out INTERJECTION_RECORD);
464   procedure GET(I : out INTERJECTION_RECORD);
465   procedure PUT(F : in FILE_TYPE; I : in INTERJECTION_RECORD);
466   procedure PUT(I : in INTERJECTION_RECORD);
467   procedure GET(S : in STRING; I : out INTERJECTION_RECORD; LAST : out INTEGER);
468   procedure PUT(S : out STRING; I : in INTERJECTION_RECORD);
469 end INTERJECTION_RECORD_IO;
470
471
472  --  TACKON, PREFIX, SUFFIX are nulls put in to allow easy printing later
473
474  type TACKON_RECORD is
475    record
476      null;
477    end record;
478
479  NULL_TACKON_RECORD : TACKON_RECORD;
480
481  package TACKON_RECORD_IO is
482    DEFAULT_WIDTH : NATURAL;
483    procedure GET(F : in FILE_TYPE; I : out TACKON_RECORD);
484    procedure GET(I : out TACKON_RECORD);
485    procedure PUT(F : in FILE_TYPE; I : in TACKON_RECORD);
486    procedure PUT(I : in TACKON_RECORD);
487    procedure GET(S : in STRING; I : out TACKON_RECORD; LAST : out INTEGER);
488    procedure PUT(S : out STRING; I : in TACKON_RECORD);
489  end TACKON_RECORD_IO;
490
491
492  type PREFIX_RECORD is
493    record
494      null;
495    end record;
496
497  NULL_PREFIX_RECORD : PREFIX_RECORD;
498
499  package PREFIX_RECORD_IO is
500    DEFAULT_WIDTH : NATURAL;
501    procedure GET(F : in FILE_TYPE; P : out PREFIX_RECORD);
502    procedure GET(P : out PREFIX_RECORD);
503    procedure PUT(F : in FILE_TYPE; P : in PREFIX_RECORD);
504    procedure PUT(P : in PREFIX_RECORD);
505    procedure GET(S : in STRING; P : out PREFIX_RECORD; LAST : out INTEGER);
506    procedure PUT(S : out STRING; P : in PREFIX_RECORD);
507  end PREFIX_RECORD_IO;
508
509  type SUFFIX_RECORD is
510    record
511      null;
512    end record;
513
514  NULL_SUFFIX_RECORD : SUFFIX_RECORD;
515
516  package SUFFIX_RECORD_IO is
517    DEFAULT_WIDTH : NATURAL;
518    procedure GET(F : in FILE_TYPE; P : out SUFFIX_RECORD);
519    procedure GET(P : out SUFFIX_RECORD);
520    procedure PUT(F : in FILE_TYPE; P : in SUFFIX_RECORD);
521    procedure PUT(P : in SUFFIX_RECORD);
522    procedure GET(S : in STRING; P : out SUFFIX_RECORD; LAST : out INTEGER);
523    procedure PUT(S : out STRING; P : in SUFFIX_RECORD);
524  end SUFFIX_RECORD_IO;
525
526
527  type QUALITY_RECORD(POFS : PART_OF_SPEECH_TYPE := X) is
528    record
529      case POFS is
530        when N =>
531          N : NOUN_RECORD;
532        when PRON =>
533          PRON : PRONOUN_RECORD;
534        when PACK =>
535          PACK : PROPACK_RECORD;
536        when ADJ =>
537          ADJ : ADJECTIVE_RECORD;
538        when NUM =>
539          NUM : NUMERAL_RECORD;
540        when ADV =>
541          ADV : ADVERB_RECORD;
542        when V =>
543          V : VERB_RECORD;
544        when VPAR =>
545          VPAR : VPAR_RECORD;
546        when SUPINE =>
547          SUPINE : SUPINE_RECORD;
548        when PREP =>
549          PREP : PREPOSITION_RECORD;
550        when CONJ =>
551          CONJ : CONJUNCTION_RECORD;
552        when INTERJ =>
553          INTERJ : INTERJECTION_RECORD;
554        when TACKON =>
555          TACKON : TACKON_RECORD;
556        when PREFIX =>
557          PREFIX : PREFIX_RECORD;
558        when SUFFIX =>
559          SUFFIX : SUFFIX_RECORD;
560        when others =>
561          null;
562      end case;
563    end record;
564
565  NULL_QUALITY_RECORD : QUALITY_RECORD;
566
567  function "<" (LEFT, RIGHT : QUALITY_RECORD) return BOOLEAN;
568
569  package QUALITY_RECORD_IO is
570    DEFAULT_WIDTH : NATURAL;
571    procedure GET(F : in FILE_TYPE; P : out QUALITY_RECORD);
572    procedure GET(P : out QUALITY_RECORD);
573    procedure PUT(F : in FILE_TYPE; P : in QUALITY_RECORD);
574    procedure PUT(P : in QUALITY_RECORD);
575    procedure GET(S : in STRING; P : out QUALITY_RECORD; LAST : out INTEGER);
576    procedure PUT(S : out STRING; P : in QUALITY_RECORD);
577  end QUALITY_RECORD_IO;
578
579  type QUALITY_ARRAY is array (INTEGER range <>) of QUALITY_RECORD;
580
581  MAX_ENDING_SIZE : constant := 7;
582  subtype ENDING_SIZE_TYPE is INTEGER range 0..MAX_ENDING_SIZE;
583
584  ENDING_SIZE_TYPE_IO_DEFAULT_WIDTH : INTEGER := 3;
585
586  subtype ENDING is STRING(1..MAX_ENDING_SIZE);
587
588  type ENDING_RECORD is
589    record
590      SIZE : ENDING_SIZE_TYPE := 0;
591      SUF  : ENDING := (others => ' ');
592    end record;
593
594  package ENDING_RECORD_IO is
595    DEFAULT_WIDTH : NATURAL;
596    procedure GET(F : in FILE_TYPE; X : out ENDING_RECORD);
597    procedure GET(X : out ENDING_RECORD);
598    procedure PUT(F : in FILE_TYPE; X : in ENDING_RECORD);
599    procedure PUT(X : in ENDING_RECORD);
600    procedure GET(S : in STRING; X : out ENDING_RECORD; LAST : out INTEGER);
601    procedure PUT(S : out STRING; X : in ENDING_RECORD);
602  end ENDING_RECORD_IO;
603
604  NULL_ENDING_RECORD : ENDING_RECORD;
605
606
607  type AGE_TYPE is (
608    X,   --              --  In use throughout the ages/unknown -- the default
609    A,   --  archaic     --  Very early forms, obsolete by classical times
610    B,   --  early       --  Early Latin, pre-classical, used for effect/poetry
611    C,   --  classical   --  Limited to classical (~150 BC - 200 AD)
612    D,   --  late        --  Late, post-classical (3rd-5th centuries)
613    E,   --  later       --  Latin not in use in Classical times (6-10), Christian
614    F,   --  medieval    --  Medieval (11th-15th centuries)
615    G,   --  scholar     --  Latin post 15th - Scholarly/Scientific   (16-18)
616    H    --  modern      --  Coined recently, words for new things (19-20)
617                      );
618  package AGE_TYPE_IO is new TEXT_IO.ENUMERATION_IO(AGE_TYPE);
619
620
621  type FREQUENCY_TYPE is (     --  For dictionary entries
622    X,    --              --  Unknown or unspecified
623    A,    --  very freq   --  Very frequent, in all Elementry Latin books
624    B,    --  frequent    --  Frequent, in top 10 percent
625    C,    --  common      --  For Dictionary, in top 10,000 words
626    D,    --  lesser      --  For Dictionary, in top 20,000 words
627    E,    --  uncommon    --  2 or 3 citations
628    F,    --  very rare   --  Having only single citation in OLD or L+S
629    I,    --  inscription --  Only citation is inscription
630    M,    --  graffiti    --  Presently not much used
631    N     --  Pliny       --  Things that appear (almost) only in Pliny Natural History
632                           );
633
634  --  For inflections, the same type is used with different weights
635--  X,    --              --  Unknown or unspecified
636--  A,    --  most freq   --  Very frequent, the most common
637--  B,    --  sometimes   --  sometimes, a not unusual VARIANT
638--  C,    --  uncommon    --  occasionally seen
639--  D,    --  infrequent  --  recognizable variant, but unlikely
640--  E,    --  rare        --  for a few cases, very unlikely
641--  F,    --  very rare   --  singular examples,
642--  I,    --  inscription --  Only citation is inscription
643--  M,    --              --  Presently not used
644--  N     --              --  Presently not used
645
646
647  package FREQUENCY_TYPE_IO is new TEXT_IO.ENUMERATION_IO(FREQUENCY_TYPE);
648
649
650
651  type INFLECTION_RECORD is
652    record
653      QUAL   : QUALITY_RECORD   := NULL_QUALITY_RECORD;
654      KEY    : STEM_KEY_TYPE := 0;
655      ENDING : ENDING_RECORD := NULL_ENDING_RECORD;
656      AGE    : AGE_TYPE      := X;
657      FREQ   : FREQUENCY_TYPE      := X;
658    end record;
659
660  NULL_INFLECTION_RECORD : INFLECTION_RECORD;
661
662  package INFLECTION_RECORD_IO is
663    DEFAULT_WIDTH : NATURAL;
664    procedure GET(F : in FILE_TYPE; P : out INFLECTION_RECORD);
665    procedure GET(P : out INFLECTION_RECORD);
666    procedure PUT(F : in FILE_TYPE; P : in INFLECTION_RECORD);
667    procedure PUT(P : in INFLECTION_RECORD);
668    procedure GET(S : in STRING; P : out INFLECTION_RECORD; LAST : out INTEGER);
669    procedure PUT(S : out STRING; P : in INFLECTION_RECORD);
670  end INFLECTION_RECORD_IO;
671
672  --  This implies a knowledge of the inflections last character
673  subtype INFLECTIONS_SECTION_1 is CHARACTER range 'a'..'i';
674  subtype INFLECTIONS_SECTION_2 is CHARACTER range 'm'..'r';
675  subtype INFLECTIONS_SECTION_3 is CHARACTER range 's'..'s';
676  subtype INFLECTIONS_SECTION_4 is CHARACTER range 't'..'u';
677
678  SIZE_OF_BLANK_INFLECTIONS   : constant INTEGER :=  80;    --  ############
679  SIZE_OF_INFLECTIONS_SECTION : constant INTEGER := 570;    --  ############
680
681  type INFLECTION_ARRAY is array (POSITIVE range <>) of INFLECTION_RECORD;
682  subtype LEL_SECTION is INFLECTION_ARRAY(1..SIZE_OF_INFLECTIONS_SECTION);
683  package LEL_SECTION_IO is new DIRECT_IO(LEL_SECTION);
684
685  BEL : INFLECTION_ARRAY(1..SIZE_OF_BLANK_INFLECTIONS);
686
687  LEL : LEL_SECTION;
688
689  type INFLECTION_ARRAY_INDEX is array (INTEGER range <>,
690                                        CHARACTER range <>) of INTEGER;
691
692  BELF, BELL : INFLECTION_ARRAY_INDEX(0..0, ' '..' ') := (0 => (others => 0));
693  LELF, LELL : INFLECTION_ARRAY_INDEX(1..MAX_ENDING_SIZE,
694                                      'a'..'z') := (others => (others => 0));
695  PELF, PELL : INFLECTION_ARRAY_INDEX(1..MAX_ENDING_SIZE,
696                                      'a'..'z') := (others => (others => 0));
697
698  NUMBER_OF_INFLECTIONS : INTEGER := 0;
699
700
701  procedure ESTABLISH_INFLECTIONS_SECTION;
702
703
704
705
706  --  <=   means for this purpose "contained in"
707
708  function "<=" (LEFT, RIGHT : PART_OF_SPEECH_TYPE) return BOOLEAN;
709  function "<=" (LEFT, RIGHT : DECN_RECORD) return BOOLEAN;
710  function "<=" (LEFT, RIGHT : GENDER_TYPE) return BOOLEAN;
711  function "<=" (LEFT, RIGHT : CASE_TYPE)   return BOOLEAN;
712  function "<=" (LEFT, RIGHT : NUMBER_TYPE) return BOOLEAN;
713  function "<=" (LEFT, RIGHT : PERSON_TYPE) return BOOLEAN;
714  function "<=" (LEFT, RIGHT : COMPARISON_TYPE) return BOOLEAN;
715  function "<=" (LEFT, RIGHT : TENSE_VOICE_MOOD_RECORD)  return BOOLEAN;
716  function "<=" (LEFT, RIGHT : NOUN_KIND_TYPE)   return BOOLEAN;
717  function "<=" (LEFT, RIGHT : PRONOUN_KIND_TYPE)   return BOOLEAN;
718  function "<=" (LEFT, RIGHT : STEM_KEY_TYPE)   return BOOLEAN;  -- not verbs
719  function "<=" (LEFT, RIGHT : AGE_TYPE)   return BOOLEAN;
720  function "<=" (LEFT, RIGHT : FREQUENCY_TYPE)   return BOOLEAN;
721
722
723  GIVE_UP : exception;
724
725
726end INFLECTIONS_PACKAGE;
727
728
729
730