import from .zip file
This commit is contained in:
362
makeinfl.adb
Normal file
362
makeinfl.adb
Normal 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;
|
||||
Reference in New Issue
Block a user