import from .zip file

This commit is contained in:
Michael Wolf
2012-05-31 16:45:42 -05:00
commit 926705cb97
55 changed files with 291819 additions and 0 deletions

362
makeinfl.adb Normal file
View File

@@ -0,0 +1,362 @@
with TEXT_IO;
with STRINGS_PACKAGE; use STRINGS_PACKAGE;
with LATIN_FILE_NAMES; use LATIN_FILE_NAMES;
with INFLECTIONS_PACKAGE; use INFLECTIONS_PACKAGE;
with IO_EXCEPTIONS;
procedure MAKEINFL is
package INTEGER_IO is new TEXT_IO.INTEGER_IO(INTEGER);
use TEXT_IO;
use INTEGER_IO;
use STEM_KEY_TYPE_IO;
use INFLECTION_RECORD_IO;
use QUALITY_RECORD_IO;
use ENDING_RECORD_IO;
use AGE_TYPE_IO;
use FREQUENCY_TYPE_IO;
use LEL_SECTION_IO;
PORTING : constant BOOLEAN := TRUE; --FALSE for WAKEINFL;
M, N : INTEGER := 0;
N1, N2, N3, N4, N5 : INTEGER := 0;
OUTPUT : TEXT_IO.FILE_TYPE;
INFLECTIONS_SECTIONS_FILE : LEL_SECTION_IO.FILE_TYPE;
procedure FILE_INFLECTIONS_SECTIONS is
-- Reads the INFLECTS. file and prepares an inflections list
-- Then it writes that list into an array
-- Loads the inflection array into a file for later retrieval
use TEXT_IO;
use INFLECTION_RECORD_IO;
use INTEGER_IO;
INFLECTIONS_FILE : TEXT_IO.FILE_TYPE;
INFLECTIONS_SECTIONS_FILE : LEL_SECTION_IO.FILE_TYPE;
IR : INFLECTION_RECORD;
LINE, BLANKS : STRING(1..100) := (others => ' ');
LAST, L : INTEGER := 0;
SN : ENDING_SIZE_TYPE := ENDING_SIZE_TYPE'FIRST;
SX : CHARACTER := ' ';
type INFLECTION_ITEM;
type INFLECTION_LIST is access INFLECTION_ITEM;
type INFLECTION_ITEM is
record
IR : INFLECTION_RECORD;
SUCC : INFLECTION_LIST;
end record;
type LATIN_INFLECTIONS is array (INTEGER range 0..MAX_ENDING_SIZE,
CHARACTER range ' '..'z') of INFLECTION_LIST;
NULL_LATIN_INFLECTIONS : LATIN_INFLECTIONS := (others => (others => null));
L_I : LATIN_INFLECTIONS := NULL_LATIN_INFLECTIONS;
LEL : LEL_SECTION := (others => NULL_INFLECTION_RECORD);
J1, J2, J3, J4, J5 : INTEGER := 0;
procedure NULL_LEL is
begin
for I in LEL'RANGE loop
LEL(I) := NULL_INFLECTION_RECORD;
end loop;
end NULL_LEL;
procedure LOAD_INFLECTIONS_LIST is
-- Takes the INFLECT. file and populates the L_I list of inflections
-- indexed on ending size and last letter of ending
begin
PUT_LINE("Begin LOAD_INFLECTIONS_LIST");
NUMBER_OF_INFLECTIONS := 0;
L_I := NULL_LATIN_INFLECTIONS;
OPEN(INFLECTIONS_FILE, IN_FILE, INFLECTIONS_FULL_NAME);
TEXT_IO.PUT("INFLECTIONS file loading");
while not END_OF_FILE(INFLECTIONS_FILE) loop
READ_A_LINE:
begin
GET_NON_COMMENT_LINE(INFLECTIONS_FILE, LINE, LAST);
if LAST > 0 then
GET(LINE(1..LAST), IR, L);
SN := IR.ENDING.SIZE;
if SN = 0 then
SX := ' ';
else
SX := IR.ENDING.SUF(SN);
end if;
L_I(SN, SX) := new INFLECTION_ITEM'(IR, L_I(SN, SX));
NUMBER_OF_INFLECTIONS := NUMBER_OF_INFLECTIONS + 1;
--TEXT_IO.PUT(INTEGER'IMAGE(NUMBER_OF_INFLECTIONS) & " "); INFLECTION_RECORD_IO.PUT(IR); NEW_LINE;
end if;
exception
when CONSTRAINT_ERROR | IO_EXCEPTIONS.DATA_ERROR =>
PUT_LINE("****" & LINE(1..LAST));
end READ_A_LINE;
end loop;
CLOSE(INFLECTIONS_FILE);
PUT_LINE("INFLECTIONS_LIST LOADED " & INTEGER'IMAGE(NUMBER_OF_INFLECTIONS));
end LOAD_INFLECTIONS_LIST;
procedure LIST_TO_LEL_FILE is
-- From ILC (=L_I) list of inflections, prepares the LEL inflections array
use LEL_SECTION_IO;
I : INTEGER := 0;
ILC : LATIN_INFLECTIONS := L_I;
begin
CREATE(INFLECTIONS_SECTIONS_FILE, OUT_FILE, INFLECTIONS_SECTIONS_NAME);
NULL_LEL;
ILC := L_I; -- Resetting the list to start over
while ILC(0, ' ') /= null loop
J5 := J5 + 1;
LEL(J5) := ILC(0, ' ').IR;
ILC(0, ' ') := ILC(0, ' ').SUCC;
end loop;
WRITE(INFLECTIONS_SECTIONS_FILE, LEL, 5);
N5 := J5;
NULL_LEL;
ILC := L_I; -- Resetting the list to start over
for CH in CHARACTER range 'a'..'z' loop
for N in reverse 1..MAX_ENDING_SIZE loop
while ILC(N, CH) /= null loop
if not
(ILC(N, CH).IR.QUAL.POFS = PRON and then
(ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 1 or
ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 2)) then
if CH in INFLECTIONS_SECTION_1 then
J1 := J1 + 1;
LEL(J1) := ILC(N, CH).IR;
end if;
end if;
ILC(N, CH) := ILC(N, CH).SUCC;
end loop;
end loop;
end loop;
WRITE(INFLECTIONS_SECTIONS_FILE, LEL, 1);
N1 := J1;
NULL_LEL;
ILC := L_I; -- Resetting the list to start over
for CH in CHARACTER range 'a'..'z' loop
for N in reverse 1..MAX_ENDING_SIZE loop
while ILC(N, CH) /= null loop
if not
(ILC(N, CH).IR.QUAL.POFS = PRON and then
(ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 1 or
ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 2)) then
if CH in INFLECTIONS_SECTION_2 then
J2 := J2 + 1;
LEL(J2) := ILC(N, CH).IR;
end if;
end if;
ILC(N, CH) := ILC(N, CH).SUCC;
end loop;
end loop;
end loop;
WRITE(INFLECTIONS_SECTIONS_FILE, LEL, 2);
N2 := J2;
NULL_LEL;
ILC := L_I; -- Resetting the list to start over
for CH in CHARACTER range 'a'..'z' loop
for N in reverse 1..MAX_ENDING_SIZE loop
while ILC(N, CH) /= null loop
if not
(ILC(N, CH).IR.QUAL.POFS = PRON and then
(ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 1 or
ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 2)) then
if CH in INFLECTIONS_SECTION_3 then
J3 := J3 + 1;
LEL(J3) := ILC(N, CH).IR;
end if;
end if;
ILC(N, CH) := ILC(N, CH).SUCC;
end loop;
end loop;
end loop;
WRITE(INFLECTIONS_SECTIONS_FILE, LEL, 3);
N3 := J3;
NULL_LEL;
ILC := L_I; -- Resetting the list to start over
for CH in CHARACTER range 'a'..'z' loop
for N in reverse 1..MAX_ENDING_SIZE loop
while ILC(N, CH) /= null loop
if not
(ILC(N, CH).IR.QUAL.POFS = PRON and then
(ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 1 or
ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 2)) then
if (CH in INFLECTIONS_SECTION_4) then
J4 := J4 + 1;
LEL(J4) := ILC(N, CH).IR;
end if;
end if;
ILC(N, CH) := ILC(N, CH).SUCC;
end loop;
end loop;
end loop;
-- Now put the PACK in 4 -- Maybe it should be in 5 ????
ILC := L_I; -- Resetting the list to start over
for CH in CHARACTER range 'a'..'z' loop
for N in reverse 1..MAX_ENDING_SIZE loop
while ILC(N, CH) /= null loop
if (ILC(N, CH).IR.QUAL.POFS = PRON and then
(ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 1 or
ILC(N, CH).IR.QUAL.PRON.DECL.WHICH = 2)) then -- 2 no longer PACK
J4 := J4 + 1;
LEL(J4) := ILC(N, CH).IR;
end if;
ILC(N, CH) := ILC(N, CH).SUCC;
end loop;
end loop;
end loop;
WRITE(INFLECTIONS_SECTIONS_FILE, LEL, 4);
N4 := J4;
CLOSE(INFLECTIONS_SECTIONS_FILE);
end LIST_TO_LEL_FILE;
begin
LOAD_INFLECTIONS_LIST;
TEXT_IO.SET_COL(33);
TEXT_IO.PUT("-- ");
INTEGER_IO.PUT(NUMBER_OF_INFLECTIONS);
TEXT_IO.PUT_LINE(" entries -- Loaded correctly");
LIST_TO_LEL_FILE; -- Load arrays to file
TEXT_IO.PUT_LINE("File INFLECTS.SEC -- Loaded");
exception
when others =>
TEXT_IO.PUT_LINE("Exception in FILE_INFLECTIONS_SECTIONS");
end FILE_INFLECTIONS_SECTIONS;
use INFLECTIONS_PACKAGE;
begin
PUT_LINE("Produces INFLECTS.SEC file from INFLECTS.");
FILE_INFLECTIONS_SECTIONS;
if not PORTING then
PUT_LINE("using FILE_INFLECTIONS_SECTIONS, also produces INFLECTS.LIN file");
CREATE(OUTPUT, OUT_FILE, "INFLECTS.LIN");
end if;
ESTABLISH_INFLECTIONS_SECTION;
LEL_SECTION_IO.OPEN(INFLECTIONS_SECTIONS_FILE, IN_FILE,
INFLECTIONS_SECTIONS_NAME);
if not PORTING then
for I in BEL'RANGE loop -- Blank endings
if BEL(I) /= NULL_INFLECTION_RECORD then
M := M + 1;
PUT(OUTPUT, BEL(I).QUAL);
SET_COL(OUTPUT, 50);
PUT(OUTPUT, BEL(I).KEY, 1);
SET_COL(OUTPUT, 52);
PUT(OUTPUT, BEL(I).ENDING);
SET_COL(OUTPUT, 62);
PUT(OUTPUT, BEL(I).AGE);
SET_COL(OUTPUT, 64);
PUT(OUTPUT, BEL(I).FREQ);
NEW_LINE(OUTPUT);
end if;
end loop;
end if;
for N in 1..4 loop
READ(INFLECTIONS_SECTIONS_FILE, LEL, LEL_SECTION_IO.POSITIVE_COUNT(N));
if not PORTING then
for I in LEL'RANGE loop -- Non-blank endings
if LEL(I) /= NULL_INFLECTION_RECORD then
M := M + 1;
PUT(OUTPUT, LEL(I).QUAL);
SET_COL(OUTPUT, 50);
PUT(OUTPUT, LEL(I).KEY, 1);
SET_COL(OUTPUT, 52);
PUT(OUTPUT, LEL(I).ENDING);
SET_COL(OUTPUT, 62);
PUT(OUTPUT, LEL(I).AGE);
SET_COL(OUTPUT, 64);
PUT(OUTPUT, LEL(I).FREQ);
NEW_LINE(OUTPUT);
end if;
end loop;
end if;
end loop;
NEW_LINE;
PUT("LINE_INFLECTIONS finds "); PUT(M); PUT_LINE(" inflections"); NEW_LINE;
for I in Character range ' '..' ' loop
INTEGER_IO.PUT(0); PUT(" "); PUT(I); PUT(" "); PUT(BELF(0, I));
PUT(" "); PUT(BELL(0, I));
PUT(" "); PUT(BELL(0, I) - BELF(0, I) + 1); NEW_LINE;
end loop;
NEW_LINE;
for I in Character range 'a'..'z' loop
for N in reverse 1..MAX_ENDING_SIZE loop
if (LELL(N, I) > 0) and then (LELF(N, I) <= LELL(N, I)) then
PUT(N); PUT(" "); PUT(I); PUT(" "); PUT(LELF(N, I));
PUT(" "); PUT(LELL(N, I));
PUT(" "); PUT(LELL(N, I) - LELF(N, I) + 1); NEW_LINE;
end if;
end loop;
end loop;
NEW_LINE;
for I in Character range 'a'..'z' loop
for N in reverse 1..MAX_ENDING_SIZE loop
if (PELL(N, I) > 0) and then (PELF(N, I) <= PELL(N, I)) then
PUT(N); PUT(" "); PUT(I); PUT(" "); PUT(PELF(N, I));
PUT(" "); PUT(PELL(N, I));
PUT(" "); PUT(PELL(N, I) - PELF(N, I) + 1); NEW_LINE;
end if;
end loop;
end loop;
NEW_LINE;
NEW_LINE;
PUT(N5); PUT(" ");
PUT(N1); PUT(" ");
PUT(N2); PUT(" ");
PUT(N3); PUT(" ");
PUT(N4); PUT(" ");
NEW_LINE;
end MAKEINFL;