aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-06-07 22:15:26 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-06-07 22:19:26 +0300
commit2bae7da012e2125762855ce014e63345ecbbbb18 (patch)
tree61faec7672937f8fc420310da0ff531ce9c6a6bb
parent79447034e393dc5c7f01f3ec0ca1de7ded4f15e6 (diff)
downloadellinika-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.struct101
-rw-r--r--data/irregular-verbs.xml641
-rw-r--r--scm/.gitignore2
-rw-r--r--scm/Makefile.am7
-rw-r--r--scm/conjugator.scm189
-rw-r--r--scm/verbop.scm676
-rw-r--r--src/ellinika/elmorph.c66
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)