aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/db.struct75
-rw-r--r--scm/conjugator.scm141
-rw-r--r--src/ellinika/elmorph.c30
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;

Return to:

Send suggestions and report system problems to the System administrator.