diff options
-rw-r--r-- | data/db.struct | 75 | ||||
-rw-r--r-- | scm/conjugator.scm | 141 | ||||
-rw-r--r-- | src/ellinika/elmorph.c | 30 |
3 files changed, 149 insertions, 97 deletions
diff --git a/data/db.struct b/data/db.struct index 01507ce..c5c20af 100644 --- a/data/db.struct +++ b/data/db.struct @@ -162,2 +162,3 @@ CREATE TABLE newsart( +DROP TABLE IF EXISTS verbflect; CREATE TABLE verbflect( @@ -173,2 +174,3 @@ CREATE TABLE verbflect( +DROP TABLE IF EXISTS conjugation; CREATE TABLE conjugation( @@ -178,3 +180,3 @@ CREATE TABLE conjugation( tense varchar(128), - thema enum('pres','aor','pass','synt'), -- Ενεστώτα, Αόριστου, Αόριστου μεσοπαθητικής, syntethic + thema enum('pres','aor','sub','synt'), -- Ενεστώτα, Αόριστου, υποτακτικής, syntethic suffix char(32), @@ -190,2 +192,3 @@ CREATE TABLE conjugation( +DROP TABLE IF EXISTS participle; CREATE TABLE participle ( @@ -194,3 +197,3 @@ CREATE TABLE participle ( tense char(32), - thema enum('pres','aor','pass'), -- Ενεστώτα, Αόριστου, Αόριστου μεσοπαθητικής + thema enum('pres','aor','sub'), -- Ενεστώτα, Αόριστου, υποτακτικής suffix char(32), @@ -201,2 +204,3 @@ CREATE TABLE participle ( INSERT INTO verbflect VALUES +(0, NULL, NULL, NULL, NULL, NULL, NULL), -- Συζυγία Α' @@ -237,6 +241,6 @@ INSERT INTO conjugation VALUES ("A", "act", "ind", "Συντελεσμένος μέλλοντας", 'synt', NULL, 0, NULL, "θα", "έχω", "Ενεστώτας"), -("A", "act", "ind", "Μέλλοντας στιγμιαίος", 'aor', NULL, 1, "000000", "θα", NULL, NULL), +("A", "act", "ind", "Μέλλοντας στιγμιαίος", 'sub', NULL, 1, "000000", "θα", NULL, NULL), -- Υποτακτική ("A", "act", "sub", "Ενεστώτας", 'pres', NULL, 1, "000000", "να", NULL, NULL), -("A", "act", "sub", "Αόριστος", 'aor', NULL, 1, "000000", "να", NULL, NULL), +("A", "act", "sub", "Αόριστος", 'sub', NULL, 1, "000000", "να", NULL, NULL), ("A", "act", "sub", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Ενεστώτας"), @@ -244,3 +248,3 @@ INSERT INTO conjugation VALUES ("A", "act", "imp", "Ενεστώτας", 'pres', NULL, 8, "-3--3-", NULL, NULL, NULL), -("A", "act", "imp", "Αόριστος", 'aor', NULL, 9, "-0--0-", NULL, NULL, NULL), +("A", "act", "imp", "Αόριστος", 'sub', NULL, 9, "-0--0-", NULL, NULL, NULL), ("A", "act", "imp", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Ενεστώτας"), @@ -251,3 +255,3 @@ INSERT INTO conjugation VALUES ("A", "pas", "ind", "Μέλλοντας διαρκείας", 'pres', NULL, 11, "333333", "θα", NULL, NULL), -("A", "pas", "ind", "Αόριστος", 'pass', "ηκ", 2, "333333", NULL, NULL, NULL), +("A", "pas", "ind", "Αόριστος", 'aor', "ηκ", 2, "333333", NULL, NULL, NULL), ("A", "pas", "ind", "Παρακείμενος", 'synt', NULL, 0, NULL, NULL, "έχω", "Ενεστώτας"), @@ -255,6 +259,6 @@ INSERT INTO conjugation VALUES ("A", "pas", "ind", "Συντελεσμένος μέλλοντας", 'synt', NULL, 0, NULL, "θα", "έχω", "Ενεστώτας"), -("A", "pas", "ind", "Μέλλοντας στιγμιαίος", 'pass', NULL, 15, "111111", "θα", NULL, NULL), +("A", "pas", "ind", "Μέλλοντας στιγμιαίος", 'aor', NULL, 15, "111111", "θα", NULL, NULL), -- Υποτακτική ("A", "pas", "sub", "Ενεστώτας", 'pres', NULL, 11, "333333", "να", NULL, NULL), -("A", "pas", "sub", "Αόριστος", 'pass', NULL, 15, "111221", "να", NULL, NULL), +("A", "pas", "sub", "Αόριστος", 'aor', NULL, 15, "111221", "να", NULL, NULL), ("A", "pas", "sub", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"), @@ -263,3 +267,3 @@ INSERT INTO conjugation VALUES ("A", "pas", "imp", "Αόριστος", 'aor', NULL, 17, "-0----", NULL, NULL, NULL), -("A", "pas", "imp", "Αόριστος", 'pass', NULL, 18, "----2-", NULL, NULL, NULL), +("A", "pas", "imp", "Αόριστος", 'aor', NULL, 18, "----2-", NULL, NULL, NULL), ("A", "pas", "imp", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"), @@ -289,3 +293,3 @@ INSERT INTO conjugation VALUES ("B1", "pas", "ind", "Μέλλοντας διαρκείας", 'pres', NULL, 28, "ffffff", "θα", NULL, NULL), -("B1", "pas", "ind", "Αόριστος", 'pass', "ηκ", 2, "333333", NULL, NULL, NULL), +("B1", "pas", "ind", "Αόριστος", 'aor', "ηκ", 2, "333333", NULL, NULL, NULL), ("B1", "pas", "ind", "Παρακείμενος", 'synt', NULL, 0, NULL, NULL, "έχω", "Ενεστώτας"), @@ -293,6 +297,6 @@ INSERT INTO conjugation VALUES ("B1", "pas", "ind", "Συντελεσμένος μέλλοντας", 'synt', NULL, 0, NULL, "θα", "έχω", "Ενεστώτας"), -("B1", "pas", "ind", "Μέλλοντας στιγμιαίος", 'pass', NULL, 15, "ffffff", "θα", NULL, NULL), +("B1", "pas", "ind", "Μέλλοντας στιγμιαίος", 'aor', NULL, 15, "ffffff", "θα", NULL, NULL), -- Υποτακτική ("B1", "pas", "sub", "Ενεστώτας", 'pres', NULL, 28, "ffffff", "να", NULL, NULL), -("B1", "pas", "sub", "Αόριστος", 'pass', NULL, 15, "ffffff", "να", NULL, NULL), +("B1", "pas", "sub", "Αόριστος", 'aor', NULL, 15, "ffffff", "να", NULL, NULL), ("B1", "pas", "sub", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"), @@ -302,3 +306,3 @@ INSERT INTO conjugation VALUES ("B1", "pas", "imp", "Αόριστος", 'aor', NULL, 31, "-2----", NULL, NULL, NULL), -("B1", "pas", "imp", "Αόριστος", 'pass', NULL, 32, "----2-", NULL, NULL, NULL), +("B1", "pas", "imp", "Αόριστος", 'aor', NULL, 32, "----2-", NULL, NULL, NULL), @@ -331,3 +335,3 @@ INSERT INTO conjugation VALUES ("B2", "pas", "ind", "Μέλλοντας διαρκείας", 'pres', NULL, 34, "ffffff", "θα", NULL, NULL), -("B2", "pas", "ind", "Αόριστος", 'pass', "ηκ", 2, "333333", NULL, NULL, NULL), +("B2", "pas", "ind", "Αόριστος", 'aor', "ηκ", 2, "333333", NULL, NULL, NULL), ("B2", "pas", "ind", "Παρακείμενος", 'synt', NULL, 0, NULL, NULL, "έχω", "Ενεστώτας"), @@ -335,6 +339,6 @@ INSERT INTO conjugation VALUES ("B2", "pas", "ind", "Συντελεσμένος μέλλοντας", 'synt', NULL, 0, NULL, "θα", "έχω", "Ενεστώτας"), -("B2", "pas", "ind", "Μέλλοντας στιγμιαίος", 'pass', NULL, 15, "ffffff", "θα", NULL, NULL), +("B2", "pas", "ind", "Μέλλοντας στιγμιαίος", 'aor', NULL, 15, "ffffff", "θα", NULL, NULL), -- Υποτακτική ("B2", "pas", "sub", "Ενεστώτας", 'pres', NULL, 34, "ffffff", "να", NULL, NULL), -("B2", "pas", "sub", "Αόριστος", 'pass', NULL, 15, "ffffff", "να", NULL, NULL), +("B2", "pas", "sub", "Αόριστος", 'aor', NULL, 15, "ffffff", "να", NULL, NULL), ("B2", "pas", "sub", "Παρακείμενος", 'synt', NULL, 0, NULL, "να", "έχω", "Παρατατικός"), @@ -344,3 +348,3 @@ INSERT INTO conjugation VALUES ("B2", "pas", "imp", "Αόριστος", 'aor', NULL, 31, "-2----", NULL, NULL, NULL), -("B2", "pas", "imp", "Αόριστος", 'pass', NULL, 32, "----2-", NULL, NULL, NULL), +("B2", "pas", "imp", "Αόριστος", 'aor', NULL, 32, "----2-", NULL, NULL, NULL), @@ -368,9 +372,34 @@ INSERT INTO participle VALUES +DROP TABLE IF EXISTS verb; CREATE TABLE verb( - word varchar(128), -- REL 10 + verb varchar(128), -- REL 10 conj char(2), -- REL 9 - present varchar(128), -- θέμα ενεστώτα - aorist varchar(128), -- θέμα αόριστου - pass varchar(128), -- θέμα αόριστου μεσοπαθητικής - INDEX(word) -);
\ No newline at end of file + augment char(1), + accmap char(7), + 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'), +('θέλω','A','η',NULL), +('έχω','A',NULL,NULL), +('ξέρω','A','η',NULL) +; + +INSERT INTO irregular_root VALUES +('βρίσκω','act','aor','βρήκ'), +('βρίσκω','act','sub','βρ'), +('βρίσκω','pas','aor','βρέθ'), +('βρίσκω','pas','sub','βρέθ'), +('θέλω','act','aor','θέλησ'), +('έχω','act', 'aor', 'είχ') +; + diff --git a/scm/conjugator.scm b/scm/conjugator.scm index 19642b3..3015b13 100644 --- a/scm/conjugator.scm +++ b/scm/conjugator.scm @@ -54,7 +54,5 @@ (list "A" + #f "ε" - (list - (cons "pres" root) - (cons "aor" (elstr-thema-aoristoy root)) - (cons "pass" root)))))))) + #f)))))) @@ -65,5 +63,4 @@ (string-append - "SELECT conj,augment,present,aorist,pass FROM verb WHERE word='" - verb - "'")))) + "SELECT conj,accmap,augment FROM verb \ +WHERE verb='" verb "'")))) (if (null? vdb) @@ -72,8 +69,25 @@ (list - (car x) - (or (list-ref x 1) "ε") - (list - (cons "pres" (list-ref x 2)) - (cons "aor" (list-ref x 3)) - (cons "pass" (list-ref x 4))))))))) + (list-ref x 0) + (list-ref x 1) + (or (list-ref x 2) "ε") + #f)))))) + +(define (complement-verb-info vinfo verb voice thema) +; (format #t "COMPLEMENT ~S~%" thema) + (let ((result (my-sql-query + (dict-connect) + (string-append + "SELECT root FROM irregular_root \ +WHERE verb='" verb "' AND voice='" voice "' AND thema='" thema "'")))) + (list-set! vinfo 3 + (if (not (null? result)) + (caar result) + (let ((root (elstr-trim (string->elstr verb) -1))) + (cond + ((string=? thema "pres") + root) + ((or (string=? thema "aor") (string=? thema "sub")) + (elstr-thema-aoristoy root)) + (else + #f))))))) @@ -83,6 +97,8 @@ (list-ref v 0)) - ((verb-info #:augment v) + ((verb-info #:accmap v) (list-ref v 1)) + ((verb-info #:augment v) + (list-ref v 2)) ((verb-info #:root v) - (list-ref v 2)))) + (list-ref v 3)))) @@ -141,16 +157,10 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode -(define (force-accent str) - (if (and str (= (elstr-accented-syllable str) 0)) - (let ((nsyl (elstr-number-of-syllables str))) - (cond - ((= nsyl 1) - str) - (else - (elstr-set-accent str 2)))) - str)) - -(define (apply-flect root conj vinfo) - (let ((suffix (or (conj-info #:suffix conj) "")) - (accmap (string->list (or (conj-info #:accmap conj) "000000"))) +(define (apply-flect conj vinfo) + (let ((root (verb-info #:root vinfo)) + (suffix (or (conj-info #:suffix conj) "")) + (accmap (string->list (or (verb-info #:accmap vinfo) + (conj-info #:accmap conj) + "000000"))) (augment "")) +; (format #t "ROOT ~S, ACCMAP ~S~%" root accmap) (cond @@ -164,6 +174,18 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode ((char=? acc #\0) - (force-accent - (elstr-append - root - (elstr-deaccent (elstr-append suffix flect))))) + (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)))) ((char=? acc #\f) @@ -211,3 +233,3 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode (let ((form (list-ref - (conjugate verb "act" "sub" "Ενεστώτας" #:nopart) 2)) + (conjugate verb "act" "sub" "Αόριστος" #:nopart) 2)) (part (conj-info #:particle conj))) @@ -222,17 +244,5 @@ WHERE c.conj='" conj "' AND c.voice='" voice "' AND c.mode='" mode (else - (let ((root #f) - (exception (my-sql-query - (dict-connect) - (string-append - "SELECT root,accmap FROM irregular_verb \ -WHERE word='" verb "' AND voice='" voice "' AND tense='" tense "'")))) - (if (not (null? exception)) - (let ((x (car exception))) - (set! root (list-ref x 0)) - (let ((accmap (list-ref x 1))) - (if accmap - (list-set! conj 2 accmap)))) - (set! root (assoc-ref (verb-info #:root vinfo) - (conj-info #:thema conj)))) - (apply-flect root conj vinfo)))))) +; (format #t "CONJ ~S~%" conj) + (complement-verb-info vinfo verb voice (conj-info #:thema conj)) + (apply-flect conj vinfo))))) @@ -244,16 +254,23 @@ WHERE word='" verb "' AND voice='" voice "' AND tense='" tense "'")))) -;(display (conjugate "έχω" "act" "ind" "Ενεστώτας")) -;(display (conjugate "ανοίγω" "act" "ind" "Ενεστώτας")) -;(display (conjugate "ανοίγω" "act" "ind" "Αόριστος")) -;(display (conjugate "δένω" "act" "ind" "Αόριστος")) -;(display (conjugate "βρίσκω" "act" "ind" "Ενεστώτας")) -;(display (conjugate "βρίσκω" "act" "ind" "Αόριστος")) -;(display (conjugate "βρίσκω" "act" "ind" "Μέλλοντας στιγμιαίος")) -;(display (conjugate "βρίσκω" "pas" "ind" "Αόριστος")) -;(display (conjugate "θέλω" "act" "ind" "Αόριστος")) -;(display (conjugate "θέλω" "act" "ind" "Παρατατικός")) -;(display (conjugate "βρίσκω" "act" "ind" "Παρακείμενος")) -;(display (conjugate "βρίσκω" "act" "sub" "Παρακείμενος")) -;(display (conjugate "βρίσκω" "act" "sub" "Ενεστώτας")) -(display (conjugate "βρίσκω" "act" "sub" "Αόριστος")) +(define (test-conjugation verb voice mode tense) + (format #t "~A ~A ~A ~A: " verb voice mode tense) + (display (map force-string (conjugate verb voice mode tense))) + (newline) + (gc)) + +(test-conjugation "έχω" "act" "ind" "Ενεστώτας") +(test-conjugation "ανοίγω" "act" "ind" "Ενεστώτας") +(test-conjugation "ανοίγω" "act" "ind" "Αόριστος") +(test-conjugation "δένω" "act" "ind" "Αόριστος") +(test-conjugation "θέλω" "act" "ind" "Αόριστος") +(test-conjugation "θέλω" "act" "ind" "Παρατατικός") +(test-conjugation "βρίσκω" "act" "ind" "Ενεστώτας") +(test-conjugation "βρίσκω" "act" "ind" "Αόριστος") +(test-conjugation "βρίσκω" "act" "ind" "Μέλλοντας στιγμιαίος") +(test-conjugation "βρίσκω" "pas" "ind" "Αόριστος") +(test-conjugation "βρίσκω" "act" "sub" "Ενεστώτας") +(test-conjugation "βρίσκω" "act" "sub" "Αόριστος") +(test-conjugation "βρίσκω" "act" "ind" "Παρακείμενος") +(test-conjugation "βρίσκω" "act" "sub" "Παρακείμενος") + (newline) diff --git a/src/ellinika/elmorph.c b/src/ellinika/elmorph.c index 75e42f9..faeeb49 100644 --- a/src/ellinika/elmorph.c +++ b/src/ellinika/elmorph.c @@ -42,3 +42,4 @@ _elstr_syllabize(struct elstr *elstr) unsigned *sylmap; - unsigned i, nsyl = 0, accsyl = 0, accchr = 0; + unsigned i, nsyl = 0, accchr = 0; + int accsyl = -1; int dstate = 0; @@ -46,5 +47,7 @@ _elstr_syllabize(struct elstr *elstr) - if (!elstr->sylmap) - elstr->sylmap = scm_gc_malloc(sizeof(sylmap[0])*elstr->len, - "syllable map"); + if (!elstr->sylmap) { + elstr->sylmap = calloc(elstr->len, sizeof(sylmap[0])); + if (!elstr->sylmap) + scm_memory_error("_elstr_syllabize"); + } sylmap = elstr->sylmap; @@ -69,3 +72,3 @@ _elstr_syllabize(struct elstr *elstr) sylmap[nsyl++] = i - 1; - else + else if (nsyl) sylmap[nsyl-1] = i - 1; @@ -73,3 +76,3 @@ _elstr_syllabize(struct elstr *elstr) elstr->acc_pos = accchr; - elstr->acc_syl = nsyl - accsyl; + elstr->acc_syl = (accsyl >= 0) ? nsyl - accsyl : 0; } @@ -116,7 +119,10 @@ _elstr_dup(struct elstr *elstr) scm_memory_error("_elstr_dup"); - elnew->sylmap = calloc(elstr->nsyl, sizeof(elnew->sylmap[0])); - if (!elnew->sylmap) { - free(elnew->str); - scm_memory_error("_elstr_dup"); - } + if (elstr->sylmap) { + elnew->sylmap = calloc(elstr->nsyl, sizeof(elnew->sylmap[0])); + if (!elnew->sylmap) { + free(elnew->str); + scm_memory_error("_elstr_dup"); + } + } else + elnew->sylmap = NULL; memcpy(elnew->str, elstr->str, sizeof(elstr->str[0]) * elstr->len); @@ -153,3 +159,3 @@ _elstr_free(SCM smob) free(elstr->sylmap); - free(elstr); + scm_gc_free(elstr, sizeof(struct elstr), "elstr"); return 0; |