1599 lines
63 KiB
Ada
1599 lines
63 KiB
Ada
with CONFIG; use CONFIG;
|
|
with STRINGS_PACKAGE; use STRINGS_PACKAGE;
|
|
with LATIN_FILE_NAMES; use LATIN_FILE_NAMES;
|
|
with WORD_PARAMETERS; use WORD_PARAMETERS;
|
|
with INFLECTIONS_PACKAGE; use INFLECTIONS_PACKAGE;
|
|
with DICTIONARY_PACKAGE; use DICTIONARY_PACKAGE;
|
|
with ADDONS_PACKAGE; use ADDONS_PACKAGE;
|
|
with UNIQUES_PACKAGE; use UNIQUES_PACKAGE;
|
|
with WORD_SUPPORT_PACKAGE; use WORD_SUPPORT_PACKAGE;
|
|
with DEVELOPER_PARAMETERS; use DEVELOPER_PARAMETERS;
|
|
with WORD_PACKAGE; use WORD_PACKAGE;
|
|
with DICTIONARY_FORM;
|
|
with PUT_EXAMPLE_LINE;
|
|
with LIST_SWEEP;
|
|
with PUT_STAT;
|
|
package body LIST_PACKAGE is
|
|
|
|
package BOOLEAN_IO is new TEXT_IO.ENUMERATION_IO(BOOLEAN);
|
|
|
|
subtype XONS is PART_OF_SPEECH_TYPE range TACKON..SUFFIX;
|
|
|
|
type DICTIONARY_MNPC_RECORD is record
|
|
D_K : DICTIONARY_KIND := DEFAULT_DICTIONARY_KIND;
|
|
MNPC : MNPC_TYPE := NULL_MNPC;
|
|
DE : DICTIONARY_ENTRY := NULL_DICTIONARY_ENTRY;
|
|
end record;
|
|
NULL_DICTIONARY_MNPC_RECORD : DICTIONARY_MNPC_RECORD
|
|
:= (X, NULL_MNPC, NULL_DICTIONARY_ENTRY);
|
|
|
|
MAX_MEANING_PRINT_SIZE : constant := 79;
|
|
MM : INTEGER := MAX_MEANING_SIZE;
|
|
I, J, K : INTEGER := 0;
|
|
|
|
|
|
INFLECTION_FREQUENCY : array (FREQUENCY_TYPE) of STRING(1..8) :=
|
|
(" ", -- X
|
|
"mostfreq", -- A
|
|
"sometime", -- B
|
|
"uncommon", -- C
|
|
"infreq ", -- D
|
|
"rare ", -- E
|
|
"veryrare", -- F
|
|
"inscript", -- I
|
|
" ", -- Not used
|
|
" " );
|
|
INFLECTION_AGE : array (AGE_TYPE) of STRING(1..8) :=
|
|
("Always ", -- X
|
|
"Archaic ", -- A
|
|
"Early ", -- B
|
|
"Classic ", -- C
|
|
"Late ", -- D
|
|
"Later ", -- E
|
|
"Medieval", -- F
|
|
"Scholar ", -- G
|
|
"Modern " ); -- H
|
|
|
|
DICTIONARY_FREQUENCY : array (FREQUENCY_TYPE) of STRING(1..8) :=
|
|
(" ", -- X
|
|
"veryfreq", -- A
|
|
"frequent", -- B
|
|
"common ", -- C
|
|
"lesser ", -- D
|
|
"uncommon", -- E
|
|
"veryrare", -- F
|
|
"inscript", -- I
|
|
"graffiti", -- J
|
|
"Pliny " );-- N
|
|
|
|
DICTIONARY_AGE : array (AGE_TYPE) of STRING(1..8) :=
|
|
(" ", -- X
|
|
"Archaic ", -- A
|
|
"Early ", -- B
|
|
"Classic ", -- C
|
|
"Late ", -- D
|
|
"Later ", -- E
|
|
"Medieval", -- F
|
|
"NeoLatin", -- G
|
|
"Modern " ); -- H
|
|
|
|
|
|
function CAP_STEM(S : STRING) return STRING is
|
|
begin
|
|
if ALL_CAPS then
|
|
return UPPER_CASE(S);
|
|
elsif CAPITALIZED then
|
|
return UPPER_CASE(S(S'FIRST)) & S(S'FIRST+1..S'LAST);
|
|
else
|
|
return S;
|
|
end if;
|
|
end CAP_STEM;
|
|
|
|
function CAP_ENDING(S : STRING) return STRING is
|
|
begin
|
|
if ALL_CAPS then
|
|
return UPPER_CASE(S);
|
|
else
|
|
return S;
|
|
end if;
|
|
end CAP_ENDING;
|
|
|
|
|
|
procedure PUT_DICTIONARY_FLAGS(OUTPUT : TEXT_IO.FILE_TYPE;
|
|
DE : DICTIONARY_ENTRY;
|
|
HIT : out BOOLEAN) is
|
|
begin
|
|
|
|
if WORDS_MODE(SHOW_AGE) or
|
|
(TRIM(DICTIONARY_AGE(DE.TRAN.AGE))'LENGTH /= 0) then -- Not X
|
|
TEXT_IO.PUT(OUTPUT, " " & TRIM(DICTIONARY_AGE(DE.TRAN.AGE)));
|
|
HIT := TRUE;
|
|
end if;
|
|
if (WORDS_MODE(SHOW_FREQUENCY) or
|
|
(DE.TRAN.FREQ >= D)) and
|
|
(TRIM(DICTIONARY_FREQUENCY(DE.TRAN.FREQ))'LENGTH /= 0) then
|
|
TEXT_IO.PUT(OUTPUT, " " & TRIM(DICTIONARY_FREQUENCY(DE.TRAN.FREQ)));
|
|
HIT := TRUE;
|
|
end if;
|
|
end PUT_DICTIONARY_FLAGS;
|
|
|
|
|
|
|
|
procedure PUT_DICTIONARY_FORM(OUTPUT : TEXT_IO.FILE_TYPE;
|
|
D_K : DICTIONARY_KIND;
|
|
MNPC : DICT_IO.COUNT;
|
|
DE : DICTIONARY_ENTRY) is
|
|
CHIT, DHIT, EHIT, FHIT, LHIT : BOOLEAN := FALSE; -- Things on this line?
|
|
DICTIONARY_LINE_NUMBER : INTEGER := INTEGER(MNPC);
|
|
--DE : DICTIONARY_ENTRY := DM.DE;
|
|
|
|
|
|
begin -- PUT_DICTIONARY_FORM
|
|
if WORDS_MODE(DO_DICTIONARY_FORMS) then
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "02 ");
|
|
DHIT := TRUE;
|
|
end if;
|
|
if DICTIONARY_FORM(DE)'LENGTH /= 0 then
|
|
TEXT_IO.PUT(OUTPUT, DICTIONARY_FORM(DE) & " ");
|
|
|
|
--TEXT_IO.PUT(OUTPUT, PART_OF_SPEECH_TYPE'IMAGE(DE.PART.POFS)& " ");
|
|
-- if DE.PART.POFS = N then
|
|
-- TEXT_IO.PUT(OUTPUT, " " & GENDER_TYPE'IMAGE(DE.PART.N.GENDER) & " ");
|
|
-- end if;
|
|
-- if (DE.PART.POFS = V) and then (DE.PART.V.KIND in GEN..PERFDEF) then
|
|
-- TEXT_IO.PUT(OUTPUT, " " & VERB_KIND_TYPE'IMAGE(DE.PART.V.KIND) & " ");
|
|
-- end if;
|
|
|
|
DHIT := TRUE;
|
|
end if;
|
|
end if;
|
|
|
|
|
|
|
|
if WORDS_MDEV(SHOW_DICTIONARY_CODES) and then
|
|
DE.PART.POFS not in XONS then
|
|
TEXT_IO.PUT(OUTPUT, " [");
|
|
AGE_TYPE_IO.PUT(OUTPUT, DE.TRAN.AGE);
|
|
AREA_TYPE_IO.PUT(OUTPUT, DE.TRAN.AREA);
|
|
GEO_TYPE_IO.PUT(OUTPUT, DE.TRAN.GEO);
|
|
FREQUENCY_TYPE_IO.PUT(OUTPUT, DE.TRAN.FREQ);
|
|
SOURCE_TYPE_IO.PUT(OUTPUT, DE.TRAN.SOURCE);
|
|
TEXT_IO.PUT(OUTPUT, "] ");
|
|
CHIT := TRUE;
|
|
end if;
|
|
|
|
|
|
if WORDS_MDEV(SHOW_DICTIONARY) then
|
|
TEXT_IO.PUT(OUTPUT, EXT(D_K) & ">");
|
|
EHIT := TRUE;
|
|
end if;
|
|
|
|
if WORDS_MDEV(SHOW_DICTIONARY_LINE) then
|
|
if DICTIONARY_LINE_NUMBER > 0 then
|
|
TEXT_IO.PUT(OUTPUT, "("
|
|
& TRIM(INTEGER'IMAGE(DICTIONARY_LINE_NUMBER)) & ")");
|
|
LHIT := TRUE;
|
|
end if;
|
|
end if;
|
|
|
|
|
|
PUT_DICTIONARY_FLAGS(OUTPUT, DE, FHIT);
|
|
|
|
|
|
if (CHIT or DHIT or EHIT or FHIT or LHIT) then
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
end if;
|
|
--end if;
|
|
|
|
end PUT_DICTIONARY_FORM;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
procedure LIST_STEMS(OUTPUT : TEXT_IO.FILE_TYPE;
|
|
RAW_WORD : STRING;
|
|
INPUT_LINE : STRING;
|
|
PA : in out PARSE_ARRAY;
|
|
PA_LAST : in out INTEGER) is
|
|
use TEXT_IO;
|
|
use DICT_IO;
|
|
|
|
|
|
-- The main WORD processing has been to produce an array of PARSE_RECORD
|
|
-- type PARSE_RECORD is
|
|
-- record
|
|
-- STEM : STEM_TYPE := NULL_STEM_TYPE;
|
|
-- IR : INFLECTION_RECORD := NULL_INFLECTION_RECORD;
|
|
-- D_K : DICTIONARY_KIND := DEFAULT_DICTIONARY_KIND;
|
|
-- MNPC : DICT_IO.COUNT := NULL_MNPC;
|
|
-- end record;
|
|
-- This has involved STEMFILE and INFLECTS, no DICTFILE
|
|
|
|
-- PARSE_RECORD is put through the LIST_SWEEP procedure that does TRIMing
|
|
-- Then, for processing for output, the data is converted to arrays of
|
|
-- type STEM_INFLECTION_RECORD is
|
|
-- record
|
|
-- STEM : STEM_TYPE := NULL_STEM_TYPE;
|
|
-- IR : INFLECTION_RECORD := NULL_INFLECTION_RECORD;
|
|
-- end record;
|
|
-- and
|
|
-- type DICTIONARY_MNPC_RECORD is
|
|
-- record
|
|
-- D_K : DICTIONARY_KIND;
|
|
-- MNPC : MNPC_TYPE;
|
|
-- DE : DICTIONARY_ENTRY;
|
|
-- end record;
|
|
-- containing the same data plus the DICTFILE data DICTIONARY_ENTRY
|
|
-- but breaking it into two arrays allows different manipulation
|
|
-- These are only within this routine, used to clean up the output
|
|
|
|
|
|
|
|
type STEM_INFLECTION_RECORD is
|
|
record
|
|
STEM : STEM_TYPE := NULL_STEM_TYPE;
|
|
IR : INFLECTION_RECORD := NULL_INFLECTION_RECORD;
|
|
end record;
|
|
NULL_STEM_INFLECTION_RECORD : STEM_INFLECTION_RECORD;
|
|
|
|
STEM_INFLECTION_ARRAY_SIZE : constant := 10;
|
|
STEM_INFLECTION_ARRAY_ARRAY_SIZE : constant := 40;
|
|
type STEM_INFLECTION_ARRAY is array (INTEGER range <>) of STEM_INFLECTION_RECORD;
|
|
type STEM_INFLECTION_ARRAY_ARRAY is array (INTEGER range <>)
|
|
of STEM_INFLECTION_ARRAY(1..STEM_INFLECTION_ARRAY_SIZE);
|
|
|
|
SRA, OSRA, NULL_SRA : STEM_INFLECTION_ARRAY(1..STEM_INFLECTION_ARRAY_SIZE)
|
|
:= (others => (NULL_STEM_TYPE, NULL_INFLECTION_RECORD));
|
|
SRAA, NULL_SRAA : STEM_INFLECTION_ARRAY_ARRAY(1..STEM_INFLECTION_ARRAY_ARRAY_SIZE)
|
|
:= (others => NULL_SRA);
|
|
|
|
-- type DICTIONARY_MNPC_RECORD is record
|
|
-- D_K : DICTIONARY_KIND := DEFAULT_DICTIONARY_KIND;
|
|
-- MNPC : MNPC_TYPE := NULL_MNPC;
|
|
-- DE : DICTIONARY_ENTRY := NULL_DICTIONARY_ENTRY;
|
|
-- end record;
|
|
-- NULL_DICTIONARY_MNPC_RECORD : DICTIONARY_MNPC_RECORD
|
|
-- := (X, NULL_MNPC, NULL_DICTIONARY_ENTRY);
|
|
DM, ODM : DICTIONARY_MNPC_RECORD := NULL_DICTIONARY_MNPC_RECORD;
|
|
|
|
DICTIONARY_MNPC_ARRAY_SIZE : constant := 40;
|
|
|
|
type DICTIONARY_MNPC_ARRAY is array (1..DICTIONARY_MNPC_ARRAY_SIZE)
|
|
of DICTIONARY_MNPC_RECORD;
|
|
DMA, ODMA, NULL_DMA : DICTIONARY_MNPC_ARRAY;
|
|
|
|
|
|
--MEANING_ARRAY_SIZE : constant := 5;
|
|
--MEANING_ARRAY : array (1..MEANING_ARRAY_SIZE) of MEANING_TYPE;
|
|
|
|
DEA : DICTIONARY_ENTRY := NULL_DICTIONARY_ENTRY;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
W : constant STRING := RAW_WORD;
|
|
J, J1, J2, K : INTEGER := 0;
|
|
THERE_IS_AN_ADVERB : BOOLEAN := FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
procedure PUT_INFLECTION(SR : STEM_INFLECTION_RECORD;
|
|
DM : DICTIONARY_MNPC_RECORD) is
|
|
-- Handles putting ONLY_MEAN, PEARSE_CODES, CAPS, QUAL, V_KIND, FLAGS
|
|
procedure PUT_INFLECTION_FLAGS is
|
|
begin
|
|
if (WORDS_MODE(SHOW_AGE) or
|
|
(SR.IR.AGE /= X)) and -- Warn even if not to show AGE
|
|
TRIM(INFLECTION_AGE(SR.IR.AGE))'LENGTH /= 0 then
|
|
TEXT_IO.PUT(OUTPUT, " " & INFLECTION_AGE(SR.IR.AGE));
|
|
end if;
|
|
if (WORDS_MODE(SHOW_FREQUENCY) or
|
|
(SR.IR.FREQ >= C)) and -- Warn regardless
|
|
TRIM(INFLECTION_FREQUENCY(SR.IR.FREQ))'LENGTH /= 0 then
|
|
TEXT_IO.PUT(OUTPUT, " " & INFLECTION_FREQUENCY(SR.IR.FREQ));
|
|
end if;
|
|
end PUT_INFLECTION_FLAGS;
|
|
|
|
begin
|
|
--TEXT_IO.PUT_LINE("PUT_INFLECTION ");
|
|
if (not WORDS_MODE(DO_ONLY_MEANINGS) and
|
|
not (CONFIGURATION = ONLY_MEANINGS)) then
|
|
TEXT_IO.SET_COL(OUTPUT, 1);
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
if DM.D_K = ADDONS then
|
|
TEXT_IO.PUT(OUTPUT, "05 ");
|
|
elsif DM.D_K in XXX..YYY then
|
|
TEXT_IO.PUT(OUTPUT, "06 ");
|
|
else
|
|
TEXT_IO.PUT(OUTPUT, "01 ");
|
|
end if;
|
|
end if;
|
|
|
|
|
|
--TEXT_IO.PUT(OUTPUT, CAP_STEM(TRIM(SR.STEM)));
|
|
TEXT_IO.PUT(OUTPUT, (TRIM(SR.STEM)));
|
|
if SR.IR.ENDING.SIZE > 0 then
|
|
TEXT_IO.PUT(OUTPUT, ".");
|
|
--TEXT_IO.PUT(OUTPUT, TRIM(CAP_ENDING(SR.IR.ENDING.SUF)));
|
|
TEXT_IO.PUT(OUTPUT, TRIM((SR.IR.ENDING.SUF)));
|
|
end if;
|
|
|
|
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.SET_COL(OUTPUT, 25);
|
|
else
|
|
TEXT_IO.SET_COL(OUTPUT, 22);
|
|
end if;
|
|
|
|
|
|
if SR.IR /= NULL_INFLECTION_RECORD then
|
|
|
|
--PRINT_MODIFIED_QUAL: -- Really pedantic
|
|
--declare
|
|
-- OUT_STRING : STRING(1..QUALITY_RECORD_IO.DEFAULT_WIDTH);
|
|
--WHICH_START : constant INTEGER
|
|
-- := PART_OF_SPEECH_TYPE_IO.DEFAULT_WIDTH + 1 + 1; -- 8
|
|
--VARIANT_START : constant INTEGER
|
|
-- := WHICH_START + WHICH_TYPE_IO_DEFAULT_WIDTH + 1;
|
|
--VARIANT_FINISH : constant INTEGER
|
|
-- := VARIANT_START + VARIANT_TYPE_IO_DEFAULT_WIDTH;
|
|
--WHICH_BLANK : constant STRING(WHICH_START..VARIANT_START) := (others => ' ');
|
|
--VARIANT_BLANK : constant STRING(VARIANT_START..VARIANT_FINISH) := (others => ' ');
|
|
--begin
|
|
-- QUALITY_RECORD_IO.PUT(OUT_STRING, SR.IR.QUAL);
|
|
-- case SR.IR.QUAL.POFS is
|
|
-- when N | NUM | V | VPAR | SUPINE => -- ADJ?
|
|
-- OUT_STRING(VARIANT_START..VARIANT_FINISH) := VARIANT_BLANK;
|
|
-- when PRON | PACK =>
|
|
-- OUT_STRING(WHICH_START..VARIANT_FINISH) := WHICH_BLANK & VARIANT_BLANK;
|
|
-- when ADJ =>
|
|
-- if SR.IR.QUAL.ADJ.DECL.WHICH = 1 then
|
|
-- OUT_STRING(VARIANT_START..VARIANT_FINISH) := VARIANT_BLANK;
|
|
-- end if;
|
|
-- when others =>
|
|
-- null;
|
|
-- end case;
|
|
-- TEXT_IO.PUT(OUTPUT, OUT_STRING);
|
|
--end PRINT_MODIFIED_QUAL;
|
|
|
|
--QUALITY_RECORD_IO.PUT(OUTPUT, SR.IR.QUAL);
|
|
--NEW_LINE(OUTPUT);
|
|
--DICTIONARY_ENTRY_IO.PUT(OUTPUT, DM.DE);
|
|
--NEW_LINE(OUTPUT);
|
|
|
|
|
|
PRINT_MODIFIED_QUAL:
|
|
declare
|
|
OUT_STRING : STRING(1..QUALITY_RECORD_IO.DEFAULT_WIDTH);
|
|
PASSIVE_START : INTEGER :=
|
|
PART_OF_SPEECH_TYPE_IO.DEFAULT_WIDTH + 1 +
|
|
DECN_RECORD_IO.DEFAULT_WIDTH + 1 +
|
|
TENSE_TYPE_IO.DEFAULT_WIDTH + 1;
|
|
PASSIVE_FINISH : INTEGER :=
|
|
PASSIVE_START +
|
|
VOICE_TYPE_IO.DEFAULT_WIDTH;
|
|
PPL_START : INTEGER :=
|
|
PART_OF_SPEECH_TYPE_IO.DEFAULT_WIDTH + 1 +
|
|
DECN_RECORD_IO.DEFAULT_WIDTH + 1 +
|
|
CASE_TYPE_IO.DEFAULT_WIDTH + 1 +
|
|
NUMBER_TYPE_IO.DEFAULT_WIDTH + 1 +
|
|
GENDER_TYPE_IO.DEFAULT_WIDTH + 1 +
|
|
TENSE_TYPE_IO.DEFAULT_WIDTH + 1;
|
|
PPL_FINISH : INTEGER :=
|
|
PPL_START +
|
|
VOICE_TYPE_IO.DEFAULT_WIDTH;
|
|
PASSIVE_BLANK : constant STRING(1..VOICE_TYPE_IO.DEFAULT_WIDTH) :=
|
|
(others => ' ');
|
|
begin
|
|
|
|
--TEXT_IO.PUT_LINE("PASSIVE_START = " & INTEGER'IMAGE(PASSIVE_START));
|
|
--TEXT_IO.PUT_LINE("PASSIVE_FINISH = " & INTEGER'IMAGE(PASSIVE_FINISH));
|
|
--TEXT_IO.PUT_LINE("PPL_START = " & INTEGER'IMAGE(PPL_START));
|
|
--TEXT_IO.PUT_LINE("PPL_FINISH = " & INTEGER'IMAGE(PPL_FINISH));
|
|
--
|
|
|
|
--TEXT_IO.PUT_LINE("START PRINT MODIFIED QUAL " );
|
|
-- QUALITY_RECORD_IO.PUT(OUT_STRING, SR.IR.QUAL);
|
|
-- if (DM.D_K in GENERAL..LOCAL) and then -- UNIQUES has no DE
|
|
-- (SR.IR.QUAL.POFS = V) and then
|
|
-- ((SR.IR.QUAL.V.TENSE_VOICE_MOOD.MOOD in IND..INF) and
|
|
-- (DM.DE.PART.V.KIND = DEP)) then
|
|
----TEXT_IO.PUT_LINE("PRINT MODIFIED QUAL 1a" );
|
|
-- OUT_STRING(PASSIVE_START+1..PASSIVE_FINISH) := PASSIVE_BLANK;
|
|
----TEXT_IO.PUT_LINE("PRINT MODIFIED QUAL 2a" );
|
|
-- elsif (DM.D_K in GENERAL..LOCAL) and then -- UNIQUES has no DE
|
|
-- (SR.IR.QUAL.POFS = VPAR) and then
|
|
-- ((SR.IR.QUAL.V.TENSE_VOICE_MOOD.MOOD = PPL) and
|
|
-- (DM.DE.PART.V.KIND = DEP)) then
|
|
--TEXT_IO.PUT_LINE("PRINT MODIFIED QUAL 1b" );
|
|
-- OUT_STRING(PPL_START+1..PPL_FINISH) := PASSIVE_BLANK;
|
|
--TEXT_IO.PUT_LINE("PRINT MODIFIED QUAL 2b" );
|
|
--
|
|
-- end if;
|
|
----TEXT_IO.PUT_LINE("PRINT MODIFIED QUAL 3" );
|
|
|
|
|
|
|
|
--TEXT_IO.PUT_LINE("START PRINT MODIFIED QUAL " );
|
|
QUALITY_RECORD_IO.PUT(OUT_STRING, SR.IR.QUAL);
|
|
if (DM.D_K in GENERAL..LOCAL) then -- UNIQUES has no DE
|
|
|
|
|
|
if (SR.IR.QUAL.POFS = V) and then
|
|
(DM.DE.PART.V.KIND = DEP) and then
|
|
(SR.IR.QUAL.V.TENSE_VOICE_MOOD.MOOD in IND..INF) then
|
|
--TEXT_IO.PUT_LINE("START PRINT MODIFIED QUAL V" );
|
|
OUT_STRING(PASSIVE_START+1..PASSIVE_FINISH) := PASSIVE_BLANK;
|
|
elsif (SR.IR.QUAL.POFS = VPAR) and then
|
|
(DM.DE.PART.V.KIND = DEP) and then
|
|
(SR.IR.QUAL.VPAR.TENSE_VOICE_MOOD.MOOD = PPL) then
|
|
--TEXT_IO.PUT_LINE("START PRINT MODIFIED QUAL VPAR" );
|
|
OUT_STRING(PPL_START+1..PPL_FINISH) := PASSIVE_BLANK;
|
|
end if;
|
|
end if;
|
|
|
|
TEXT_IO.PUT(OUTPUT, OUT_STRING);
|
|
--TEXT_IO.PUT_LINE("PRINT MODIFIED QUAL 4" );
|
|
end PRINT_MODIFIED_QUAL;
|
|
|
|
|
|
|
|
|
|
-- if ((SR.IR.QUAL.POFS = NUM) and -- Don't want on inflection
|
|
-- (DM.D_K in GENERAL..UNIQUE)) and then
|
|
-- (DM.DE.KIND.NUM_VALUE > 0) then
|
|
-- TEXT_IO.PUT(OUTPUT, " ");
|
|
-- INFLECTIONS_PACKAGE.INTEGER_IO.PUT(OUTPUT, DM.DE.KIND.NUM_VALUE);
|
|
-- end if;
|
|
PUT_INFLECTION_FLAGS;
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
PUT_EXAMPLE_LINE(OUTPUT, SR.IR, DM.DE); -- Only full when DO_EXAMPLES
|
|
else
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
end if;
|
|
end if;
|
|
|
|
end PUT_INFLECTION;
|
|
|
|
|
|
-- procedure PUT_DICTIONARY_FORM(OUTPUT : TEXT_IO.FILE_TYPE;
|
|
-- DM : DICTIONARY_MNPC_RECORD) is
|
|
-- HIT : BOOLEAN := FALSE; -- Is anything on this line
|
|
-- DICTIONARY_LINE_NUMBER : INTEGER := INTEGER(DM.MNPC);
|
|
-- DE : DICTIONARY_ENTRY := DM.DE;
|
|
--
|
|
--
|
|
-- begin -- PUT_DICTIONARY_FORM
|
|
-- if WORDS_MODE(DO_DICTIONARY_FORMS) then
|
|
-- if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
-- TEXT_IO.PUT(OUTPUT, "02 ");
|
|
-- HIT := TRUE;
|
|
-- end if;
|
|
-- if DICTIONARY_FORM(DE)'LENGTH /= 0 then
|
|
-- TEXT_IO.PUT(OUTPUT, DICTIONARY_FORM(DE) & " ");
|
|
-- HIT := TRUE;
|
|
-- end if;
|
|
-- end if;
|
|
--
|
|
--
|
|
--
|
|
-- if WORDS_MDEV(SHOW_DICTIONARY_CODES) and then
|
|
-- DE.PART.POFS not in XONS then
|
|
-- TEXT_IO.PUT(OUTPUT, " [");
|
|
-- AGE_TYPE_IO.PUT(OUTPUT, DE.TRAN.AGE);
|
|
-- AREA_TYPE_IO.PUT(OUTPUT, DE.TRAN.AREA);
|
|
-- GEO_TYPE_IO.PUT(OUTPUT, DE.TRAN.GEO);
|
|
-- FREQUENCY_TYPE_IO.PUT(OUTPUT, DE.TRAN.FREQ);
|
|
-- SOURCE_TYPE_IO.PUT(OUTPUT, DE.TRAN.SOURCE);
|
|
-- TEXT_IO.PUT(OUTPUT, "] ");
|
|
-- HIT := TRUE;
|
|
-- end if;
|
|
--
|
|
--
|
|
-- if WORDS_MDEV(SHOW_DICTIONARY) then
|
|
-- TEXT_IO.PUT(OUTPUT, EXT(DM.D_K) & ">");
|
|
-- HIT := TRUE;
|
|
-- end if;
|
|
--
|
|
--
|
|
-- if WORDS_MDEV(SHOW_DICTIONARY_LINE) then
|
|
-- if DICTIONARY_LINE_NUMBER > 0 then
|
|
-- TEXT_IO.PUT(OUTPUT, "("
|
|
-- & TRIM(INTEGER'IMAGE(DICTIONARY_LINE_NUMBER)) & ")");
|
|
-- HIT := TRUE;
|
|
-- end if;
|
|
-- end if;
|
|
--
|
|
--
|
|
--
|
|
-- PUT_DICTIONARY_FLAGS(DM, HIT);
|
|
--
|
|
--
|
|
-- if HIT then
|
|
-- TEXT_IO.NEW_LINE(OUTPUT);
|
|
-- end if;
|
|
--
|
|
-- --end if;
|
|
--
|
|
-- end PUT_DICTIONARY_FORM;
|
|
--
|
|
--
|
|
|
|
procedure PUT_FORM(SR : STEM_INFLECTION_RECORD;
|
|
DM : DICTIONARY_MNPC_RECORD) is
|
|
-- Handles PEARSE_CODES and DICTIONARY_FORM (which has FLAGS) and D_K
|
|
-- The Pearse 02 is handled in PUT_DICTIONARY_FORM
|
|
begin
|
|
if (SR.IR.QUAL.POFS not in XONS) and
|
|
(DM.D_K in GENERAL..UNIQUE) then
|
|
--DICTIONARY_ENTRY_IO.PUT(DM.DE);
|
|
PUT_DICTIONARY_FORM(OUTPUT, DM.D_K, DM.MNPC, DM.DE);
|
|
end if;
|
|
end PUT_FORM;
|
|
|
|
|
|
|
|
function TRIM_BAR(S : STRING) return STRING is
|
|
-- Takes vertical bars from begining of MEAN and TRIMs
|
|
begin
|
|
if S'LENGTH >3 and then S(S'FIRST..S'FIRST+3) = "||||" then
|
|
return TRIM(S(S'FIRST+4.. S'LAST));
|
|
elsif S'LENGTH >2 and then S(S'FIRST..S'FIRST+2) = "|||" then
|
|
return TRIM(S(S'FIRST+3.. S'LAST));
|
|
elsif S'LENGTH > 1 and then S(S'FIRST..S'FIRST+1) = "||" then
|
|
return TRIM(S(S'FIRST+2.. S'LAST));
|
|
elsif S(S'FIRST) = '|' then
|
|
return TRIM(S(S'FIRST+1.. S'LAST));
|
|
else
|
|
return TRIM(S);
|
|
end if;
|
|
end TRIM_BAR;
|
|
|
|
|
|
|
|
|
|
procedure PUT_MEANING(OUTPUT : TEXT_IO.FILE_TYPE;
|
|
RAW_MEANING : STRING) is
|
|
-- Handles the MM screen line limit and TRIM_BAR, then TRIMs
|
|
|
|
begin
|
|
|
|
TEXT_IO.PUT(OUTPUT, TRIM(HEAD(TRIM_BAR(RAW_MEANING), MM)));
|
|
end PUT_MEANING;
|
|
|
|
|
|
function CONSTRUCTED_MEANING(SR : STEM_INFLECTION_RECORD;
|
|
DM : DICTIONARY_MNPC_RECORD) return STRING is
|
|
-- Constructs the meaning for NUM from NUM.SORT and NUM_VALUE
|
|
S : STRING(1..MAX_MEANING_SIZE) := NULL_MEANING_TYPE;
|
|
N : INTEGER := 0;
|
|
begin
|
|
if DM.DE.PART.POFS = NUM then
|
|
N := DM.DE.PART.NUM.VALUE;
|
|
if SR.IR.QUAL.POFS = NUM then -- Normal parse
|
|
case SR.IR.QUAL.NUM.SORT is
|
|
when CARD =>
|
|
S := HEAD(INTEGER'IMAGE(N) & " - (CARD answers 'how many');", MAX_MEANING_SIZE);
|
|
when ORD =>
|
|
S := HEAD(INTEGER'IMAGE(N) & "th - (ORD, 'in series'); (a/the)" & INTEGER'IMAGE(N) &
|
|
"th (part) (fract w/pars?);", MAX_MEANING_SIZE);
|
|
when DIST =>
|
|
S := HEAD(INTEGER'IMAGE(N) & " each/apiece/times/fold/together/at a time - 'how many each'; by " &
|
|
INTEGER'IMAGE(N) & "s; ", MAX_MEANING_SIZE);
|
|
when ADVERB =>
|
|
S := HEAD(INTEGER'IMAGE(N) & " times, on" & INTEGER'IMAGE(N) &
|
|
" occasions - (ADVERB answers 'how often');", MAX_MEANING_SIZE);
|
|
when others =>
|
|
null;
|
|
end case;
|
|
else -- there is fix so POFS is not NUM
|
|
S := HEAD("Number " & INTEGER'IMAGE(N), MAX_MEANING_SIZE);
|
|
end if;
|
|
end if;
|
|
|
|
return S;
|
|
|
|
end CONSTRUCTED_MEANING;
|
|
|
|
|
|
|
|
|
|
procedure PUT_MEANING_LINE(SR : STEM_INFLECTION_RECORD;
|
|
DM : DICTIONARY_MNPC_RECORD) is
|
|
begin
|
|
if DM.D_K not in ADDONS..PPP then
|
|
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "03 ");
|
|
end if;
|
|
if DM.DE.PART.POFS = NUM and then DM.DE.PART.NUM.VALUE > 0 then
|
|
TEXT_IO.PUT_LINE(OUTPUT, CONSTRUCTED_MEANING(SR, DM)); -- Constructed MEANING
|
|
elsif DM.D_K = UNIQUE then
|
|
PUT_MEANING(OUTPUT, UNIQUES_DE(DM.MNPC).MEAN);
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
else
|
|
PUT_MEANING(OUTPUT, TRIM_BAR(DM.DE.MEAN));
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
end if;
|
|
else
|
|
if DM.D_K = RRR then
|
|
if RRR_MEANING /= NULL_MEANING_TYPE then
|
|
--PUT_DICTIONARY_FLAGS;
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "03 ");
|
|
end if;
|
|
PUT_MEANING(OUTPUT, RRR_MEANING); -- Roman Numeral
|
|
RRR_MEANING := NULL_MEANING_TYPE;
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
end if;
|
|
|
|
elsif DM.D_K = NNN then
|
|
if NNN_MEANING /= NULL_MEANING_TYPE then
|
|
--PUT_DICTIONARY_FLAGS;
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "03 ");
|
|
end if;
|
|
PUT_MEANING(OUTPUT, NNN_MEANING); -- Unknown Name
|
|
NNN_MEANING := NULL_MEANING_TYPE;
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
end if;
|
|
|
|
elsif DM.D_K = XXX then
|
|
if XXX_MEANING /= NULL_MEANING_TYPE then
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "06 ");
|
|
end if;
|
|
PUT_MEANING(OUTPUT, XXX_MEANING); -- TRICKS
|
|
XXX_MEANING := NULL_MEANING_TYPE;
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
end if;
|
|
|
|
elsif DM.D_K = YYY then
|
|
if YYY_MEANING /= NULL_MEANING_TYPE then
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "06 ");
|
|
end if;
|
|
PUT_MEANING(OUTPUT, YYY_MEANING); -- Syncope
|
|
YYY_MEANING := NULL_MEANING_TYPE;
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
end if;
|
|
|
|
elsif DM.D_K = PPP then
|
|
if PPP_MEANING /= NULL_MEANING_TYPE then
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "06 ");
|
|
end if;
|
|
PUT_MEANING(OUTPUT, PPP_MEANING); -- Compounds
|
|
PPP_MEANING := NULL_MEANING_TYPE;
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
end if;
|
|
|
|
|
|
elsif DM.D_K = ADDONS then
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "06 ");
|
|
end if;
|
|
PUT_MEANING(OUTPUT, MEANS(INTEGER(DM.MNPC)));
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
|
|
end if;
|
|
|
|
end if;
|
|
end PUT_MEANING_LINE;
|
|
|
|
|
|
|
|
|
|
begin
|
|
TRIMMED := FALSE;
|
|
|
|
-- Since this procedure weeds out possible parses, if it weeds out all
|
|
-- (or all of a class) it must fix up the rest of the parse array,
|
|
-- e.g., it must clean out dangling prefixes and suffixes
|
|
|
|
-- -- Just to find the words with long/complicated output at the processing level
|
|
-- -- This is done with the final PA_LAST, entering LIST_STEM, before SWEEP
|
|
-- if PA_LAST > PA_LAST_MAX then
|
|
-- PUT_STAT("$PA_LAST_MAX for RAW_WORD " & HEAD(RAW_WORD, 24) & " = " & INTEGER'IMAGE(PA_LAST));
|
|
-- PA_LAST_MAX := PA_LAST;
|
|
-- end if;
|
|
|
|
--TEXT_IO.PUT_LINE("PA on entering LIST_STEMS PA_LAST = " & INTEGER'IMAGE(PA_LAST));
|
|
--for I in 1..PA_LAST loop
|
|
--PARSE_RECORD_IO.PUT(PA(I)); TEXT_IO.NEW_LINE;
|
|
--end loop;
|
|
|
|
|
|
if (TEXT_IO.NAME(OUTPUT) =
|
|
TEXT_IO.NAME(TEXT_IO.STANDARD_OUTPUT)) then
|
|
MM := MAX_MEANING_PRINT_SIZE; -- to keep from overflowing screen line
|
|
-- or even adding blank line
|
|
else
|
|
MM := MAX_MEANING_SIZE;
|
|
|
|
end if;
|
|
|
|
------- The gimick of adding an ADV if there is only ADJ VOC ----
|
|
--TEXT_IO.PUT_LINE("About to do the ADJ -> ADV kludge");
|
|
for I in PA'FIRST..PA_LAST loop
|
|
if PA(I).IR.QUAL.POFS = ADV then
|
|
THERE_IS_AN_ADVERB := TRUE;
|
|
exit;
|
|
end if;
|
|
end loop;
|
|
|
|
--TEXT_IO.PUT_LINE("In the ADJ -> ADV kludge Checked to see if there is an ADV");
|
|
|
|
if ((not THERE_IS_AN_ADVERB) and (WORDS_MODE(DO_FIXES))) then
|
|
--TEXT_IO.PUT_LINE("In the ADJ -> ADV kludge There is no ADV");
|
|
for I in reverse PA'FIRST..PA_LAST loop
|
|
|
|
if PA(I).IR.QUAL.POFS = ADJ and then
|
|
(PA(I).IR.QUAL.ADJ = ((1, 1), VOC, S, M, POS) or
|
|
((PA(I).IR.QUAL.ADJ.CS = VOC) and
|
|
(PA(I).IR.QUAL.ADJ.NUMBER = S) and
|
|
(PA(I).IR.QUAL.ADJ.GENDER = M) and
|
|
(PA(I).IR.QUAL.ADJ.CO = SUPER))) then
|
|
|
|
J := I;
|
|
|
|
while J >= PA'FIRST loop --Back through other ADJ cases
|
|
if PA(J).IR.QUAL.POFS /= ADJ then
|
|
J2 := J; -- J2 is first (reverse) that is not ADJ
|
|
exit;
|
|
end if;
|
|
J := J - 1;
|
|
end loop;
|
|
while J >= PA'FIRST loop -- Sweep up associated fixes
|
|
if PA(J).IR.QUAL.POFS not in XONS then
|
|
J1 := J; -- J1 is first (reverse) that is not XONS
|
|
exit;
|
|
end if;
|
|
J := J - 1;
|
|
end loop;
|
|
|
|
|
|
|
|
for J in J1+1..J2 loop
|
|
PA(PA_LAST+J-J1+1) := PA(J);
|
|
end loop;
|
|
--TEXT_IO.PUT_LINE("In the ADJ -> ADV kludge Ready to add PA for ADV");
|
|
PA_LAST := PA_LAST + J2 - J1 + 1;
|
|
PA(PA_LAST) := PA(J2+1);
|
|
--TEXT_IO.PUT_LINE("In the ADJ -> ADV kludge Adding SUFFIX E ADV");
|
|
PA(PA_LAST) := ("e ",
|
|
((SUFFIX, NULL_SUFFIX_RECORD), 0, NULL_ENDING_RECORD, X, B),
|
|
PPP, NULL_MNPC);
|
|
--PARSE_RECORD_IO.PUT(PA(PA_LAST)); TEXT_IO.NEW_LINE;
|
|
PA_LAST := PA_LAST + 1;
|
|
if PA(J2+1).IR.QUAL.ADJ.CO = POS then
|
|
--TEXT_IO.PUT_LINE("In the ADJ -> ADV kludge Adding POS for ADV");
|
|
PA(PA_LAST) := (PA(J2+1).STEM,
|
|
((POFS => ADV, ADV => (CO => PA(J2+1).IR.QUAL.ADJ.CO)),
|
|
KEY => 0, ENDING => (1, "e "), AGE => X, FREQ => B),
|
|
PA(J2+1).D_K,
|
|
PA(J2+1).MNPC);
|
|
--PARSE_RECORD_IO.PUT(PA(PA_LAST)); TEXT_IO.NEW_LINE;
|
|
PPP_MEANING :=
|
|
HEAD("-ly; -ily; Converting ADJ to ADV",
|
|
MAX_MEANING_SIZE);
|
|
|
|
elsif PA(J2+1).IR.QUAL.ADJ.CO = SUPER then
|
|
PA(PA_LAST) := (PA(J2+1).STEM,
|
|
((POFS => ADV, ADV => (CO => PA(J2+1).IR.QUAL.ADJ.CO)),
|
|
KEY => 0, ENDING => (2, "me "), AGE => X, FREQ => B),
|
|
PA(J2+1).D_K,
|
|
PA(J2+1).MNPC);
|
|
PPP_MEANING :=
|
|
HEAD("-estly; -estily; most -ly, very -ly Converting ADJ to ADV",
|
|
MAX_MEANING_SIZE);
|
|
end if;
|
|
--TEXT_IO.PUT_LINE("In the ADJ -> ADV kludge Done adding PA for ADV");
|
|
end if; -- PA(I).IR.QUAL.POFS = ADJ
|
|
|
|
end loop;
|
|
|
|
end if; -- not THERE_IS_AN_ADVERB
|
|
-- TEXT_IO.PUT_LINE("In the ADJ -> ADV kludge FINISHED");
|
|
|
|
LIST_SWEEP(PA(1..PA_LAST), PA_LAST);
|
|
|
|
|
|
--TEXT_IO.PUT_LINE("PA after leaving LIST_SWEEP PA_LAST = " & INTEGER'IMAGE(PA_LAST));
|
|
--for I in 1..PA_LAST loop
|
|
--PARSE_RECORD_IO.PUT(PA(I)); TEXT_IO.NEW_LINE;
|
|
--end loop;
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- -- Does STATS
|
|
--
|
|
--TEXT_IO.PUT_LINE("Before STATING FIXES");
|
|
if WORDS_MDEV(WRITE_STATISTICS_FILE) then -- Omit rest of output
|
|
|
|
for I in 1..PA_LAST loop -- Just to PUT_STAT
|
|
if (PA(I).D_K = ADDONS) then
|
|
if PA(I).IR.QUAL.POFS = PREFIX then
|
|
PUT_STAT("ADDON PREFIX at "
|
|
& HEAD(INTEGER'IMAGE(LINE_NUMBER), 8) & HEAD(INTEGER'IMAGE(WORD_NUMBER), 4)
|
|
& " " & HEAD(W, 20) & " " & PA(I).STEM & " " & INTEGER'IMAGE(INTEGER(PA(I).MNPC)));
|
|
elsif PA(I).IR.QUAL.POFS = SUFFIX then
|
|
PUT_STAT("ADDON SUFFIX at "
|
|
& HEAD(INTEGER'IMAGE(LINE_NUMBER), 8) & HEAD(INTEGER'IMAGE(WORD_NUMBER), 4)
|
|
& " " & HEAD(W, 20) & " " & PA(I).STEM & " " & INTEGER'IMAGE(INTEGER(PA(I).MNPC)));
|
|
elsif PA(I).IR.QUAL.POFS = TACKON then
|
|
PUT_STAT("ADDON TACKON at "
|
|
& HEAD(INTEGER'IMAGE(LINE_NUMBER), 8) & HEAD(INTEGER'IMAGE(WORD_NUMBER), 4)
|
|
& " " & HEAD(W, 20) & " " & PA(I).STEM & " " & INTEGER'IMAGE(INTEGER(PA(I).MNPC)));
|
|
end if;
|
|
end if;
|
|
end loop;
|
|
|
|
|
|
---- -- Just to find the words with long/complicated output at the LIST level
|
|
---- -- This is done with the final PA_LAST, after SWEEP
|
|
---- if PA_LAST > FINAL_PA_LAST_MAX then
|
|
---- PUT_STAT("$FINAL_PA_LAST_MAX for RAW_WORD " & HEAD(RAW_WORD, 24) & " = " & INTEGER'IMAGE(PA_LAST));
|
|
---- FINAL_PA_LAST_MAX := PA_LAST;
|
|
---- end if;
|
|
|
|
end if;
|
|
|
|
--TEXT_IO.PUT_LINE("After STATING FIXES");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- Convert from PARSE_RECORDs to DICTIONARY_MNPC_RECORD and STEM_INFLECTION_RECORD
|
|
--TEXT_IO.PUT_LINE("Doing arrays in LIST_STEMS PA_LAST = " &
|
|
-- INTEGER'IMAGE(PA_LAST));
|
|
I := 1; -- I cycles on PA
|
|
J := 0; -- J indexes the number of DMA arrays -- Initialize
|
|
SRAA := NULL_SRAA;
|
|
DMA := NULL_DMA;
|
|
CYCLE_OVER_PA:
|
|
while I <= PA_LAST loop -- I cycles over full PA array
|
|
--TEXT_IO.PUT_LINE("Starting loop for I I = " & INTEGER'IMAGE(I));
|
|
ODM := NULL_DICTIONARY_MNPC_RECORD;
|
|
|
|
if PA(I).D_K = UNIQUE then
|
|
J := J + 1;
|
|
SRAA(J)(1) := (PA(I).STEM, PA(I).IR);
|
|
--TEXT_IO.PUT_LINE("UNIQUE I = " & INTEGER'IMAGE(I) & " J = " & INTEGER'IMAGE(J));
|
|
DM := NULL_DICTIONARY_MNPC_RECORD;
|
|
DM.D_K := UNIQUE;
|
|
DM.MNPC := PA(I).MNPC;
|
|
DM.DE := UNIQUES_DE(PA(I).MNPC);
|
|
DMA(J) := DM;
|
|
I := I + 1;
|
|
else
|
|
|
|
case PA(I).IR.QUAL.POFS is
|
|
|
|
when N =>
|
|
OSRA := NULL_SRA;
|
|
ODMA := NULL_DMA;
|
|
--ODM := NULL_DICTIONARY_MNPC_RECORD;
|
|
--DM := NULL_DICTIONARY_MNPC_RECORD;
|
|
while PA(I).IR.QUAL.POFS = N and
|
|
I <= PA_LAST loop
|
|
--TEXT_IO.PUT_LINE("Starting loop for N I = " & INTEGER'IMAGE(I) & " K = " & INTEGER'IMAGE(K));
|
|
if PA(I).MNPC /= ODM.MNPC then -- Encountering new MNPC
|
|
OSRA := SRA;
|
|
K := 1; -- K indexes within the MNPCA array -- Initialize
|
|
--TEXT_IO.PUT_LINE("Starting IRA for N I = " & INTEGER'IMAGE(I) & " K = " & INTEGER'IMAGE(K));
|
|
J := J + 1; -- J indexes the number of MNPCA arrays - Next MNPCA
|
|
--TEXT_IO.PUT_LINE("Shifting J for N I = " & INTEGER'IMAGE(I) & " J = " & INTEGER'IMAGE(J));
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
DICT_IO.SET_INDEX(DICT_FILE(PA(I).D_K), PA(I).MNPC);
|
|
DICT_IO.READ(DICT_FILE(PA(I).D_K), DEA);
|
|
DM := (PA(I).D_K, PA(I).MNPC, DEA);
|
|
DMA(J) := DM;
|
|
ODM := DM;
|
|
else
|
|
K := K + 1; -- K indexes within the MNPCA array - Next MNPC
|
|
--TEXT_IO.PUT_LINE("Continuing IRA for N I = " & INTEGER'IMAGE(I) & " K = " & INTEGER'IMAGE(K)
|
|
-- & " J = " & INTEGER'IMAGE(J));
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
end if;
|
|
|
|
I := I + 1; -- I cycles over full PA array
|
|
end loop;
|
|
|
|
when PRON =>
|
|
OSRA := NULL_SRA;
|
|
ODMA := NULL_DMA;
|
|
--ODM := NULL_DICTIONARY_MNPC_RECORD;
|
|
--DM := NULL_DICTIONARY_MNPC_RECORD;
|
|
while PA(I).IR.QUAL.POFS = PRON and
|
|
I <= PA_LAST loop
|
|
if PA(I).MNPC /= ODM.MNPC then -- Encountering new MNPC
|
|
OSRA := SRA;
|
|
K := 1; -- K indexes within the MNPCA array -- Initialize
|
|
J := J + 1; -- J indexes the number of MNPCA arrays - Next MNPCA
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
DICT_IO.SET_INDEX(DICT_FILE(PA(I).D_K), PA(I).MNPC);
|
|
DICT_IO.READ(DICT_FILE(PA(I).D_K), DEA);
|
|
DM := (PA(I).D_K, PA(I).MNPC, DEA);
|
|
DMA(J) := DM;
|
|
ODM := DM;
|
|
else
|
|
K := K + 1; -- K indexes within the MNPCA array - Next MNPC
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
end if;
|
|
|
|
I := I + 1; -- I cycles over full PA array
|
|
end loop;
|
|
|
|
when PACK =>
|
|
OSRA := NULL_SRA;
|
|
ODMA := NULL_DMA;
|
|
--ODM := NULL_DICTIONARY_MNPC_RECORD;
|
|
--DM := NULL_DICTIONARY_MNPC_RECORD;
|
|
while PA(I).IR.QUAL.POFS = PACK and
|
|
I <= PA_LAST loop
|
|
if PA(I).MNPC /= ODM.MNPC then -- Encountering new MNPC
|
|
OSRA := SRA;
|
|
K := 1; -- K indexes within the MNPCA array -- Initialize
|
|
J := J + 1; -- J indexes the number of MNPCA arrays - Next MNPCA
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
DICT_IO.SET_INDEX(DICT_FILE(PA(I).D_K), PA(I).MNPC);
|
|
DICT_IO.READ(DICT_FILE(PA(I).D_K), DEA);
|
|
DM := (PA(I).D_K, PA(I).MNPC, DEA);
|
|
DMA(J) := DM;
|
|
ODM := DM;
|
|
else
|
|
K := K + 1; -- K indexes within the MNPCA array - Next MNPC
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
end if;
|
|
|
|
I := I + 1; -- I cycles over full PA array
|
|
end loop;
|
|
|
|
when ADJ =>
|
|
OSRA := NULL_SRA;
|
|
ODMA := NULL_DMA;
|
|
--ODM := NULL_DICTIONARY_MNPC_RECORD;
|
|
--DM := NULL_DICTIONARY_MNPC_RECORD;
|
|
while PA(I).IR.QUAL.POFS = ADJ and
|
|
I <= PA_LAST loop
|
|
--TEXT_IO.PUT_LINE("SRAA - ADJ");
|
|
if PA(I).MNPC /= ODM.MNPC then -- Encountering new MNPC
|
|
OSRA := SRA;
|
|
K := 1; -- K indexes within the MNPCA array -- Initialize
|
|
J := J + 1; -- J indexes the number of MNPCA arrays - Next MNPCA
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
DICT_IO.SET_INDEX(DICT_FILE(PA(I).D_K), PA(I).MNPC);
|
|
DICT_IO.READ(DICT_FILE(PA(I).D_K), DEA);
|
|
DM := (PA(I).D_K, PA(I).MNPC, DEA);
|
|
DMA(J) := DM;
|
|
ODM := DM;
|
|
else
|
|
K := K + 1; -- K indexes within the MNPCA array - Next MNPC
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
end if;
|
|
--TEXT_IO.PUT_LINE("SRAA + ADJ");
|
|
I := I + 1; -- I cycles over full PA array
|
|
end loop;
|
|
|
|
when NUM =>
|
|
OSRA := NULL_SRA;
|
|
ODMA := NULL_DMA;
|
|
--ODM := NULL_DICTIONARY_MNPC_RECORD;
|
|
--DM := NULL_DICTIONARY_MNPC_RECORD;
|
|
while PA(I).IR.QUAL.POFS = NUM and
|
|
I <= PA_LAST loop
|
|
if (PA(I).D_K = RRR) then -- Roman numeral
|
|
OSRA := SRA;
|
|
K := 1; -- K indexes within the MNPCA array -- Initialize
|
|
J := J + 1; -- J indexes the number of MNPCA arrays - Next MNPCA
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
--DICT_IO.SET_INDEX(DICT_FILE(PA(I).D_K), PA(I).MNPC);
|
|
--DICT_IO.READ(DICT_FILE(PA(I).D_K), DEA);
|
|
|
|
|
|
|
|
|
|
DEA := NULL_DICTIONARY_ENTRY;
|
|
DM := (PA(I).D_K, PA(I).MNPC, DEA);
|
|
DMA(J) := DM;
|
|
ODM := DM;
|
|
elsif (PA(I).MNPC /= ODM.MNPC) then -- Encountering new MNPC
|
|
OSRA := SRA;
|
|
K := 1; -- K indexes within the MNPCA array -- Initialize
|
|
J := J + 1; -- J indexes the number of MNPCA arrays - Next MNPCA
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
DICT_IO.SET_INDEX(DICT_FILE(PA(I).D_K), PA(I).MNPC);
|
|
DICT_IO.READ(DICT_FILE(PA(I).D_K), DEA);
|
|
DM := (PA(I).D_K, PA(I).MNPC, DEA);
|
|
DMA(J) := DM;
|
|
ODM := DM;
|
|
else
|
|
K := K + 1; -- K indexes within the MNPCA array - Next MNPC
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
end if;
|
|
|
|
I := I + 1; -- I cycles over full PA array
|
|
end loop;
|
|
|
|
|
|
when V | VPAR | SUPINE =>
|
|
OSRA := NULL_SRA;
|
|
ODMA := NULL_DMA;
|
|
--ODM := NULL_DICTIONARY_MNPC_RECORD;
|
|
--DM := NULL_DICTIONARY_MNPC_RECORD;
|
|
while (PA(I).IR.QUAL.POFS = V or
|
|
PA(I).IR.QUAL.POFS = VPAR or
|
|
PA(I).IR.QUAL.POFS = SUPINE) and
|
|
I <= PA_LAST loop
|
|
--TEXT_IO.PUT_LINE("Starting loop for VPAR I = " & INTEGER'IMAGE(I) & " K = " & INTEGER'IMAGE(K));
|
|
if (PA(I).MNPC /= ODM.MNPC) and (PA(I).D_K /= PPP) then -- Encountering new MNPC
|
|
OSRA := SRA; -- But not for compound
|
|
K := 1; -- K indexes within the MNPCA array -- Initialize
|
|
--TEXT_IO.PUT_LINE("Starting IRA for VPAR I = " & INTEGER'IMAGE(I) & " K = " & INTEGER'IMAGE(K));
|
|
J := J + 1; -- J indexes the number of MNPCA arrays - Next MNPCA
|
|
--TEXT_IO.PUT_LINE("Shifting J for VPAR I = " & INTEGER'IMAGE(I) & " J = " & INTEGER'IMAGE(J));
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
if PA(I).D_K /= PPP then
|
|
DICT_IO.SET_INDEX(DICT_FILE(PA(I).D_K), PA(I).MNPC);
|
|
DICT_IO.READ(DICT_FILE(PA(I).D_K), DEA);
|
|
end if; -- use previous DEA
|
|
DM := (PA(I).D_K, PA(I).MNPC, DEA);
|
|
DMA(J) := DM;
|
|
ODM := DM;
|
|
else
|
|
K := K + 1; -- K indexes within the MNPCA array - Next MNPC
|
|
--TEXT_IO.PUT_LINE("Continuing IRA for VPAR I = " & INTEGER'IMAGE(I) & " K = " & INTEGER'IMAGE(K)
|
|
-- & " J = " & INTEGER'IMAGE(J));
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
end if;
|
|
|
|
I := I + 1; -- I cycles over full PA array
|
|
end loop;
|
|
|
|
|
|
when others =>
|
|
--TEXT_IO.PUT_LINE("Others");
|
|
OSRA := NULL_SRA;
|
|
ODMA := NULL_DMA;
|
|
--ODM := NULL_DICTIONARY_MNPC_RECORD;
|
|
--DM := NULL_DICTIONARY_MNPC_RECORD;
|
|
while I <= PA_LAST loop
|
|
--TEXT_IO.PUT_LINE("Starting loop for OTHER I = " & INTEGER'IMAGE(I) & " K = " & INTEGER'IMAGE(K));
|
|
if (ODM.D_K /= PA(I).D_K) or
|
|
(ODM.MNPC /= PA(I).MNPC) then -- Encountering new single (K only 1)
|
|
OSRA := SRA;
|
|
K := 1; -- K indexes within the MNPCA array -- Initialize
|
|
--TEXT_IO.PUT_LINE("Starting IRA for OTHER I = " & INTEGER'IMAGE(I) & " K = " & INTEGER'IMAGE(K));
|
|
J := J + 1; -- J indexes the number of MNPCA arrays - Next MNPCA
|
|
--TEXT_IO.PUT_LINE("Shifting J for OTHER I = " & INTEGER'IMAGE(I) & " J = " & INTEGER'IMAGE(J));
|
|
SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
if PA(I).MNPC /= NULL_MNPC then
|
|
if PA(I).D_K = ADDONS then
|
|
DEA := NULL_DICTIONARY_ENTRY; -- Fix for ADDONS in MEANS, not DICT_IO
|
|
else
|
|
DICT_IO.SET_INDEX(DICT_FILE(PA(I).D_K), PA(I).MNPC);
|
|
DICT_IO.READ(DICT_FILE(PA(I).D_K), DEA);
|
|
end if;
|
|
else -- Has no dictionary to read
|
|
DEA:= NULL_DICTIONARY_ENTRY;
|
|
end if;
|
|
DM := (PA(I).D_K, PA(I).MNPC, DEA);
|
|
DMA(J) := DM;
|
|
ODM := DM;
|
|
--else
|
|
-- K := K + 1; -- K indexes within the MNPCA array - Next MNPC
|
|
-- SRAA(J)(K) := (PA(I).STEM, PA(I).IR);
|
|
end if;
|
|
|
|
I := I + 1; -- I cycles over full PA array
|
|
exit; -- Since Other is only one, don't loop
|
|
end loop;
|
|
|
|
end case;
|
|
|
|
end if;
|
|
-- -- This just for developer test, will be commented out
|
|
-- if K > SRA_MAX then
|
|
-- SRA_MAX := K;
|
|
--PUT_STAT("*SRA_MAX for RAW_WORD " & HEAD(RAW_WORD, 26) & " = " & INTEGER'IMAGE(SRA_MAX));
|
|
-- end if;
|
|
-- if J > DMA_MAX then
|
|
-- DMA_MAX := J;
|
|
--PUT_STAT("*DMA_MAX for RAW_WORD " & HEAD(RAW_WORD, 26) & " = " & INTEGER'IMAGE(DMA_MAX));
|
|
-- end if;
|
|
|
|
end loop CYCLE_OVER_PA;
|
|
|
|
--TEXT_IO.PUT_LINE("Made QA");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--TEXT_IO.PUT_LINE("QA ARRAYS FFFFFF ======================================");
|
|
-- for J in 1..DICTIONARY_MNPC_ARRAY_SIZE loop
|
|
-- if DMA(J) /= NULL_DICTIONARY_MNPC_RECORD then
|
|
-- TEXT_IO.PUT(INTEGER'IMAGE(J) & " ");
|
|
-- DICTIONARY_KIND_IO.PUT(DMA(J).D_K); TEXT_IO.PUT(" ");
|
|
-- MNPC_IO.PUT(DMA(J).MNPC); TEXT_IO.NEW_LINE;
|
|
-- end if;
|
|
-- end loop;
|
|
-- for J in 1..STEM_INFLECTION_ARRAY_ARRAY_SIZE loop
|
|
-- for K in 1..STEM_INFLECTION_ARRAY_SIZE loop
|
|
-- if SRAA(J)(K) /= NULL_STEM_INFLECTION_RECORD then
|
|
-- TEXT_IO.PUT(INTEGER'IMAGE(J) & " " & INTEGER'IMAGE(K) & " ");
|
|
-- QUALITY_RECORD_IO.PUT(SRAA(J)(K).IR.QUAL); TEXT_IO.NEW_LINE;
|
|
-- end if;
|
|
-- end loop;
|
|
-- end loop;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- Sets + if capitalized
|
|
-- Strangely enough, it may enter LIST_STEMS with PA_LAST /= 0
|
|
-- but be weeded and end up with no parse after LIST_SWEEP - PA_LAST = 0
|
|
if PA_LAST = 0 then -- WORD failed
|
|
--???? (DMA(1).D_K in ADDONS..YYY and then TRIM(DMA(1).DE.STEMS(1)) /= "que") then -- or used FIXES/TRICKS
|
|
if WORDS_MODE(IGNORE_UNKNOWN_NAMES) and CAPITALIZED then
|
|
NNN_MEANING := HEAD(
|
|
"Assume this is capitalized proper name/abbr, under MODE IGNORE_UNKNOWN_NAME ",
|
|
MAX_MEANING_SIZE);
|
|
PA(1) := (HEAD(RAW_WORD, MAX_STEM_SIZE),
|
|
((N, ((0, 0), X, X, X)), 0, NULL_ENDING_RECORD, X, X),
|
|
NNN, NULL_MNPC);
|
|
PA_LAST := 1; -- So LIST_NEIGHBORHOOD will not be called
|
|
SRAA := NULL_SRAA;
|
|
DMA := NULL_DMA;
|
|
SRAA(1)(1) := (PA(1).STEM, PA(1).IR);
|
|
DMA(1) := (NNN, 0, NULL_DICTIONARY_ENTRY);
|
|
elsif WORDS_MODE(IGNORE_UNKNOWN_CAPS) and ALL_CAPS then
|
|
NNN_MEANING := HEAD(
|
|
"Assume this is capitalized proper name/abbr, under MODE IGNORE_UNKNOWN_CAPS ",
|
|
MAX_MEANING_SIZE);
|
|
PA(1) := (HEAD(RAW_WORD, MAX_STEM_SIZE),
|
|
((N, ((0, 0), X, X, X)), 0, NULL_ENDING_RECORD, X, X),
|
|
NNN, NULL_MNPC);
|
|
PA_LAST := 1;
|
|
SRAA := NULL_SRAA;
|
|
DMA := NULL_DMA;
|
|
SRAA(1)(1) := (PA(1).STEM, PA(1).IR);
|
|
DMA(1) := (NNN, 0, NULL_DICTIONARY_ENTRY);
|
|
end if;
|
|
end if;
|
|
|
|
|
|
-- -- Does STATS
|
|
--
|
|
----TEXT_IO.PUT_LINE("Before STATING FIXES");
|
|
-- if WORDS_MDEV(WRITE_STATISTICS_FILE) then -- Omit rest of output
|
|
----
|
|
---- for I in 1..PA_LAST loop -- Just to PUT_STAT
|
|
---- if (PA(I).D_K = ADDONS) then
|
|
---- if PA(I).IR.QUAL.POFS = PREFIX then
|
|
---- PUT_STAT("ADDON PREFIX at "
|
|
---- & HEAD(INTEGER'IMAGE(LINE_NUMBER), 8) & HEAD(INTEGER'IMAGE(WORD_NUMBER), 4)
|
|
---- & " " & HEAD(W, 20) & " " & PA(I).STEM);
|
|
---- elsif PA(I).IR.QUAL.POFS = SUFFIX then
|
|
---- PUT_STAT("ADDON SUFFIX at "
|
|
---- & HEAD(INTEGER'IMAGE(LINE_NUMBER), 8) & HEAD(INTEGER'IMAGE(WORD_NUMBER), 4)
|
|
---- & " " & HEAD(W, 20) & " " & PA(I).STEM);
|
|
---- elsif PA(I).IR.QUAL.POFS = TACKON then
|
|
---- PUT_STAT("ADDON TACKON at "
|
|
---- & HEAD(INTEGER'IMAGE(LINE_NUMBER), 8) & HEAD(INTEGER'IMAGE(WORD_NUMBER), 4)
|
|
---- & " " & HEAD(W, 20) & " " & PA(I).STEM);
|
|
---- end if;
|
|
---- end if;
|
|
---- end loop;
|
|
--
|
|
--
|
|
---- -- Just to find the words with long/complicated output at the LIST level
|
|
---- -- This is done with the final PA_LAST, after SWEEP
|
|
-- if PA_LAST > FINAL_PA_LAST_MAX then
|
|
-- PUT_STAT("$FINAL_PA_LAST_MAX for RAW_WORD " & HEAD(RAW_WORD, 24) & " = " & INTEGER'IMAGE(PA_LAST));
|
|
-- FINAL_PA_LAST_MAX := PA_LAST;
|
|
-- end if;
|
|
--
|
|
-- end if;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if PA_LAST = 0 then
|
|
|
|
if WORDS_MODE(WRITE_OUTPUT_TO_FILE) then
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(OUTPUT, "04 ");
|
|
end if;
|
|
TEXT_IO.PUT(OUTPUT, RAW_WORD);
|
|
TEXT_IO.SET_COL(OUTPUT, 30);
|
|
INFLECTIONS_PACKAGE.INTEGER_IO.PUT(OUTPUT, LINE_NUMBER, 7);
|
|
INFLECTIONS_PACKAGE.INTEGER_IO.PUT(OUTPUT, WORD_NUMBER, 7);
|
|
TEXT_IO.PUT_LINE(OUTPUT, " ======== UNKNOWN ");
|
|
--TEXT_IO.NEW_LINE(OUTPUT);
|
|
else -- Just screen output
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT("04 ");
|
|
end if;
|
|
TEXT_IO.PUT(RAW_WORD);
|
|
TEXT_IO.SET_COL(30);
|
|
TEXT_IO.PUT_LINE(" ======== UNKNOWN ");
|
|
--TEXT_IO.NEW_LINE;
|
|
end if;
|
|
|
|
if WORDS_MODE(WRITE_UNKNOWNS_TO_FILE) then
|
|
if WORDS_MDEV(INCLUDE_UNKNOWN_CONTEXT) or
|
|
WORDS_MDEV(DO_ONLY_INITIAL_WORD) then
|
|
TEXT_IO.PUT_LINE(INPUT_LINE);
|
|
TEXT_IO.PUT_LINE(UNKNOWNS, INPUT_LINE);
|
|
end if;
|
|
if WORDS_MDEV(DO_PEARSE_CODES) then
|
|
TEXT_IO.PUT(UNKNOWNS, "04 ");
|
|
end if;
|
|
TEXT_IO.PUT(UNKNOWNS, RAW_WORD);
|
|
TEXT_IO.SET_COL(UNKNOWNS, 30);
|
|
INFLECTIONS_PACKAGE.INTEGER_IO.PUT(UNKNOWNS, LINE_NUMBER, 7);
|
|
INFLECTIONS_PACKAGE.INTEGER_IO.PUT(UNKNOWNS, WORD_NUMBER, 7);
|
|
TEXT_IO.PUT_LINE(UNKNOWNS, " ======== UNKNOWN ");
|
|
end if;
|
|
end if;
|
|
|
|
if PA_LAST = 0 then
|
|
if WORDS_MODE(DO_STEMS_FOR_UNKNOWN) then
|
|
if WORDS_MODE(WRITE_OUTPUT_TO_FILE) and then
|
|
not WORDS_MODE(WRITE_UNKNOWNS_TO_FILE) then
|
|
LIST_NEIGHBORHOOD(OUTPUT, RAW_WORD);
|
|
elsif WORDS_MODE(WRITE_OUTPUT_TO_FILE) and then
|
|
WORDS_MODE(WRITE_UNKNOWNS_TO_FILE) then
|
|
LIST_NEIGHBORHOOD(OUTPUT, RAW_WORD);
|
|
LIST_NEIGHBORHOOD(UNKNOWNS, RAW_WORD);
|
|
elsif (NAME(CURRENT_INPUT) = NAME(STANDARD_INPUT)) then
|
|
LIST_NEIGHBORHOOD(OUTPUT, RAW_WORD);
|
|
end if;
|
|
end if;
|
|
end if;
|
|
|
|
if PA_LAST = 0 then
|
|
if WORDS_MDEV(UPDATE_LOCAL_DICTIONARY) and -- Don't if reading from file
|
|
(NAME(CURRENT_INPUT) = NAME(STANDARD_INPUT)) then
|
|
UPDATE_LOCAL_DICTIONARY_FILE;
|
|
WORD(RAW_WORD, PA, PA_LAST); -- Circular if you dont update!!!!!
|
|
end if;
|
|
end if;
|
|
|
|
|
|
|
|
|
|
|
|
-- Exit if UNKNOWNS ONLY (but had to do STATS above)
|
|
if WORDS_MODE(DO_UNKNOWNS_ONLY) then -- Omit rest of output
|
|
return;
|
|
end if;
|
|
|
|
|
|
--TEXT_IO.PUT_LINE("PUTting INFLECTIONS");
|
|
J := 1;
|
|
OSRA := NULL_SRA;
|
|
OUTPUT_LOOP:
|
|
while DMA(J) /= NULL_DICTIONARY_MNPC_RECORD loop
|
|
----!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
-- if (J > 1) and then ((DMA(J-1).D_K = PPP) or --!!!!!!!!!!!!!!!!!!!!!!!!
|
|
-- (DICTIONARY_FORM(DMA(J).DE) = DICTIONARY_FORM(DMA(J-1).DE))) then --!!!!!!!!!!!!!!!!!!!!!!!!
|
|
-- null; --!!!!!!ND mod!!!!!!!!!!!!
|
|
-- else --!!!!!!!!!!!!!!!!!!!!!!!!
|
|
-- NEW_LINE(OUTPUT); --!!!!!!!!!!!!!!!!!!!!!!!!
|
|
-- end if; --!!!!!!!!!!!!!!!!!!!!!!!!
|
|
-- --!!!!!!!!!!!!!!!!!!!!!!!!
|
|
-- --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
if SRAA(J) /= OSRA then -- Skips one identical SRA
|
|
-- no matter what comes next
|
|
|
|
|
|
|
|
PUT_INFLECTION_ARRAY_J:
|
|
for K in SRAA(J)'RANGE loop
|
|
exit when SRAA(J)(K) = NULL_STEM_INFLECTION_RECORD;
|
|
|
|
|
|
PUT_INFLECTION(SRAA(J)(K), DMA(J));
|
|
if SRAA(J)(K).STEM(1..3) = "PPL" then
|
|
TEXT_IO.PUT_LINE(OUTPUT, HEAD(PPP_MEANING, MM));
|
|
end if;
|
|
end loop PUT_INFLECTION_ARRAY_J;
|
|
OSRA := SRAA(J);
|
|
end if;
|
|
|
|
--TEXT_IO.PUT_LINE("PUTting FORM");
|
|
PUTTING_FORM:
|
|
begin
|
|
if J = 1 or else
|
|
DICTIONARY_FORM(DMA(J).DE) /= DICTIONARY_FORM(DMA(J-1).DE) then
|
|
-- Put at first chance, skip duplicates
|
|
PUT_FORM(SRAA(J)(1), DMA(J));
|
|
end if;
|
|
end PUTTING_FORM;
|
|
|
|
|
|
--TEXT_IO.PUT_LINE("PUTting MEANING");
|
|
PUTTING_MEANING:
|
|
begin
|
|
if (DMA(J).D_K in GENERAL..UNIQUE) then
|
|
if (DMA(J).DE.MEAN /= DMA(J+1).DE.MEAN) then
|
|
-- This if handles simple multiple MEAN with same IR and FORM
|
|
-- by anticipating duplicates and waiting until change
|
|
PUT_MEANING_LINE(SRAA(J)(1), DMA(J));
|
|
end if;
|
|
else
|
|
PUT_MEANING_LINE(SRAA(J)(1), DMA(J));
|
|
end if;
|
|
end PUTTING_MEANING;
|
|
|
|
|
|
|
|
DO_PAUSE:
|
|
begin
|
|
if I = PA_LAST then
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
elsif (INTEGER(TEXT_IO.LINE(OUTPUT)) >
|
|
SCROLL_LINE_NUMBER + OUTPUT_SCREEN_SIZE) then
|
|
PAUSE(OUTPUT);
|
|
SCROLL_LINE_NUMBER := INTEGER(TEXT_IO.LINE(OUTPUT));
|
|
end if;
|
|
end DO_PAUSE;
|
|
--TEXT_IO.PUT_LINE("End of OUTPUT_LOOP with J = " & INTEGER'IMAGE(J));
|
|
|
|
|
|
J := J + 1;
|
|
end loop OUTPUT_LOOP;
|
|
--TEXT_IO.PUT_LINE("Finished OUTPUT_LOOP");
|
|
|
|
if TRIMMED then
|
|
PUT(OUTPUT, '*');
|
|
end if;
|
|
TEXT_IO.NEW_LINE(OUTPUT);
|
|
|
|
|
|
exception
|
|
when others =>
|
|
TEXT_IO.PUT_LINE("Unexpected exception in LIST_STEMS processing " & RAW_WORD);
|
|
PUT_STAT("EXCEPTION LS at "
|
|
& HEAD(INTEGER'IMAGE(LINE_NUMBER), 8) & HEAD(INTEGER'IMAGE(WORD_NUMBER), 4)
|
|
& " " & HEAD(W, 20) & " " & PA(I).STEM);
|
|
end LIST_STEMS;
|
|
|
|
|
|
|
|
procedure LIST_ENTRY(OUTPUT : TEXT_IO.FILE_TYPE;
|
|
D_K : DICTIONARY_KIND;
|
|
MN : DICT_IO.COUNT) is
|
|
DE : DICTIONARY_ENTRY;
|
|
begin
|
|
DICT_IO.READ(DICT_FILE(D_K), DE, MN);
|
|
TEXT_IO.PUT(OUTPUT, "=> ");
|
|
--TEXT_IO.PUT_LINE(OUTPUT, DICTIONARY_FORM(DE));
|
|
PUT_DICTIONARY_FORM(OUTPUT, D_K, MN, DE);
|
|
TEXT_IO.PUT_LINE(OUTPUT,
|
|
TRIM(HEAD(DE.MEAN, MM))); -- so it wont line wrap/put CR
|
|
|
|
end LIST_ENTRY;
|
|
|
|
|
|
|
|
|
|
|
|
procedure UNKNOWN_SEARCH(UNKNOWN : in STRING;
|
|
UNKNOWN_COUNT : out DICT_IO.COUNT) is
|
|
|
|
use STEM_IO;
|
|
|
|
D_K : constant DICTIONARY_KIND := GENERAL;
|
|
J, J1, J2, JJ : STEM_IO.COUNT := 0;
|
|
|
|
INDEX_ON : constant STRING := UNKNOWN;
|
|
INDEX_FIRST, INDEX_LAST : STEM_IO.COUNT := 0;
|
|
DS : DICTIONARY_STEM;
|
|
FIRST_TRY, SECOND_TRY : BOOLEAN := TRUE;
|
|
|
|
|
|
function FIRST_TWO(W : STRING) return STRING is
|
|
-- 'v' could be represented by 'u', like the new Oxford Latin Dictionary
|
|
-- Fixes the first two letters of a word/stem which can be done right
|
|
S : constant STRING := LOWER_CASE(W);
|
|
SS : STRING(W'RANGE) := W;
|
|
|
|
function UI(C : CHARACTER) return CHARACTER is
|
|
begin
|
|
if (C = 'v') then
|
|
return 'u';
|
|
elsif (C = 'V') then
|
|
return 'U';
|
|
elsif (C = 'j') then
|
|
return 'i';
|
|
elsif (C = 'J') then
|
|
return 'I';
|
|
else
|
|
return C;
|
|
end if;
|
|
end UI;
|
|
|
|
begin
|
|
|
|
if S'LENGTH = 1 then
|
|
SS(S'FIRST) := UI(W(S'FIRST));
|
|
else
|
|
SS(S'FIRST) := UI(W(S'FIRST));
|
|
SS(S'FIRST+1) := UI(W(S'FIRST+1));
|
|
end if;
|
|
|
|
return SS;
|
|
end FIRST_TWO;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
if DICTIONARY_AVAILABLE(D_K) then
|
|
if not IS_OPEN(STEM_FILE(D_K)) then
|
|
OPEN(STEM_FILE(D_K), STEM_IO.IN_FILE,
|
|
ADD_FILE_NAME_EXTENSION(STEM_FILE_NAME,
|
|
DICTIONARY_KIND'IMAGE(D_K)));
|
|
end if;
|
|
|
|
INDEX_FIRST := FIRST_INDEX(FIRST_TWO(INDEX_ON), D_K);
|
|
INDEX_LAST := LAST_INDEX(FIRST_TWO(INDEX_ON), D_K);
|
|
|
|
if INDEX_FIRST > 0 and then INDEX_FIRST <= INDEX_LAST then
|
|
|
|
|
|
J1 := STEM_IO.COUNT(INDEX_FIRST); --######################
|
|
J2 := STEM_IO.COUNT(INDEX_LAST);
|
|
|
|
|
|
FIRST_TRY := TRUE;
|
|
|
|
SECOND_TRY := TRUE;
|
|
|
|
J := (J1 + J2) / 2;
|
|
|
|
BINARY_SEARCH:
|
|
loop
|
|
|
|
if (J1 = J2-1) or (J1 = J2) then
|
|
if FIRST_TRY then
|
|
J := J1;
|
|
FIRST_TRY := FALSE;
|
|
elsif SECOND_TRY then
|
|
J := J2;
|
|
SECOND_TRY := FALSE;
|
|
else
|
|
JJ := J;
|
|
exit BINARY_SEARCH;
|
|
end if;
|
|
end if;
|
|
|
|
SET_INDEX(STEM_FILE(D_K), STEM_IO.COUNT(J));
|
|
READ(STEM_FILE(D_K), DS);
|
|
|
|
if LTU(LOWER_CASE(DS.STEM), UNKNOWN) then
|
|
J1 := J;
|
|
J := (J1 + J2) / 2;
|
|
elsif GTU(LOWER_CASE(DS.STEM), UNKNOWN) then
|
|
J2 := J;
|
|
J := (J1 + J2) / 2;
|
|
else
|
|
for I in reverse J1..J loop
|
|
SET_INDEX(STEM_FILE(D_K), STEM_IO.COUNT(I));
|
|
READ(STEM_FILE(D_K), DS);
|
|
|
|
if EQU(LOWER_CASE(DS.STEM), UNKNOWN) then
|
|
JJ := I;
|
|
|
|
|
|
else
|
|
exit;
|
|
end if;
|
|
end loop;
|
|
|
|
for I in J+1..J2 loop
|
|
SET_INDEX(STEM_FILE(D_K), STEM_IO.COUNT(I));
|
|
READ(STEM_FILE(D_K), DS);
|
|
|
|
if EQU(LOWER_CASE(DS.STEM), UNKNOWN) then
|
|
JJ := I;
|
|
|
|
|
|
else
|
|
exit BINARY_SEARCH;
|
|
end if;
|
|
end loop;
|
|
exit BINARY_SEARCH;
|
|
|
|
end if;
|
|
end loop BINARY_SEARCH;
|
|
J1 := JJ;
|
|
J2 := STEM_IO.COUNT(INDEX_LAST);
|
|
|
|
|
|
end if;
|
|
UNKNOWN_COUNT := DS.MNPC;
|
|
|
|
CLOSE(STEM_FILE(D_K)); --??????
|
|
end if;
|
|
--TEXT_IO.PUT_LINE("Leaving LIST_NEIGHBORHOOD UNKNOWN_SEARCH");
|
|
end UNKNOWN_SEARCH;
|
|
|
|
|
|
|
|
|
|
|
|
procedure LIST_NEIGHBORHOOD(OUTPUT : TEXT_IO.FILE_TYPE;
|
|
INPUT_WORD : STRING) is
|
|
|
|
D_K : constant DICTIONARY_KIND := GENERAL;
|
|
DE : DICTIONARY_ENTRY;
|
|
UNK_MNPC : DICT_IO.COUNT;
|
|
|
|
|
|
|
|
|
|
begin
|
|
--TEXT_IO.PUT_LINE("Entering LIST_NEIGHBORHOOD");
|
|
|
|
if (TEXT_IO.NAME(OUTPUT) =
|
|
TEXT_IO.NAME(TEXT_IO.STANDARD_OUTPUT)) then
|
|
MM := MAX_MEANING_PRINT_SIZE; -- to keep from overflowing screen line
|
|
else
|
|
MM := MAX_MEANING_SIZE;
|
|
end if;
|
|
|
|
UNKNOWN_SEARCH(HEAD(INPUT_WORD, MAX_STEM_SIZE), UNK_MNPC);
|
|
--TEXT_IO.PUT_LINE("UNK_MNPC = " & INTEGER'IMAGE(INTEGER(UNK_MNPC)));
|
|
if INTEGER(UNK_MNPC) > 0 then
|
|
TEXT_IO.PUT_LINE(OUTPUT,
|
|
"---------- Entries in GENEAL Dictionary around the UNKNOWN ----------");
|
|
PAUSE(OUTPUT);
|
|
for MN in DICT_IO.COUNT(INTEGER(UNK_MNPC)-5)..
|
|
DICT_IO.COUNT(INTEGER(UNK_MNPC)+3) loop
|
|
LIST_ENTRY(OUTPUT, D_K, MN);
|
|
|
|
end loop;
|
|
end if;
|
|
|
|
--TEXT_IO.PUT_LINE("Leaving LIST_NEIGHBORHOOD");
|
|
|
|
end LIST_NEIGHBORHOOD;
|
|
|
|
end LIST_PACKAGE;
|