1--  Need KIND_ENTRY and IO
2--  Need to modify TRANS
3   with TEXT_IO;
4   with DIRECT_IO;
5   with INFLECTIONS_PACKAGE; use INFLECTIONS_PACKAGE;
6   package DICTIONARY_PACKAGE is
7      use TEXT_IO;
8
9      ZZZ_STEM  : constant STEM_TYPE := "zzz" & (4..MAX_STEM_SIZE => ' ');
10      type STEMS_TYPE is array (STEM_KEY_TYPE range 1..4) of STEM_TYPE;
11      NULL_STEMS_TYPE : constant STEMS_TYPE := (others => NULL_STEM_TYPE);
12
13
14      type DICTIONARY_KIND is (X,            --  null
15                               ADDONS,       --  For FIXES
16                               XXX,          --  TRICKS
17                               YYY,          --  Syncope
18                               NNN,          --  Unknown Name
19                               RRR,          --  Roman Numerals
20                               PPP,          --  Compounds
21                               GENERAL, SPECIAL, LOCAL, UNIQUE);
22
23      package DICTIONARY_KIND_IO is new TEXT_IO.ENUMERATION_IO(DICTIONARY_KIND);
24
25      EXT : array (DICTIONARY_KIND) of STRING(1..3) := ("X  ", "ADD", "XXX", "YYY",
26                                                        "NNN", "RRR", "PPP",
27                                                        "GEN", "SPE", "LOC",
28                                                        "UNI");
29
30      DEFAULT_DICTIONARY_KIND : DICTIONARY_KIND := X;
31
32      DICTIONARY_AVAILABLE : array (DICTIONARY_KIND) of BOOLEAN := (FALSE,
33                                                            FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,  --  don't SEARCH
34                                                            FALSE, FALSE, FALSE, FALSE);
35    --  Start out as FALSE and set to TRUE when the DICT is loaded
36
37      type AREA_TYPE is (
38                        X,      --  All or none
39                        A,      --  Agriculture, Flora, Fauna, Land, Equipment, Rural
40                        B,      --  Biological, Medical, Body Parts
41                        D,      --  Drama, Music, Theater, Art, Painting, Sculpture
42                        E,      --  Ecclesiastic, Biblical, Religious
43                        G,      --  Grammar, Retoric, Logic, Literature, Schools
44                        L,      --  Legal, Government, Tax, Financial, Political, Titles
45                        P,      --  Poetic
46                        S,      --  Science, Philosophy, Mathematics, Units/Measures
47                        T,      --  Technical, Architecture, Topography, Surveying
48                        W,      --  War, Military, Naval, Ships, Armor
49                        Y       --  Mythology
50                        );
51
52      package AREA_TYPE_IO is new TEXT_IO.ENUMERATION_IO(AREA_TYPE);
53
54      type GEO_TYPE is (
55                       X,      --  All or none
56                       A,      --  Africa
57                       B,      --  Britian
58                       C,      --  China
59                       D,      --  Scandinavia
60                       E,      --  Egypt
61                       F,      --  France, Gaul
62                       G,      --  Germany
63                       H,      --  Greece
64                       I,      --  Italy, Rome
65                       J,      --  India
66                       K,      --  Balkans
67                       N,      --  Netherlands
68                       P,      --  Persia
69                       Q,      --  Near East
70                       R,      --  Russia
71                       S,      --  Spain, Iberia
72                       U       --  Eastern Europe
73                       );
74
75      package GEO_TYPE_IO is new TEXT_IO.ENUMERATION_IO(GEO_TYPE);
76
77        type SOURCE_TYPE is (
78    X,      --  General or unknown or too common to say
79    A,
80    B,      --  C.H.Beeson, A Primer of Medieval Latin, 1925 (Bee)
81    C,      --  Charles Beard, Cassell's Latin Dictionary 1892 (Cas)
82    D,      --  J.N.Adams, Latin Sexual Vocabulary, 1982 (Sex)
83    E,      --  L.F.Stelten, Dictionary of Eccles. Latin, 1995 (Ecc)
84    F,      --  Roy J. Deferrari, Dictionary of St. Thomas Aquinas, 1960 (DeF)
85    G,      --  Gildersleeve + Lodge, Latin Grammar 1895 (G+L)
86    H,      --  Collatinus Dictionary by Yves Ouvrard
87    I,      --  Leverett, F.P., Lexicon of the Latin Language, Boston 1845
88    J,      --  Bracton: De Legibus Et Consuetudinibus Angli�
89    K,      --  Calepinus Novus, modern Latin, by Guy Licoppe (Cal)
90    L,      --  Lewis, C.S., Elementary Latin Dictionary 1891
91    M,      --  Latham, Revised Medieval Word List, 1980 (Latham)
92    N,      --  Lynn Nelson, Wordlist (Nel)
93    O,      --  Oxford Latin Dictionary, 1982 (OLD)
94    P,      --  Souter, A Glossary of Later Latin to 600 A.D., Oxford 1949 (Souter)
95    Q,      --  Other, cited or unspecified dictionaries
96    R,      --  Plater + White, A Grammar of the Vulgate, Oxford 1926 (Plater)
97    S,      --  Lewis and Short, A Latin Dictionary, 1879 (L+S)
98    T,      --  Found in a translation  --  no dictionary reference
99    U,      --
100    V,      --  Vademecum in opus Saxonis - Franz Blatt (Saxo)
101    W,      --  My personal guess, mostly obvious extrapolation (Whitaker or W)
102    Y,      --  Temp special code
103    Z       --  Sent by user --  no dictionary reference
104            --  Mostly John White of Blitz Latin
105
106    --  Consulted but used only indirectly
107    --  Liddell + Scott Greek-English Lexicon (Lid)
108    --  Oxford English Dictionary 2002 (OED)
109
110    --  Consulted but used only occasionally, seperately referenced
111    --  D.A. Kidd, Collins Latin Gem Dictionary, 1957 (Col)
112    --  Allen + Greenough, New Latin Grammar, 1888 (A+G)
113    --  Harrington/Pucci/Elliott, Medieval Latin 2nd Ed 1997 (Harr)
114    --  C.C./C.L. Scanlon Latin Grammar/Second Latin, TAN 1976 (SCANLON)
115    --  W. M. Lindsay, Short Historical Latin Grammar, 1895 (Lindsay)
116    --  Du Cange
117    --  Oxford English Dictionary (OED)
118
119    --  Note that the WORDS dictionary is not just a copy of source info, but the
120    --  indicated SOURCE is a main reference/check point used to derive the entry
121
122                        );
123
124
125      package SOURCE_TYPE_IO is new TEXT_IO.ENUMERATION_IO(SOURCE_TYPE);
126
127
128      type KIND_ENTRY(POFS : PART_OF_SPEECH_TYPE := X) is
129         record
130            case POFS is
131               when N =>
132                  N_KIND : NOUN_KIND_TYPE := X;
133               when PRON =>
134                  PRON_KIND : PRONOUN_KIND_TYPE := X;
135               when PACK =>
136                  PACK_KIND : PRONOUN_KIND_TYPE := X;
137               when ADJ =>
138               null;
139               when NUM =>
140                  NUM_VALUE : NUMERAL_VALUE_TYPE := 0;
141               when V =>
142                  V_KIND : VERB_KIND_TYPE := X;
143               when VPAR =>
144                  VPAR_KIND : VERB_KIND_TYPE := X;
145               when SUPINE =>
146                  SUPINE_KIND : VERB_KIND_TYPE := X;
147               when others =>
148               null;
149            end case;
150         end record;
151
152      package KIND_ENTRY_IO is
153         DEFAULT_WIDTH : NATURAL;
154         procedure GET(F : in FILE_TYPE;
155                       PS : in PART_OF_SPEECH_TYPE; P : out KIND_ENTRY);
156         procedure GET(PS : in PART_OF_SPEECH_TYPE; P : out KIND_ENTRY);
157         procedure PUT(F : in FILE_TYPE;
158                       PS : in PART_OF_SPEECH_TYPE; P : in KIND_ENTRY);
159         procedure PUT(PS : in PART_OF_SPEECH_TYPE; P : in KIND_ENTRY);
160         procedure GET(S : in STRING; PS : in PART_OF_SPEECH_TYPE;
161                       P : out KIND_ENTRY; LAST : out INTEGER);
162         procedure PUT(S : out STRING;
163                       PS : in PART_OF_SPEECH_TYPE; P : in KIND_ENTRY);
164      end KIND_ENTRY_IO;
165
166      NULL_KIND_ENTRY : KIND_ENTRY;
167
168
169
170
171      type TRANSLATION_RECORD is
172         record
173            AGE  : AGE_TYPE := X;
174            AREA : AREA_TYPE := X;
175            GEO  : GEO_TYPE := X;
176            FREQ : FREQUENCY_TYPE := X;
177            SOURCE : SOURCE_TYPE := X;
178         end record;
179
180      NULL_TRANSLATION_RECORD : TRANSLATION_RECORD;
181
182      package TRANSLATION_RECORD_IO is
183         DEFAULT_WIDTH : TEXT_IO.FIELD;
184         procedure GET(F : in TEXT_IO.FILE_TYPE; TR : out TRANSLATION_RECORD);
185         procedure GET(TR : out TRANSLATION_RECORD);
186         procedure PUT(F : in TEXT_IO.FILE_TYPE; TR : in TRANSLATION_RECORD);
187         procedure PUT(TR : in TRANSLATION_RECORD);
188         procedure GET(S : in STRING; TR : out TRANSLATION_RECORD; LAST : out INTEGER);
189         procedure PUT(S : out STRING; TR : in TRANSLATION_RECORD);
190      end TRANSLATION_RECORD_IO;
191
192
193
194
195      type NOUN_ENTRY is
196         record
197            DECL   : DECN_RECORD := (0, 0);
198            GENDER : GENDER_TYPE := X;
199            KIND   : NOUN_KIND_TYPE := X;
200         end record;
201
202      package NOUN_ENTRY_IO is
203         DEFAULT_WIDTH : NATURAL;
204         procedure GET(F : in FILE_TYPE; N : out NOUN_ENTRY);
205         procedure GET(N : out NOUN_ENTRY);
206         procedure PUT(F : in FILE_TYPE; N : in NOUN_ENTRY);
207         procedure PUT(N : in NOUN_ENTRY);
208         procedure GET(S : in STRING; N : out NOUN_ENTRY; LAST : out INTEGER);
209         procedure PUT(S : out STRING; N : in NOUN_ENTRY);
210      end NOUN_ENTRY_IO;
211
212
213
214      type PRONOUN_ENTRY is
215         record
216            DECL  : DECN_RECORD := (0,0);
217            KIND : PRONOUN_KIND_TYPE := X;
218         end record;
219
220      package PRONOUN_ENTRY_IO is
221         DEFAULT_WIDTH : NATURAL;
222         procedure GET(F : in FILE_TYPE; P : out PRONOUN_ENTRY);
223         procedure GET(P : out PRONOUN_ENTRY);
224         procedure PUT(F : in FILE_TYPE; P : in PRONOUN_ENTRY);
225         procedure PUT(P : in PRONOUN_ENTRY);
226         procedure GET(S : in STRING; P : out PRONOUN_ENTRY; LAST : out INTEGER);
227         procedure PUT(S : out STRING; P : in PRONOUN_ENTRY);
228      end PRONOUN_ENTRY_IO;
229
230
231      type PROPACK_ENTRY is
232         record
233            DECL  : DECN_RECORD := (0,0);
234            KIND : PRONOUN_KIND_TYPE := X;
235         end record;
236
237      package PROPACK_ENTRY_IO is
238         DEFAULT_WIDTH : NATURAL;
239         procedure GET(F : in FILE_TYPE; P : out PROPACK_ENTRY);
240         procedure GET(P : out PROPACK_ENTRY);
241         procedure PUT(F : in FILE_TYPE; P : in PROPACK_ENTRY);
242         procedure PUT(P : in PROPACK_ENTRY);
243         procedure GET(S : in STRING; P : out PROPACK_ENTRY; LAST : out INTEGER);
244         procedure PUT(S : out STRING; P : in PROPACK_ENTRY);
245      end PROPACK_ENTRY_IO;
246
247
248
249      type ADJECTIVE_ENTRY is
250         record
251            DECL : DECN_RECORD := (0, 0);
252            CO   : COMPARISON_TYPE := X;
253         end record;
254
255      package ADJECTIVE_ENTRY_IO is
256         DEFAULT_WIDTH : NATURAL;
257         procedure GET(F : in FILE_TYPE; A : out ADJECTIVE_ENTRY);
258         procedure GET(A : out ADJECTIVE_ENTRY);
259         procedure PUT(F : in FILE_TYPE; A : in ADJECTIVE_ENTRY);
260         procedure PUT(A : in ADJECTIVE_ENTRY);
261         procedure GET(S : in STRING; A : out ADJECTIVE_ENTRY; LAST : out INTEGER);
262         procedure PUT(S : out STRING; A : in ADJECTIVE_ENTRY);
263      end ADJECTIVE_ENTRY_IO;
264
265
266      type NUMERAL_ENTRY is
267         record
268            DECL  : DECN_RECORD := (0,0);
269            SORT  : NUMERAL_SORT_TYPE := X;
270            VALUE : NUMERAL_VALUE_TYPE := 0;
271         end record;
272
273      package NUMERAL_ENTRY_IO is
274         DEFAULT_WIDTH : NATURAL;
275         procedure GET(F : in FILE_TYPE; NUM : out NUMERAL_ENTRY);
276         procedure GET(NUM : out NUMERAL_ENTRY);
277         procedure PUT(F : in FILE_TYPE; NUM : in NUMERAL_ENTRY);
278         procedure PUT(NUM : in NUMERAL_ENTRY);
279         procedure GET(S : in STRING; NUM : out NUMERAL_ENTRY; LAST : out INTEGER);
280         procedure PUT(S : out STRING; NUM : in NUMERAL_ENTRY);
281      end NUMERAL_ENTRY_IO;
282
283
284
285      type ADVERB_ENTRY is
286         record
287            CO   : COMPARISON_TYPE := X;
288         end record;
289
290
291
292      package ADVERB_ENTRY_IO is
293         DEFAULT_WIDTH : NATURAL;
294         procedure GET(F : in FILE_TYPE; A : out ADVERB_ENTRY);
295         procedure GET(A : out ADVERB_ENTRY);
296         procedure PUT(F : in FILE_TYPE; A : in ADVERB_ENTRY);
297         procedure PUT(A : in ADVERB_ENTRY);
298         procedure GET(S : in STRING; A : out ADVERB_ENTRY; LAST : out INTEGER);
299         procedure PUT(S : out STRING; A : in ADVERB_ENTRY);
300      end ADVERB_ENTRY_IO;
301
302
303      type VERB_ENTRY is
304         record
305            CON  : DECN_RECORD := (0,0);
306            KIND : VERB_KIND_TYPE := X;
307         end record;
308
309      package VERB_ENTRY_IO is
310         DEFAULT_WIDTH : NATURAL;
311         procedure GET(F : in FILE_TYPE; V : out VERB_ENTRY);
312         procedure GET(V : out VERB_ENTRY);
313         procedure PUT(F : in FILE_TYPE; V : in VERB_ENTRY);
314         procedure PUT(V : in VERB_ENTRY);
315         procedure GET(S : in STRING; V : out VERB_ENTRY; LAST : out INTEGER);
316         procedure PUT(S : out STRING; V : in VERB_ENTRY);
317      end VERB_ENTRY_IO;
318
319
320      type PREPOSITION_ENTRY is
321         record
322            OBJ : CASE_TYPE := X;
323         end record;
324
325      package PREPOSITION_ENTRY_IO is
326         DEFAULT_WIDTH : NATURAL;
327         procedure GET(F : in FILE_TYPE; P : out PREPOSITION_ENTRY);
328         procedure GET(P : out PREPOSITION_ENTRY);
329         procedure PUT(F : in FILE_TYPE; P : in PREPOSITION_ENTRY);
330         procedure PUT(P : in PREPOSITION_ENTRY);
331         procedure GET(S : in STRING; P : out PREPOSITION_ENTRY; LAST : out INTEGER);
332         procedure PUT(S : out STRING; P : in PREPOSITION_ENTRY);
333      end PREPOSITION_ENTRY_IO;
334
335
336      type CONJUNCTION_ENTRY is
337         record
338         null;
339         end record;
340
341      package CONJUNCTION_ENTRY_IO is
342         DEFAULT_WIDTH : NATURAL;
343         procedure GET(F : in FILE_TYPE; C : out CONJUNCTION_ENTRY);
344         procedure GET(C : out CONJUNCTION_ENTRY);
345         procedure PUT(F : in FILE_TYPE; C : in CONJUNCTION_ENTRY);
346         procedure PUT(C : in CONJUNCTION_ENTRY);
347         procedure GET(S : in STRING; C : out CONJUNCTION_ENTRY; LAST : out INTEGER);
348         procedure PUT(S : out STRING; C : in CONJUNCTION_ENTRY);
349      end CONJUNCTION_ENTRY_IO;
350
351
352      type INTERJECTION_ENTRY is
353         record
354         null;
355         end record;
356
357      package INTERJECTION_ENTRY_IO is
358         DEFAULT_WIDTH : NATURAL;
359         procedure GET(F : in FILE_TYPE; I : out INTERJECTION_ENTRY);
360         procedure GET(I : out INTERJECTION_ENTRY);
361         procedure PUT(F : in FILE_TYPE; I : in INTERJECTION_ENTRY);
362         procedure PUT(I : in INTERJECTION_ENTRY);
363         procedure GET(S : in STRING; I : out INTERJECTION_ENTRY; LAST : out INTEGER);
364         procedure PUT(S : out STRING; I : in INTERJECTION_ENTRY);
365      end INTERJECTION_ENTRY_IO;
366
367
368      type PART_ENTRY(POFS : PART_OF_SPEECH_TYPE := X) is
369         record
370            case POFS is
371               when N =>
372                  N : NOUN_ENTRY;
373               when PRON =>
374                  PRON : PRONOUN_ENTRY;
375               when PACK =>
376                  PACK : PROPACK_ENTRY;
377               when ADJ =>
378                  ADJ : ADJECTIVE_ENTRY;
379               when NUM =>
380                  NUM : NUMERAL_ENTRY;
381               when ADV =>
382                  ADV : ADVERB_ENTRY;
383               when V =>
384                  V : VERB_ENTRY;
385               when VPAR =>
386               null;                 --  There will be no VPAR dictionary entries
387               when SUPINE =>
388               null;                 --  There will be no SUPINE dictionary entries
389               when PREP =>
390                  PREP : PREPOSITION_ENTRY;
391               when CONJ =>
392                  CONJ : CONJUNCTION_ENTRY;
393               when INTERJ =>
394                  INTERJ : INTERJECTION_ENTRY;
395               when others =>
396               null;
397            end case;
398         end record;
399
400      package PART_ENTRY_IO is
401         DEFAULT_WIDTH : NATURAL;
402         procedure GET(F : in FILE_TYPE; P : out PART_ENTRY);
403         procedure GET(P : out PART_ENTRY);
404         procedure PUT(F : in FILE_TYPE; P : in PART_ENTRY);
405         procedure PUT(P : in PART_ENTRY);
406         procedure GET(S : in STRING; P : out PART_ENTRY; LAST : out INTEGER);
407         procedure PUT(S : out STRING; P : in PART_ENTRY);
408      end PART_ENTRY_IO;
409
410      NULL_PART_ENTRY : PART_ENTRY;
411
412
413      function "<" (LEFT, RIGHT : PART_ENTRY) return BOOLEAN;
414
415
416      type DICTIONARY_ENTRY is
417         record
418            STEMS : STEMS_TYPE         := NULL_STEMS_TYPE;
419            PART  : PART_ENTRY         := NULL_PART_ENTRY;
420--            KIND  : KIND_ENTRY         := NULL_KIND_ENTRY;
421            TRAN  : TRANSLATION_RECORD := NULL_TRANSLATION_RECORD;
422            MEAN  : MEANING_TYPE       := NULL_MEANING_TYPE;
423         end record;
424
425      package DICTIONARY_ENTRY_IO is
426         DEFAULT_WIDTH : FIELD;
427         procedure GET(F : in FILE_TYPE; D : out DICTIONARY_ENTRY);
428         procedure GET(D : out DICTIONARY_ENTRY);
429         procedure PUT(F : in FILE_TYPE; D : in DICTIONARY_ENTRY);
430         procedure PUT(D : in DICTIONARY_ENTRY);
431         procedure GET(S : in STRING; D : out DICTIONARY_ENTRY; LAST : out INTEGER);
432         procedure PUT(S : out STRING; D : in DICTIONARY_ENTRY);
433      end DICTIONARY_ENTRY_IO;
434
435      NULL_DICTIONARY_ENTRY : DICTIONARY_ENTRY;
436
437      package DICT_IO is new DIRECT_IO(DICTIONARY_ENTRY);
438      DICT_FILE : array (DICTIONARY_KIND) of DICT_IO.FILE_TYPE;
439
440
441      package MNPC_IO is new TEXT_IO.INTEGER_IO(DICT_IO.COUNT);
442      subtype MNPC_TYPE is DICT_IO.COUNT;
443      NULL_MNPC : DICT_IO.COUNT := DICT_IO.COUNT'FIRST;
444
445
446      type PARSE_RECORD is
447         record
448            STEM  : STEM_TYPE := NULL_STEM_TYPE;
449            IR    : INFLECTION_RECORD := NULL_INFLECTION_RECORD;
450            D_K   : DICTIONARY_KIND := DEFAULT_DICTIONARY_KIND;
451            MNPC  : DICT_IO.COUNT := NULL_MNPC;
452         end record;
453
454      NULL_PARSE_RECORD : PARSE_RECORD;
455
456      package PARSE_RECORD_IO is
457         DEFAULT_WIDTH : TEXT_IO.FIELD;
458         procedure GET(F : in TEXT_IO.FILE_TYPE; PR : out PARSE_RECORD);
459         procedure GET(PR : out PARSE_RECORD);
460         procedure PUT(F : in TEXT_IO.FILE_TYPE; PR : in PARSE_RECORD);
461         procedure PUT(PR : in PARSE_RECORD);
462         procedure GET(S : in STRING; PR : out PARSE_RECORD; LAST : out INTEGER);
463         procedure PUT(S : out STRING; PR : in PARSE_RECORD);
464      end PARSE_RECORD_IO;
465
466
467      type PARSE_ARRAY is array (INTEGER range <>) of PARSE_RECORD;
468
469
470      function NUMBER_OF_STEMS(P : PART_OF_SPEECH_TYPE) return STEM_KEY_TYPE;
471
472      function "<=" (LEFT, RIGHT : AREA_TYPE) return BOOLEAN;
473
474   end DICTIONARY_PACKAGE;
475
476
477