Files
whitakers-words/put_example_line.adb
2012-05-31 16:45:42 -05:00

385 lines
15 KiB
Ada

with TEXT_IO;
with INFLECTIONS_PACKAGE; use INFLECTIONS_PACKAGE;
with DICTIONARY_PACKAGE; use DICTIONARY_PACKAGE;
with CONFIG; use CONFIG;
with WORD_PARAMETERS; use WORD_PARAMETERS;
--with LATIN_DEBUG;
procedure PUT_EXAMPLE_LINE(OUTPUT : TEXT_IO.FILE_TYPE; IR : in INFLECTION_RECORD;
DE : in DICTIONARY_ENTRY) is
-- use LATIN_DEBUG;
VK : VERB_KIND_TYPE;
procedure PUT_VERB_EXAMPLE(OUTPUT : TEXT_IO.FILE_TYPE; IR : in INFLECTION_RECORD;
VK : in VERB_KIND_TYPE) is
PERSON : constant PERSON_TYPE := IR.QUAL.V.PERSON;
NUMBER : constant NUMBER_TYPE := IR.QUAL.V.NUMBER;
TENSE : constant TENSE_TYPE := IR.QUAL.V.TENSE_VOICE_MOOD.TENSE;
MOOD : constant MOOD_TYPE := IR.QUAL.V.TENSE_VOICE_MOOD.MOOD;
VOICE : VOICE_TYPE := IR.QUAL.V.TENSE_VOICE_MOOD.VOICE;
KIND : VERB_KIND_TYPE := VK;
-- Nothing on (part), gerund,
function THEY return STRING is
begin
if KIND = IMPERS then
return "it ";
end if;
if MOOD = INF then
return "to ";
end if;
if MOOD = IMP and TENSE = PRES and NUMBER = P then
return "(you) ";
end if;
if MOOD = SUB and TENSE = PRES and
PERSON = 1 and NUMBER = P then
return "let us "; -- G&L 263 1
end if;
if NUMBER = S then
if PERSON = 1 then
return "I ";
elsif PERSON = 2 then
return "you ";
elsif PERSON = 3 then
return "he/it ";
else
return "";
end if;
elsif NUMBER = P then
if PERSON = 1 then
return "we ";
elsif PERSON = 2 then
return "you ";
elsif PERSON = 3 then
return "they ";
else
return "";
end if;
else
return "";
end if;
end THEY;
function SHALL return STRING is
begin -- ACTIVE only !!!!!!!!!!!!!!!!
if (TENSE = FUT or TENSE = FUTP ) then
if (MOOD = IND) or (MOOD = SUB) then
if PERSON = 1 then
return "shall ";
elsif PERSON = 2 then
return "will ";
elsif PERSON = 3 then
return "will ";
else
return "";
end if;
elsif MOOD = IMP then
if PERSON = 1 then
return "will ";
elsif PERSON = 2 then
return "(shall) ";
elsif PERSON = 3 then
return "(shall) ";
else
return "";
end if;
elsif MOOD = INF then
if TENSE = FUT then
return "be about to be ";
else
return "";
end if;
else
return "";
end if;
else
return "";
end if;
end SHALL;
function HAVE return STRING is
begin
if TENSE in PRES..FUT then
return "";
elsif TENSE = PERF then
if (TENSE = PERF) and (PERSON = 3) and (NUMBER = S) then
return "has ";
else
return "have "; -- works for INF too
end if;
elsif TENSE = PLUP then
if MOOD = IND then
return "had";
elsif MOOD = SUB then
return "have ";
else
return "";
end if;
elsif TENSE = FUTP then
return "have ";
else
return "";
end if;
end HAVE;
function BEEN return STRING is
begin
if VOICE = PASSIVE then
if MOOD = IND then
if TENSE = PRES then
if (PERSON = 1) and (NUMBER = S) then
return "am/am being ";
elsif (PERSON = 3) and (NUMBER = S) then
return "is/is being ";
else
return "are/are being ";
end if;
elsif TENSE = IMPF then
if (PERSON = 1 or PERSON = 3) and (NUMBER = S) then
return "was/was being ";
else
return "were/were being ";
end if;
elsif TENSE = FUT then
return "be ";
elsif TENSE = PERF then
if (PERSON = 1 or PERSON = 3) and (NUMBER = S) then
return "been/was ";
else
return "been/were ";
end if;
elsif TENSE in PLUP..FUTP then
return "been ";
else
return "";
end if;
elsif MOOD = SUB then
return ""; --????????
elsif MOOD = INF then
if TENSE = PRES then
return "be ";
elsif TENSE = PERF then
return "been ";
else
return "";
end if;
elsif MOOD = IMP then
return "be ";
else
return "";
end if;
else
return "";
end if;
end BEEN;
function ED return STRING is
begin
if MOOD = IMP then
if VOICE = ACTIVE then
return "!";
elsif VOICE = PASSIVE then
return "ed!";
else
return "";
end if;
elsif MOOD = INF then
if VOICE = ACTIVE then
return "";
elsif VOICE = PASSIVE then
return "ed";
else
return "";
end if;
elsif MOOD = IND then
if VOICE = ACTIVE then
if TENSE = PRES then
if (PERSON = 3) and (NUMBER = S) then
return "s";
else
return "";
end if;
elsif TENSE = IMPF then
if (PERSON = 1 or PERSON = 3) and (NUMBER = S) then
return "ed/was ~ing";
else
return "ed/were ~ing";
end if;
elsif TENSE in PERF..FUTP then
return "ed";
else
return "";
end if;
elsif VOICE = PASSIVE then
return "ed";
else
return "";
end if;
elsif MOOD = SUB then
if TENSE in PERF..PLUP then
return "ed";
else
return "";
end if;
else
return "";
end if;
end ED;
function SUB return STRING is
begin
if MOOD = SUB then
return "may/must/should ";
else
return "";
end if;
end SUB;
begin -- PUT_VERB_EXAMPLE
if KIND = DEP then
VOICE := ACTIVE; -- Should only have allowed PASSIVE at this point
elsif KIND = SEMIDEP and then TENSE in PERF..FUTP then
VOICE := ACTIVE; -- Should only have allowed PASSIVE at this point
end if;
TEXT_IO.PUT(OUTPUT, THEY & SUB & SHALL & HAVE & BEEN & "~" & ED);
end PUT_VERB_EXAMPLE;
begin -- PUT_EXAMPLE_LINE
--TEXT_IO.PUT("In EXAMPLES ");
--TEXT_IO.PUT(" LKM "); BOOLEAN_IO.PUT(WORDS_MDEV(LOCK_MEANINGS));
--TEXT_IO.PUT(" /LKM "); BOOLEAN_IO.PUT((not WORDS_MDEV(LOCK_MEANINGS)) );
if WORDS_MODE(DO_EXAMPLES) and then (not (CONFIGURATION = ONLY_MEANINGS)) then
case IR.QUAL.POFS is
when N =>
case IR.QUAL.N.CS is
when GEN =>
TEXT_IO.PUT(OUTPUT, "~'s; of ~");
TEXT_IO.NEW_LINE(OUTPUT);
when ABL =>
TEXT_IO.NEW_LINE(OUTPUT); -- Info too much for same line
TEXT_IO.SET_COL(OUTPUT, 6);
TEXT_IO.PUT(OUTPUT,
"from _ (separ); because of ~ (cause); than ~ (compar); of ~ (circumstance)");
TEXT_IO.NEW_LINE(OUTPUT);
when DAT =>
TEXT_IO.NEW_LINE(OUTPUT); -- Info too much for same line
TEXT_IO.SET_COL(OUTPUT, 6);
TEXT_IO.PUT(OUTPUT,
"for _ (purpose, reference); to ~ (w/adjectives); to ~ (double dative)");
TEXT_IO.NEW_LINE(OUTPUT);
when LOC =>
TEXT_IO.PUT(OUTPUT, "at ~ (place where)");
TEXT_IO.NEW_LINE(OUTPUT);
when others =>
null;
--TEXT_IO.NEW_LINE(OUTPUT);
end case;
when ADJ =>
case IR.QUAL.ADJ.CO is
when COMP =>
TEXT_IO.PUT(OUTPUT, "~er; more/too _");
TEXT_IO.NEW_LINE(OUTPUT);
when SUPER =>
TEXT_IO.PUT(OUTPUT, "~est; most/very");
TEXT_IO.NEW_LINE(OUTPUT);
when others =>
null;
--TEXT_IO.NEW_LINE(OUTPUT);
end case;
when ADV =>
case IR.QUAL.ADV.CO is
when COMP =>
TEXT_IO.PUT(OUTPUT, "more/too ~(ly)");
TEXT_IO.NEW_LINE(OUTPUT);
when SUPER =>
TEXT_IO.PUT(OUTPUT, "most/very ~(ly)");
TEXT_IO.NEW_LINE(OUTPUT);
when others =>
null;
--TEXT_IO.NEW_LINE(OUTPUT);
end case;
when V =>
--TEXT_IO.NEW_LINE(OUTPUT); -- Verb info too much for same line
VK := DE.PART.V.KIND;
TEXT_IO.SET_COL(OUTPUT, 6);
PUT_VERB_EXAMPLE(OUTPUT, IR, VK);
TEXT_IO.NEW_LINE(OUTPUT);
when VPAR =>
-- TEXT_IO.NEW_LINE(OUTPUT); -- Verb info too much for same line
case IR.QUAL.VPAR.TENSE_VOICE_MOOD.TENSE is
when PERF =>
TEXT_IO.PUT(OUTPUT,
"~ed PERF PASSIVE PPL often used as ADJ or N (amatus => belov.ed)");
TEXT_IO.NEW_LINE(OUTPUT);
when PRES =>
TEXT_IO.PUT(OUTPUT,
"~ing PRES ACTIVE PPL often used as ADJ or N (lov.ing, curl.y)");
TEXT_IO.NEW_LINE(OUTPUT);
when FUT =>
if IR.QUAL.VPAR.TENSE_VOICE_MOOD.VOICE = ACTIVE then
TEXT_IO.PUT(OUTPUT,
"about/going/intending/destined to ~ FUT ACTIVE PPL often used as ADJ or N ");
TEXT_IO.NEW_LINE(OUTPUT);
else
case IR.QUAL.VPAR.CS is
when GEN =>
TEXT_IO.PUT(OUTPUT,
"to(/must) be ~ed FUT PASSIVE PPL, often used as gerund or gerundive (of ~ing)");
when DAT =>
TEXT_IO.PUT(OUTPUT,
"to(/must) be ~ed FUT PASSIVE PPL, often used as gerund or gerundive (to/for ~ing)");
when ABL =>
TEXT_IO.PUT(OUTPUT,
"to(/must) be ~ed FUT PASSIVE PPL, often used as gerund or gerundive (by/in ~ing)");
when ACC =>
TEXT_IO.PUT(OUTPUT,
"to(/must) be ~ed FUT PASSIVE PPL, often used as gerund or gerundive (for ~ing/to ~)");
when others =>
TEXT_IO.PUT(OUTPUT,
"to(/must) be ~ed FUT PASSIVE PPL, often used as gerund or gerundive (~ing)");
end case;
TEXT_IO.NEW_LINE(OUTPUT);
end if;
when others =>
null;
--TEXT_IO.NEW_LINE(OUTPUT);
end case; -- TENSE
when SUPINE =>
--TEXT_IO.NEW_LINE(OUTPUT);
if IR.QUAL.SUPINE.CS = ACC then
TEXT_IO.PUT(OUTPUT,
"to ~ expresses purpose of verb of motion; may take a direct object");
TEXT_IO.NEW_LINE(OUTPUT);
elsif IR.QUAL.SUPINE.CS = ABL then
TEXT_IO.PUT(OUTPUT,
"to ~ after ADJ indicating aspect/respect in which something is/is done");
TEXT_IO.NEW_LINE(OUTPUT);
end if;
when others =>
null;
--TEXT_IO.NEW_LINE(OUTPUT);
end case; -- PART
else
null;
--TEXT_IO.NEW_LINE(OUTPUT);
end if;
end PUT_EXAMPLE_LINE;