diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-07 22:15:26 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-07 22:19:26 +0300 |
commit | 2bae7da012e2125762855ce014e63345ecbbbb18 (patch) | |
tree | 61faec7672937f8fc420310da0ff531ce9c6a6bb | |
parent | 79447034e393dc5c7f01f3ec0ca1de7ded4f15e6 (diff) | |
download | ellinika-2bae7da012e2125762855ce014e63345ecbbbb18.tar.gz ellinika-2bae7da012e2125762855ce014e63345ecbbbb18.tar.bz2 |
Improve conjugator
* data/dbverb.struct: Remove individual verb definitions.
* data/irregular-verbs.xml: New file.
* scm/verbop.scm: New file.
* scm/Makefile.am: Add rules for verbop.
* scm/conjugator.scm: Various fixes.
* src/ellinika/elmorph.c (elstr-accent-position): Fix handling
of string arguments.
(_elstr_set_accent): Fix error message.
(elstr-set-accent-character)
(elstr-set-accent-character!): New functions.
-rw-r--r-- | data/dbverb.struct | 101 | ||||
-rw-r--r-- | data/irregular-verbs.xml | 641 | ||||
-rw-r--r-- | scm/.gitignore | 2 | ||||
-rw-r--r-- | scm/Makefile.am | 7 | ||||
-rw-r--r-- | scm/conjugator.scm | 189 | ||||
-rw-r--r-- | scm/verbop.scm | 676 | ||||
-rw-r--r-- | src/ellinika/elmorph.c | 66 |
7 files changed, 1516 insertions, 166 deletions
diff --git a/data/dbverb.struct b/data/dbverb.struct index af9d236..06745c8 100644 --- a/data/dbverb.struct +++ b/data/dbverb.struct @@ -29,24 +29,24 @@ CREATE TABLE verbflect( ); DROP TABLE IF EXISTS conjugation; CREATE TABLE conjugation( conj char(2), -- REL 9 voice enum('act','pas'), -- Ενεργητηκή/Μεσοπαθητική - mode enum('ind','sub','imp'), + mood enum('ind','sub','imp'), tense varchar(128), thema enum('pres','aor','sub','synt'), -- Ενεστώτα, Αόριστου, υποτακτικής, syntethic suffix char(32), flect int(32), -- REL 8 accmap char(7), -- accent map particle char(2), -- NULL/θα/να aux varchar(128), -- REL 10 auxtense char(32), KEY (conj), KEY (voice), - KEY (mode) + KEY (mood) ); DROP TABLE IF EXISTS participle; CREATE TABLE participle ( conj char(2), -- REL 9 voice enum('act','pas'), -- Ενεργητηκή/Μεσοπαθητική @@ -240,101 +240,24 @@ CREATE TABLE verb( augment char(1), accmap char(7), suffix_aor_path varchar(2), INDEX(verb) ); -DROP TABLE IF EXISTS irregular_root; -CREATE TABLE irregular_root( - verb varchar(128), - voice enum('act','pas'), -- Ενεργητηκή/Μεσοπαθητική - thema enum('pres','aor','sub'), -- Αόριστος/Υποτακτική - root varchar(128) -); - -INSERT INTO verb VALUES -('βρίσκω', 'A', NULL, '000000', NULL), -('θέλω','A','η',NULL, NULL), -('έχω','A',NULL,'000000', NULL), -('ξέρω','A','η',NULL, NULL), -('κρεμάω','B1',NULL,NULL,"ασ"), -('κρεμώ','B1',NULL,NULL,"ασ"), -('κιτάω','B1',NULL,NULL,"αξ"), -('κιτώ','B1',NULL,NULL,"αξ"), -('τραβάω','B1',NULL,NULL,"ηξ"), -('τραβώ','B1',NULL,NULL,"ηξ"), -('νικώ','B1',NULL,NULL,NULL) -; - -INSERT INTO irregular_root VALUES -('βρίσκω','act','aor','βρήκ'), -('βρίσκω','act','sub','βρ'), -('βρίσκω','pas','aor','βρέθ'), -('βρίσκω','pas','sub','βρέθ'), -('θέλω','act','aor','θέλησ') -; - DROP TABLE IF EXISTS individual_verb; CREATE TABLE individual_verb( verb varchar(128), - voice enum('act','pas'), -- Ενεργητηκή/Μεσοπαθητική - mode enum('ind','sub','imp'), + voice enum('act','pas'), + mood enum('ind','sub','imp'), tense varchar(128), ident int(32), - INDEX(verb,voice,mode,tense) + INDEX(verb,voice,mood,tense) ); -INSERT INTO individual_verb VALUES -("είμαι", "act", "ind", "Ενεστώτας", 100), -("είμαι", "act", "ind", "Παρατατικός", 101), -("είμαι", "act", "ind", "Μέλλοντας διαρκείας", 102), -("είμαι", "act", "ind", "Αόριστος", 0), -("είμαι", "act", "ind", "Παρακείμενος", 0), -("είμαι", "act", "ind", "Υπερσυντέλικος", 0), -("είμαι", "act", "ind", "Συντελεσμένος μέλλοντας", 0), -("είμαι", "act", "ind", "Μέλλοντας στιγμιαίος", 0), -("είμαι", "act", "sub", "Ενεστώτας", 103), -("είμαι", "act", "sub", "Αόριστος", 0), -("είμαι", "act", "sub", "Παρακείμενος", 0), -("είμαι", "act", "imp", "Ενεστώτας", 104), -("είμαι", "act", "imp", "Αόριστος", 0), -("είμαι", "act", "imp", "Παρακείμενος", 0), -("είμαι", "pas", "ind", "Ενεστώτας", 0), -("είμαι", "pas", "ind", "Παρατατικός", 0), -("είμαι", "pas", "ind", "Μέλλοντας διαρκείας", 0), -("είμαι", "pas", "ind", "Αόριστος", 0), -("είμαι", "pas", "ind", "Παρακείμενος", 0), -("είμαι", "pas", "ind", "Υπερσυντέλικος", 0), -("είμαι", "pas", "ind", "Συντελεσμένος μέλλοντας", 0), -("είμαι", "pas", "ind", "Μέλλοντας στιγμιαίος", 0), -("είμαι", "pas", "sub", "Ενεστώτας", 0), -("είμαι", "pas", "sub", "Αόριστος", 0), -("είμαι", "pas", "sub", "Παρακείμενος", 0), -("είμαι", "pas", "imp", "Ενεστώτας", 0), -("είμαι", "pas", "imp", "Αόριστος", 0), -("είμαι", "pas", "imp", "Παρακείμενος", 0), +DROP TABLE IF EXISTS irregular_root; +CREATE TABLE irregular_root( + verb varchar(128), + voice enum('act','pas'), -- Ενεργητηκή/Μεσοπαθητική + thema enum('pres','aor','sub'), -- Αόριστος/Υποτακτική + root varchar(128) +); -("έχω", "act", "ind", "Παρατατικός", 105), -("έχω", "act", "ind", "Αόριστος", 0), -("έχω", "act", "ind", "Παρακείμενος", 0), -("έχω", "act", "ind", "Υπερσυντέλικος", 0), -("έχω", "act", "ind", "Συντελεσμένος μέλλοντας", 0), -("έχω", "act", "ind", "Μέλλοντας στιγμιαίος", 0), -("έχω", "act", "sub", "Αόριστος", 0), -("έχω", "act", "sub", "Παρακείμενος", 0), -("έχω", "act", "imp", "Αόριστος", 0), -("έχω", "act", "imp", "Παρακείμενος", 0), -("έχω", "pas", "ind", "Παρατατικός", 0), -("έχω", "pas", "ind", "Μέλλοντας διαρκείας", 0), -("έχω", "pas", "ind", "Αόριστος", 0), -("έχω", "pas", "ind", "Παρακείμενος", 0), -("έχω", "pas", "ind", "Υπερσυντέλικος", 0), -("έχω", "pas", "ind", "Συντελεσμένος μέλλοντας", 0), -("έχω", "pas", "ind", "Μέλλοντας στιγμιαίος", 0), -("έχω", "pas", "sub", "Ενεστώτας", 0), -("έχω", "pas", "sub", "Αόριστος", 0), -("έχω", "pas", "sub", "Παρακείμενος", 0), -("έχω", "pas", "imp", "Ενεστώτας", 0), -("έχω", "pas", "imp", "Αόριστος", 0), -("έχω", "pas", "imp", "Παρακείμενος", 0), -("βρίσκω", "act", "imp", "Αόριστος", 106) -; diff --git a/data/irregular-verbs.xml b/data/irregular-verbs.xml new file mode 100644 index 0000000..ca2c7d1 --- /dev/null +++ b/data/irregular-verbs.xml @@ -0,0 +1,641 @@ +<i> + <v> + <a>είμαι</a> + <c>I</c> + <act> + <ind> + <t name="Ενεστώτας"> + <p n="s" p="1">είμαι</p> + <p n="s" p="2">είσαι</p> + <p n="s" p="3">είναι</p> + <p n="p" p="1">είμαστε</p> + <p n="p" p="2">είστε,είσαστε</p> + <p n="p" p="3">είναι</p> + </t> + <t name="Παρατατικός"> + <p n="s" p="1">ήμουν(α)</p> + <p n="s" p="2">ήσουν(α)</p> + <p n="s" p="3">ήταν(ε)</p> + <p n="p" p="1">ήμαστε,ήμασταν</p> + <p n="p" p="2">ήσαστε,ήσασταν</p> + <p n="p" p="3">ήταν(ε)</p> + </t> + <t name="Μέλλοντας διαρκείας"> + <p n="s" p="1">θα είμαι</p> + <p n="s" p="2">θα είσαι</p> + <p n="s" p="3">θα είναι</p> + <p n="p" p="1">θα είμαστε</p> + <p n="p" p="2">θα είστε,θα είσαστε</p> + <p n="p" p="3">θα είναι</p> + </t> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + <t name="Υπερσυντέλικος"/> + <t name="Συντελεσμένος μέλλοντας"/> + <t name="Μέλλοντας στιγμιαίος"/> + </ind> + <sub> + <t name="Ενεστώτας"> + <p n="s" p="1">να είμαι</p> + <p n="s" p="2">να είσαι</p> + <p n="s" p="3">να είναι</p> + <p n="p" p="1">να είμαστε</p> + <p n="p" p="2">να είστε,θα είσαστε</p> + <p n="p" p="3">να είναι</p> + </t> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + </sub> + <imp> + <t name="Ενεστώτας"> + <p n="s" p="2">να είσαι</p> + <p n="p" p="2">να είστε</p> + </t> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + </imp> + </act> + + <pas> + <ind> + <t name="Ενεστώτας"/> + <t name="Παρατατικός"/> + <t name="Μέλλοντας διαρκείας"/> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + <t name="Υπερσυντέλικος"/> + <t name="Συντελεσμένος μέλλοντας"/> + <t name="Μέλλοντας στιγμιαίος"/> + </ind> + <sub> + <t name="Ενεστώτας"/> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + </sub> + <imp> + <t name="Ενεστώτας"/> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + </imp> + </pas> + </v> + + <v> + <a>έχω</a> + <c>A</c> + <accmap>000000</accmap> + <act> + <ind> + <t name="Παρατατικός"> + <p n="s" p="1">είχα</p> + <p n="s" p="2">είχες</p> + <p n="s" p="3">είχα</p> + <p n="p" p="1">είχαμε</p> + <p n="p" p="2">είχατε</p> + <p n="p" p="3">είχαν</p> + </t> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + <t name="Υπερσυντέλικος"/> + <t name="Συντελεσμένος μέλλοντας"/> + <t name="Μέλλοντας στιγμιαίος"/> + </ind> + <sub> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + </sub> + <imp> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + </imp> + </act> + <pas> + <ind> + <t name="Ενεστώτας"/> + <t name="Παρατατικός"/> + <t name="Μέλλοντας διαρκείας"/> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + <t name="Υπερσυντέλικος"/> + <t name="Συντελεσμένος μέλλοντας"/> + <t name="Μέλλοντας στιγμιαίος"/> + </ind> + <sub> + <t name="Ενεστώτας"/> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + </sub> + <imp> + <t name="Ενεστώτας"/> + <t name="Αόριστος" /> + <t name="Παρακείμενος"/> + </imp> + </pas> + </v> + + <v> + <a>κρεμώ</a> + <c>B1</c> + <suffix>ασ</suffix> + </v> + + <v> + <a>κιτώ</a> + <c>B1</c> + <suffix>αξ</suffix> + </v> + + <v> + <a>τραβώ</a> + <c>B1</c> + <suffix>ηξ</suffix> + </v> + + <v> + <a>νικώ</a> + <c>B1</c> + </v> + + <v> + <a>θέλω</a> + <c>A</c> + <act> + <aor>θέλησ</aor> + </act> + </v> + + <v> + <a>αγγέλω</a> + <c>A</c> + <act> + <aor>αγγείλ</aor> + </act> + </v> + + <v> + <a>άγω</a> + <c>A</c> + <act> + <aor>ήγαγ</aor> + <root theme="sub">αγάγ</root> + </act> + </v> + + <v> + <a>ανεβαίνω</a> + <c>A</c> + <act> + <root theme="aor">ανέβηκ</root> + <root theme="sub">ανέβ</root> + </act> + </v> + + <v> + <a>απονέμω</a> + <c>A</c> + <act> + <root theme="aor">απένειμ</root> + <root theme="sub">απονείμ</root> + </act> + </v> + + <v> + <a>αρέσω</a> + <c>A</c> + <act> + <root theme="aor">αρεσ</root> + </act> + </v> + + <v> + <a>βάλλω</a> + <c>A</c> + <act> + <root theme="aor">βαλ</root> + </act> + </v> + + <v> + <a>βαραίνω</a> + <c>A</c> + <act> + <root theme="aor">βαρυν</root> + </act> + </v> + + <v> + <a>βαστώ</a> + <c>B2</c> + <suffix>ηξ</suffix> <!-- also αξ --> + </v> + + <v> + <a>βγάζω</a> + <c>A</c> + <act> + <root theme="aor">βγαλ</root> + </act> + </v> + + <v> + <a>βγαίνω</a> + <c>A</c> + <accmap>000000</accmap> + <act> + <root theme="aor">βγήκ</root> + <root theme="sub">βγ</root> + </act> + </v> + + <v> + <a>βλέπω</a> + <c>A</c> + <accmap>000000</accmap> + <act> + <root theme="aor">είδ</root> + <root theme="sub">δ</root> + <imp> + <t name="Αόριστος"> + <p n="s" p="2">δες</p> + <p n="p" p="2">δείτε,δέστε</p> + </t> + </imp> + </act> + </v> + + <v> + <a>βρίσκω</a> + <c>A</c> + <act> + <root theme="aor">βρήκ</root> + <root theme="sub">βρ</root> + <imp> + <t name="Αόριστος"> + <p n="s" p="2">βρες</p> + <p n="p" p="2">βρείτε,βρέστε</p> + </t> + </imp> + </act> + <pas> + <aor>βρέθ</aor> + </pas> + </v> + + <v> + <a>γελώ</a> + <c>B2</c> + <suffix>ασ</suffix> + </v> + + <v> + <a>γέρνω</a> + <c>A</c> + <act> + <root theme="aor">γειρ</root> + </act> + </v> + + <v> + <a>γίνομαι</a> <!-- FIXME: deponentium --> + <c>A</c> + <act> + <root theme="aor">γίν</root> + </act> + </v> + + <v> + <a>διαβαίνω</a> + <c>A</c> + <act> + <root theme="aor">διάβηκ</root> + <sub> + <t name="Αόριστος"> + <p n="s" p="1">διαβώ</p> + <p n="s" p="2">διαβείς</p> + <p n="s" p="3">διαβεί</p> + <p n="p" p="1">διαβούμε</p> + <p n="p" p="2">διαβέτε</p> + <p n="p" p="3">διαβούν</p> + </t> + </sub> + </act> + </v> + + <v> + <a>διδάσκω</a> + <c>A</c> + <act> + <root theme="aor">διδαξ</root> + </act> + </v> + + <v> + <a>δίνω</a> + <c>A</c> + <act> + <root theme="aor">δωσ</root> + </act> + </v> + +<!-- FIXME + έρχομαι + κάθομαι +--> + + <v> + <a>καίω</a> + <c>A</c> + <act> + <root theme="aor">καψ</root> + </act> + </v> + + <v> + <a>κάν</a> + <c>A</c> + </v> + + <v> + <a>κλαίω</a> + <c>A</c> + <act> + <root theme="aor">κλαψ</root> + </act> + </v> + + <v> + <a>λαβαίνω</a> + <c>A</c> + <act> + <root theme="aor">λαβ</root> + </act> + </v> + + <v> + <a>λέω</a> + <c>A</c> + <accmap>000000</accmap> + <act> + <root theme="aor">είπ</root> + <root theme="sub">π</root> + <imp> + <t name="Αόριστος"> + <p n="s" p="2">πες</p> + <p n="p" p="2">πείτε,πέστε</p> + </t> + </imp> + </act> + </v> + +<!-- FIXME: λέγω -> λέω --> + + <v> + <a>μαθαίνω</a> + <c>A</c> + <act> + <root theme="aor">μαθ</root> + </act> + </v> + + <v> + <a>μπαίνω</a> + <c>A</c> + <accmap>000000</accmap> + <act> + <root theme="aor">μπηκ</root> + <root theme="sub">μπ</root> + <imp> + <t name="Αόριστος"> + <p n="s" p="2">μπες</p> + <p n="p" p="2">μπείτε</p> + </t> + </imp> + </act> + </v> + + <v> + <a></a> + <c>A</c> + <act> + <root theme="aor"></root> + <root theme="sub"></root> + </act> + </v> + + <v> + <a>ξέρω</a> + <c>A</c> + <augment>η</augment> + </v> + + <v> + <a>παθαίνω</a> + <c>A</c> + <act> + <root theme="aor">παθ</root> + </act> + </v> + + <v> + <a>περνώ</a> + <c>B1</c> + <suffix>ασ</suffix> + </v> + + <v> + <a>πέφτω</a> + <c>A</c> + <act> + <root theme="aor">πεσ</root> + </act> + </v> + + <v> + <a>πηγαίνω</a> + <c>A</c> + <accmap>000000</accmap> + <act> + <root theme="aor">πήγ</root> + <ind> + <t name="Μέλλοντας στιγμιαίος"> + <p n="s" p="1">θα πάω</p> + <p n="s" p="2">θα πας</p> + <p n="s" p="3">θα πάει</p> + <p n="p" p="1">θα πάμε</p> + <p n="p" p="2">θα πάτε</p> + <p n="p" p="3">θα πάνε</p> + </t> + </ind> + <sub> + <t name="Αόριστος"> + <p n="s" p="1">να πάω</p> + <p n="s" p="2">να πας</p> + <p n="s" p="3">να πάει</p> + <p n="p" p="1">να πάμε</p> + <p n="p" p="2">να πάτε</p> + <p n="p" p="3">να πάνε</p> + </t> + </sub> + <imp> + <t name="Αόριστος"> + <p n="s" p="2">πήγαινε</p> + <p n="p" p="2">πηγαίνετε</p> + </t> + </imp> + </act> + </v> + + <v> + <a>πίνω</a> + <c>A</c> + <accmap>000000</accmap> + <act> + <root theme="aor">ήπι</root> <!-- FIXME:Syllabizer --> + <root theme="sub">πι</root> + <imp> + <t name="Αόριστος"> + <p n="s" p="2">πιες</p> + <p n="p" p="2">πιείτε,πιέστε</p> + </t> + </imp> + </act> + </v> + + <v> + <a>πλέω</a> + <c>A</c> + <act> + <root theme="aor">πλευσ</root> + </act> + </v> + + <v> + <a>πονώ</a> + <c>A</c> + <act> + <root theme="aor">πονεσ</root> + </act> + </v> + +<!-- FIXME σέβομαι --> + + <v> + <a>σέρνω</a> + <c>A</c> + <act> + <root theme="aor">συρ</root> + </act> + </v> + + <v> + <a>σπέρνω</a> + <c>A</c> + <act> + <root theme="aor">σπειρ</root> + </act> + </v> + +<!-- FIXME: στέκομαι,στέκο --> + + <v> + <a>στέλνω</a> + <c>A</c> + <act> + <root theme="aor">στείλ</root> + </act> + </v> + +<!-- FIXME: συμβαίνει --> + + <v> + <a>τείνω</a> + <c>A</c> + <act> + <root theme="aor">τειν</root> + </act> + </v> + + <v> + <a>τραβώ</a> + <c>B1</c> + <suffix>ηξ</suffix> + </v> + + <v> + <a>τρέφω</a> + <c>A</c> + <act> + <root theme="aor">θρεψ</root> + </act> + </v> + + <v> + <a>τρώω</a> + <c>A</c> + <act> + <root theme="aor">φαγ</root> + <root theme="sub">φα</root> + </act> + </v> + + <v> + <a>τυχαίνω</a> + <c>A</c> + <act> + <root theme="aor">τυχ</root> + </act> + </v> + + <v> + <a>υπάρχω</a> + <c>A</c> + <accmap>000000</accmap> + <act> + <root theme="aor">υπήρξ</root> + <root theme="sub">υπάρξ</root> + </act> + </v> + +<!-- FIXME: υπόσχομαι, φαίνομαι --> + + <v> + <a>φέυγω</a> + <c>A</c> + <act> + <root theme="aor">φυγ</root> + </act> + </v> + + <v> + <a>φορώ</a> + <c>B1</c> + <suffix>εσ</suffix> + </v> + + <v> + <a>φταίω</a> + <c>A</c> + <act> + <root theme="aor">φταιξ</root> + </act> + </v> + +<!-- FIXME χαίρομαι --> + + <v> + <a>χορταίνω</a> + <c>A</c> + <act> + <root theme="aor">χορτασ</root> + </act> + </v> + + <v> + <a>ψέλνω</a> + <c>A</c> + <act> + <root theme="aor">ψαλ</root> + </act> + </v> + +</i> diff --git a/scm/.gitignore b/scm/.gitignore index d033647..0e10ba2 100644 --- a/scm/.gitignore +++ b/scm/.gitignore @@ -1,4 +1,4 @@ dictrans dictrans.sed neatrans - +verbop diff --git a/scm/Makefile.am b/scm/Makefile.am index f2669f4..481676f 100644 --- a/scm/Makefile.am +++ b/scm/Makefile.am @@ -12,14 +12,14 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. pkgmoddir=@GUILE_SITE@ -bin_SCRIPTS=dictrans neatrans -CLEANFILES=dictrans.sed dictrans +bin_SCRIPTS=dictrans neatrans verbop +CLEANFILES=dictrans.sed dictrans neatrans verbop EXTRA_DIST=dictrans.scm dictrans.sed: Makefile echo 's,=GUILE_BINDIR=,$(GUILE_BINDIR),' > $@ echo 's,=GUILE_SITE=,@GUILE_SITE@,' >> $@ echo 's,\;=GUILE_COMMENT=\;,@GUILE_COMMENT@,' >> $@ @@ -31,6 +31,9 @@ dictrans: $(srcdir)/dictrans.scm dictrans.sed chmod +x $@ neatrans: $(srcdir)/neatrans.scm dictrans.sed sed -f dictrans.sed $(srcdir)/neatrans.scm > $@ chmod +x $@ +verbop: $(srcdir)/verbop.scm dictrans.sed + sed -f dictrans.sed $(srcdir)/verbop.scm > $@ + chmod +x $@ diff --git a/scm/conjugator.scm b/scm/conjugator.scm index ceda52a..7b2a4a6 100644 --- a/scm/conjugator.scm +++ b/scm/conjugator.scm @@ -125,21 +125,27 @@ WHERE verb='" (force-string verb) "'" ((elstr-suffix? root "άρ" "ίρ") ((elstr-append root "ιστ"))) ((logand (elstr-char-prop-bitmask root -1) elmorph:vowel) (elstr-append root "θ")) (else #f))) - + +(define (lookup-verb-info verb voice thema) + (my-sql-query + (dict-connect) + (string-append + "SELECT root FROM irregular_root \ +WHERE verb='" verb "' AND voice='" voice "' AND thema='" thema "'"))) + (define (complement-verb-info vinfo verb voice thema) ; (format #t "COMPLEMENT ~S~%" thema) (let ((elverb (string->elstr verb)) - (result (my-sql-query - (dict-connect) - (string-append - "SELECT root FROM irregular_root \ -WHERE verb='" verb "' AND voice='" voice "' AND thema='" thema "'")))) + (result (let ((tmpres (lookup-verb-info verb voice thema))) + (if (and (null? tmpres) (string=? thema "sub")) + (lookup-verb-info verb voice "aor") + tmpres)))) (verb-info-set! #:root vinfo (cond ((not (null? result)) (verb-info-set! #:attested vinfo 'root) (caar result)) ((string=? (verb-info #:conj vinfo) "A") @@ -244,21 +250,21 @@ WHERE verb='" verb "' AND voice='" voice "' AND thema='" thema "'")))) (define-syntax conj-info-set! (syntax-rules () ((conj-info-set! #:particle v val) (list-set! v 3 val)))) -(define (get-conj-info conj voice mode tense) +(define (get-conj-info conj voice mood tense) (let ((conn (dict-connect))) (let ((answer (my-sql-query conn (string-append "SELECT c.thema,c.suffix,c.accmap,c.particle,c.aux,c.auxtense,\ f.sing1,f.sing2,f.sing3,f.plur1,f.plur2,f.plur3 \ FROM conjugation c, verbflect f \ -WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode +WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mood='" mood "' AND c.tense='" tense "' AND c.flect = f.ident")))) (if (null? answer) #f (car answer))))) (define (force-string str) @@ -268,13 +274,23 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode (define (force-elstr str) (if (string? str) (string->elstr str) str)) -(define (apply-flect conj vinfo) +(define (accented-syllable-0 str) + (let ((syl (elstr-accented-syllable str)) + (len (elstr-number-of-syllables str))) + (if (= syl 0) + syl + (+ (- len syl) 1)))) + +(define (set-accented-syllable-0! str nsyl) + (elstr-set-accent! str (+ (- (elstr-number-of-syllables str) nsyl) 1))) + +(define (apply-flect conj vinfo verb) (let ((root (verb-info #:root vinfo)) (suffix (let ((s (conj-info #:suffix conj))) (if s (or (verb-info #:suffix vinfo) s) ""))) (accmap (string->list (or (verb-info #:accmap vinfo) @@ -291,26 +307,35 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode (lambda (flect acc) (cond ((not flect) #f) ((char=? acc #\0) (let* ((rs (force-elstr root)) (suf (elstr-deaccent (elstr-append suffix flect))) - (result (elstr-append rs suf))) - (cond - ((or (= (elstr-accented-syllable rs) 0) - (> (elstr-number-of-syllables suf) 2)) - (let ((nsyl (elstr-number-of-syllables suf))) - (cond - ((= nsyl 1) - result) - ((= nsyl 3) - (elstr-set-accent result 3)) - (else - (elstr-set-accent result 2))))) - (else - result)))) + (result (elstr-append rs suf)) + (acc-syl (let ((n (accented-syllable-0 rs))) + (if (= 0 n) + (accented-syllable-0 verb) + n)))) + (if (> (elstr-number-of-syllables result) 1) + (set-accented-syllable-0! result acc-syl)) + (let ((acc-syl (elstr-accented-syllable result))) + (cond + ((and (= acc-syl 1) + (= (elstr-number-of-syllables result) 1)) + (elstr-deaccent result)) + ((> acc-syl 3) + (let ((nsyl (elstr-number-of-syllables suf))) + (cond + ((= nsyl 1) + result) + ((= nsyl 3) + (elstr-set-accent result 3)) + (else + (elstr-set-accent result 2))))) + (else + result))))) ((char=? acc #\f) (elstr-append (elstr-deaccent (elstr-append root suffix)) flect)) ((char=? acc #\s) (elstr-append @@ -337,37 +362,37 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode (if w (string-append (conj-info #:particle conj) " " (force-string w)))) forms) (map force-string forms))))) -(define (individual-verb verb voice mode tense) +(define (individual-verb verb voice mood tense) (let ((res (my-sql-query (dict-connect) (string-append "SELECT f.sing1,f.sing2,f.sing3,f.plur1,f.plur2,f.plur3 \ FROM individual_verb i,verbflect f \ -WHERE i.verb='" verb "' AND i.voice='" voice "' AND i.mode='" mode +WHERE i.verb='" verb "' AND i.voice='" voice "' AND i.mood='" mood "' AND i.tense = '" tense "' AND i.ident=f.ident")))) (if (not (null? res)) (append (car res) (list "I" '(class root))) #f))) -(define (conjugate verb voice mode tense . rest) +(define (conjugate verb voice mood tense . rest) (cond - ((individual-verb verb voice mode tense) => + ((individual-verb verb voice mood tense) => (lambda (res) res)) (else (let* ((vinfo (get-verb-info verb)) - (conj (get-conj-info (verb-info #:conj vinfo) voice mode tense))) + (conj (get-conj-info (verb-info #:conj vinfo) voice mood tense))) (if (not conj) (error "cannot obtain conjugation information for " - (verb-info #:conj vinfo) voice mode tense)) + (verb-info #:conj vinfo) voice mood tense)) (if (member #:nopart rest) (conj-info-set! #:particle conj #f)) (cond ((string=? (conj-info #:thema conj) "synt") (let* ((verb-conj (conjugate verb "act" "sub" "Αόριστος" #:nopart)) (form (list-ref verb-conj 2)) @@ -383,13 +408,13 @@ WHERE i.verb='" verb "' AND i.voice='" voice "' AND i.mode='" mode (conj-info #:auxtense conj)))) (list (verb-info #:conj vinfo) (conjugation:attested verb-conj))))) (else ; (format #t "CONJ ~S~%" conj) (complement-verb-info vinfo verb voice (conj-info #:thema conj)) - (append (apply-flect conj vinfo) + (append (apply-flect conj vinfo verb) (list (verb-info #:conj vinfo) (verb-info #:attested vinfo))))))))) (define (conjugation:table conj) (list-head conj 6)) (define (conjugation:class conj) @@ -420,15 +445,15 @@ WHERE i.verb='" verb "' AND i.voice='" voice "' AND i.mode='" mode ("sub" . "Υποτακτική") ("imp" . "Προστακτική"))) (define (term x) (or (assoc-ref transtab x) x)) -(define (test-conjugation verb voice mode tense) - (format #t "~A ~A/~A/~A: " verb (term voice) (term mode) tense) - (let* ((result (conjugate verb voice mode tense)) +(define (test-conjugation verb voice mood tense) |