mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-13 23:09:31 -06:00
Estonian - the 29th complete RGL language. Copied from Kaarel Kaljurand's and Inari Listenmaa's repository in https://github.com/GF-Estonian/GF-Estonian, where later developments will continue to take place.
This commit is contained in:
@@ -37,6 +37,7 @@ langsCoding = [
|
||||
(("danish", "Dan"),"Scand"),
|
||||
(("dutch", "Dut"),""),
|
||||
(("english", "Eng"),""),
|
||||
(("estonian", "Est"),""),
|
||||
(("finnish", "Fin"),""),
|
||||
(("french", "Fre"),"Romance"),
|
||||
(("german", "Ger"),""),
|
||||
@@ -76,7 +77,7 @@ langsLangAll = langs
|
||||
langsLang = langs `except` langsIncomplete
|
||||
|
||||
-- languagues that have notpresent marked
|
||||
langsPresent = langsLang `except` ["Chi","Gre","Heb","Jpn","Mlt","Nep","Pes","Snd","Tha","Thb"]
|
||||
langsPresent = langsLang `except` ["Chi","Est","Gre","Heb","Jpn","Mlt","Nep","Pes","Snd","Tha","Thb"]
|
||||
|
||||
-- languages for which Lang can be compiled but which are incomplete
|
||||
langsIncomplete = ["Amh","Ara","Heb","Lat","Tur","Thb"]
|
||||
|
||||
6
lib/src/api/CombinatorsEst.gf
Normal file
6
lib/src/api/CombinatorsEst.gf
Normal file
@@ -0,0 +1,6 @@
|
||||
--# -path=.:alltenses:prelude
|
||||
|
||||
resource CombinatorsEst = Combinators with
|
||||
(Cat = CatEst),
|
||||
(Structural = StructuralEst),
|
||||
(Constructors = ConstructorsEst) ;
|
||||
3
lib/src/api/ConstructorsEst.gf
Normal file
3
lib/src/api/ConstructorsEst.gf
Normal file
@@ -0,0 +1,3 @@
|
||||
--# -path=.:alltenses:prelude
|
||||
|
||||
resource ConstructorsEst = Constructors with (Grammar = GrammarEst) ;
|
||||
5
lib/src/api/SymbolicEst.gf
Normal file
5
lib/src/api/SymbolicEst.gf
Normal file
@@ -0,0 +1,5 @@
|
||||
--# -path=.:present:mathematical:prelude
|
||||
|
||||
resource SymbolicEst = Symbolic with
|
||||
(Symbol = SymbolEst),
|
||||
(Grammar = GrammarEst) ;
|
||||
4
lib/src/api/SyntaxEst.gf
Normal file
4
lib/src/api/SyntaxEst.gf
Normal file
@@ -0,0 +1,4 @@
|
||||
--# -path=.:alltenses:prelude
|
||||
|
||||
instance SyntaxEst of Syntax = ConstructorsEst, CatEst, StructuralEst, CombinatorsEst ;
|
||||
|
||||
3
lib/src/api/TryEst.gf
Normal file
3
lib/src/api/TryEst.gf
Normal file
@@ -0,0 +1,3 @@
|
||||
--# -path=.:alltenses:prelude
|
||||
|
||||
resource TryEst = SyntaxEst, LexiconEst, ParadigmsEst - [mkAdv,mkAdN,mkDet,mkQuant,mkPConj] ;
|
||||
64
lib/src/estonian/AdjectiveEst.gf
Normal file
64
lib/src/estonian/AdjectiveEst.gf
Normal file
@@ -0,0 +1,64 @@
|
||||
concrete AdjectiveEst of Adjective = CatEst ** open ResEst, Prelude in {
|
||||
|
||||
-- gfc size from 2864336 to 6786 - i.e. factor 422
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lin
|
||||
|
||||
PositA a = {
|
||||
s = \\_,nf => a.s ! Posit ! AN nf ;
|
||||
infl = a.infl
|
||||
} ;
|
||||
ComparA a np = {
|
||||
s = \\isMod,af => case isMod of {
|
||||
True => np.s ! NPCase Elat ++ a.s ! Compar ! AN af ; -- minust suurem
|
||||
_ => a.s ! Compar ! AN af ++ "kui" ++ np.s ! NPCase Nom -- suurem kui mina
|
||||
} ;
|
||||
infl = Regular ; --a.infl
|
||||
} ;
|
||||
|
||||
CAdvAP ad ap np = {
|
||||
s = \\m,af => ad.s ++ ap.s ! m ! af ++ ad.p ++ np.s ! NPCase Nom ;
|
||||
infl = ap.infl
|
||||
} ;
|
||||
UseComparA a = {
|
||||
s = \\_,nf => a.s ! Compar ! AN nf ;
|
||||
infl = Regular ; --a.infl
|
||||
} ;
|
||||
|
||||
-- $SuperlA$ belongs to determiner syntax in $Noun$.
|
||||
AdjOrd ord = {
|
||||
s = \\_ => ord.s ;
|
||||
infl = Regular
|
||||
} ;
|
||||
|
||||
|
||||
ComplA2 adj np = {
|
||||
s = \\isMod,af =>
|
||||
preOrPost isMod (appCompl True Pos adj.c2 np) (adj.s ! Posit ! AN af) ;
|
||||
infl = adj.infl
|
||||
} ;
|
||||
|
||||
ReflA2 adj = {
|
||||
s = \\isMod,af =>
|
||||
preOrPost isMod
|
||||
(appCompl True Pos adj.c2 (reflPron (agrP3 Sg))) (adj.s ! Posit ! AN af) ;
|
||||
infl = adj.infl
|
||||
} ;
|
||||
|
||||
SentAP ap sc = {
|
||||
s = \\b,a => ap.s ! b ! a ++ sc.s ;
|
||||
infl = ap.infl
|
||||
} ;
|
||||
|
||||
AdAP ada ap = {
|
||||
s = \\b,af => ada.s ++ ap.s ! b ! af ;
|
||||
infl = ap.infl
|
||||
} ;
|
||||
|
||||
UseA2 a = {
|
||||
s = \\_,nf => a.s ! Posit ! AN nf ;
|
||||
infl = a.infl
|
||||
} ;
|
||||
|
||||
}
|
||||
25
lib/src/estonian/AdverbEst.gf
Normal file
25
lib/src/estonian/AdverbEst.gf
Normal file
@@ -0,0 +1,25 @@
|
||||
concrete AdverbEst of Adverb = CatEst ** open ResEst, Prelude in {
|
||||
|
||||
flags coding=utf8;
|
||||
|
||||
lin
|
||||
PositAdvAdj a = {s = a.s ! Posit ! AAdv} ;
|
||||
ComparAdvAdj cadv a np = {
|
||||
s = cadv.s ++ a.s ! Posit ! AAdv ++ cadv.p ++ np.s ! NPCase Nom
|
||||
} ;
|
||||
ComparAdvAdjS cadv a s = {
|
||||
s = cadv.s ++ a.s ! Posit ! AAdv ++ cadv.p ++ s.s
|
||||
} ;
|
||||
|
||||
PrepNP prep np = {s = preOrPost prep.isPre prep.s (np.s ! prep.c)} ;
|
||||
|
||||
AdAdv = cc2 ;
|
||||
|
||||
PositAdAAdj a = {s = a.s ! Posit ! AN (NCase Sg Gen)} ; -- älyttömän
|
||||
|
||||
SubjS = cc2 ;
|
||||
----b AdvSC s = s ;
|
||||
|
||||
AdnCAdv cadv = {s = cadv.s ++ "kui"} ;
|
||||
|
||||
}
|
||||
6
lib/src/estonian/AllEst.gf
Normal file
6
lib/src/estonian/AllEst.gf
Normal file
@@ -0,0 +1,6 @@
|
||||
--# -path=.:../abstract:../common:prelude
|
||||
|
||||
concrete AllEst of AllEstAbs =
|
||||
LangEst, -- - [SlashV2VNP,SlashVV, TFut], ---- to speed up linking; to remove spurious parses
|
||||
ExtraEst -- - [ProDrop, ProDropPoss, S_OSV, S_VSO, S_ASV] -- to exclude spurious parses
|
||||
** {} ;
|
||||
4
lib/src/estonian/AllEstAbs.gf
Normal file
4
lib/src/estonian/AllEstAbs.gf
Normal file
@@ -0,0 +1,4 @@
|
||||
abstract AllEstAbs =
|
||||
Lang,
|
||||
ExtraEstAbs
|
||||
** {} ;
|
||||
99
lib/src/estonian/CatEst.gf
Normal file
99
lib/src/estonian/CatEst.gf
Normal file
@@ -0,0 +1,99 @@
|
||||
concrete CatEst of Cat = CommonX ** open HjkEst, ResEst, Prelude in {
|
||||
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lincat
|
||||
|
||||
-- Tensed/Untensed
|
||||
|
||||
S = {s : Str} ; --TODO {s : Order => Str}, like in German?
|
||||
QS = {s : Str} ;
|
||||
RS = {s : Agr => Str ; c : NPForm} ;
|
||||
SSlash = {s : Str ; c2 : Compl} ;
|
||||
|
||||
-- Sentence
|
||||
|
||||
Cl = {s : ResEst.Tense => Anteriority => Polarity => SType => Str} ;
|
||||
ClSlash = {s : ResEst.Tense => Anteriority => Polarity => Str ; c2 : Compl} ;
|
||||
Imp = {s : Polarity => Agr => Str} ;
|
||||
|
||||
-- Question
|
||||
|
||||
QCl = {s : ResEst.Tense => Anteriority => Polarity => Str} ;
|
||||
IP = {s : NPForm => Str ; n : Number} ;
|
||||
IComp = {s : Agr => Str} ;
|
||||
IDet = {s : Case => Str ; n : Number ; isNum : Bool} ;
|
||||
IQuant = {s : Number => Case => Str} ;
|
||||
|
||||
-- Relative
|
||||
|
||||
RCl = {s : ResEst.Tense => Anteriority => Polarity => Agr => Str ; c : NPForm} ;
|
||||
RP = {s : Number => NPForm => Str ; a : RAgr} ;
|
||||
|
||||
-- Verb
|
||||
|
||||
VP = ResEst.VP ;
|
||||
VPSlash = ResEst.VP ** {c2 : Compl} ;
|
||||
Comp = {s : Agr => Str} ;
|
||||
|
||||
-- Adjective
|
||||
|
||||
-- The $Bool$ in s tells whether usage is modifying (as opposed to
|
||||
-- predicative), e.g. "x on suurem kui y" vs. "y:st suurem arv".
|
||||
-- The $Infl$ in infl tells whether the adjective inflects as a
|
||||
-- modifier: e.g. "väsinud mehele" vs. "mees muutus väsinuks".
|
||||
|
||||
AP = {s : Bool => NForm => Str ; infl : Infl} ;
|
||||
|
||||
-- Noun
|
||||
|
||||
CN = {s : NForm => Str} ;
|
||||
Pron = {s : NPForm => Str ; a : Agr} ;
|
||||
NP = {s : NPForm => Str ; a : Agr ; isPron : Bool} ;
|
||||
Det = {
|
||||
s : Case => Str ; -- minun kolme
|
||||
sp : Case => Str ; -- se (substantival form)
|
||||
n : Number ; -- Pl (agreement feature for verb)
|
||||
isNum : Bool ; -- True (a numeral is present)
|
||||
isDef : Bool -- True (verb agrees in Pl, Nom is not Part) --I: actually, can we get rid of this?
|
||||
} ;
|
||||
---- QuantSg, QuantPl = {s : Case => Str ; isDef : Bool} ;
|
||||
Ord = {s : NForm => Str} ;
|
||||
Predet = {s : Number => NPForm => Str} ;
|
||||
Quant = {s,sp : Number => Case => Str ; isDef : Bool} ;
|
||||
Card = {s : Number => Case => Str ; n : Number} ;
|
||||
Num = {s : Number => Case => Str ; isNum : Bool ; n : Number} ;
|
||||
|
||||
-- Numeral
|
||||
|
||||
Numeral = {s : CardOrd => Str ; n : Number} ;
|
||||
Digits = {s : CardOrd => Str ; n : Number} ;
|
||||
|
||||
-- Structural
|
||||
|
||||
Conj = {s1,s2 : Str ; n : Number} ;
|
||||
----b DConj = {s1,s2 : Str ; n : Number} ;
|
||||
Subj = {s : Str} ;
|
||||
Prep = Compl ;
|
||||
|
||||
-- Open lexical classes, e.g. Lexicon
|
||||
|
||||
V, VS, VQ = Verb1 ; -- = {s : VForm => Str ; sc : Case} ;
|
||||
V2, VA, V2Q, V2S = Verb1 ** {c2 : Compl} ;
|
||||
V2A = Verb1 ** {c2, c3 : Compl} ;
|
||||
VV = Verb1 ** {vi : InfForm} ; ---- infinitive form
|
||||
V2V = Verb1 ** {c2 : Compl ; vi : InfForm} ; ---- infinitive form
|
||||
V3 = Verb1 ** {c2, c3 : Compl} ;
|
||||
|
||||
A = Adjective ** {infl : Infl} ;
|
||||
A2 = A ** {c2 : Compl} ;
|
||||
|
||||
N = Noun ;
|
||||
N2 = CommonNoun ** {c2 : Compl ; isPre : Bool ; lock_N2 : {}} ;
|
||||
N3 = CommonNoun ** {c2,c3 : Compl ; isPre,isPre2 : Bool ; lock_N3 : {}} ;
|
||||
PN = {s : Case => Str} ;
|
||||
|
||||
oper Verb1 = Verb ** { sc : NPForm} ; --what is this for? --subject case, i.e. "ma näen kassi"/"mul on kass"
|
||||
|
||||
|
||||
}
|
||||
109
lib/src/estonian/ConjunctionEst.gf
Normal file
109
lib/src/estonian/ConjunctionEst.gf
Normal file
@@ -0,0 +1,109 @@
|
||||
concrete ConjunctionEst of Conjunction =
|
||||
CatEst ** open ResEst, Coordination, Prelude in {
|
||||
|
||||
flags optimize=all_subs ;
|
||||
|
||||
lin
|
||||
|
||||
ConjS = conjunctDistrSS ;
|
||||
|
||||
ConjAdv = conjunctDistrSS ;
|
||||
|
||||
ConjNP conj ss = conjunctDistrTable NPForm conj ss ** {
|
||||
a = conjAgr (Ag conj.n P3) ss.a ; -- P3 is the maximum
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
-- ConjAP conj ss = conjunctDistrTable2 Bool NForm conj ss ** {
|
||||
ConjAP conj ss = conjunctDistrTableAdj conj ss ** {
|
||||
infl = True ;
|
||||
lock_AP = <>
|
||||
} ;
|
||||
|
||||
ConjRS conj ss = conjunctDistrTable Agr conj ss ** {
|
||||
c = ss.c
|
||||
} ;
|
||||
|
||||
-- These fun's are generated from the list cat's.
|
||||
|
||||
BaseS = twoSS ;
|
||||
ConsS = consrSS comma ;
|
||||
BaseAdv = twoSS ;
|
||||
ConsAdv = consrSS comma ;
|
||||
BaseNP x y = twoTable NPForm x y ** {a = conjAgr x.a y.a} ;
|
||||
ConsNP xs x = consrTable NPForm comma xs x ** {a = conjAgr xs.a x.a} ;
|
||||
BaseAP x y = twoTableAdj x y ;
|
||||
ConsAP xs x = consrTableAdj comma x xs ;
|
||||
-- BaseAP x y = twoTable2 Bool NForm x y ;
|
||||
-- ConsAP xs x = consrTable2 Bool NForm comma xs x ;
|
||||
BaseRS x y = twoTable Agr x y ** {c = y.c} ;
|
||||
ConsRS xs x = consrTable Agr comma xs x ** {c = xs.c} ;
|
||||
|
||||
lincat
|
||||
[S] = {s1,s2 : Str} ;
|
||||
[Adv] = {s1,s2 : Str} ;
|
||||
[NP] = {s1,s2 : NPForm => Str ; a : Agr} ;
|
||||
[AP] = {s1,s2 : {s : Bool => NForm => Str ; infl : Infl }} ;
|
||||
[RS] = {s1,s2 : Agr => Str ; c : NPForm} ;
|
||||
|
||||
oper
|
||||
--Modified from prelude/Coordination.gf generic functions
|
||||
twoTableAdj : (_,_ : AP) -> [AP] = \x,y ->
|
||||
lin ListAP {
|
||||
s1 = x ;
|
||||
s2 = y ;
|
||||
lock_ListAP = <>
|
||||
} ;
|
||||
|
||||
consrTableAdj : Str -> [AP] -> {s : Bool => NForm => Str ; infl : Infl} -> [AP] = \c,xs,x ->
|
||||
let
|
||||
ap1 = xs.s1 ;
|
||||
ap2 = xs.s2
|
||||
in
|
||||
lin ListAP {s1 =
|
||||
{s = \\isMod,nf =>
|
||||
case isMod of {
|
||||
True => case <ap1.infl, ap2.infl> of {
|
||||
<(Participle|Invariable),(Participle|Invariable)> =>
|
||||
ap1.s ! isMod ! (NCase Sg Nom) ++ c ++ ap2.s ! isMod ! (NCase Sg Nom) ; --valmis ja täis kassid
|
||||
<(Participle|Invariable),Regular> =>
|
||||
ap1.s ! isMod ! (NCase Sg Nom) ++ c++ ap2.s ! isMod ! nf ; --valmis ja suured kassid
|
||||
<Regular,(Participle|Invariable)> =>
|
||||
ap1.s ! isMod ! nf ++ c ++ ap2.s ! isMod ! (NCase Sg Nom) ; --suured ja valmis kassid
|
||||
_ => ap1.s ! isMod ! nf ++ c ++ ap2.s ! isMod ! nf --suured ja mustad kassid
|
||||
} ;
|
||||
False => ap1.s ! isMod ! nf ++ c ++ ap2.s ! isMod ! nf --kassid on valmid ja suured
|
||||
} ;
|
||||
infl = Regular ;
|
||||
lock_AP = <> } ;
|
||||
s2 = x ;
|
||||
lock_ListAP = <>
|
||||
} ;
|
||||
|
||||
|
||||
conjunctDistrTableAdj : ConjunctionDistr -> [AP] -> AP = \or,xs ->
|
||||
let
|
||||
ap1 = xs.s1 ;
|
||||
ap2 = xs.s2 ;
|
||||
in
|
||||
lin AP {s = \\isMod,nf =>
|
||||
case isMod of {
|
||||
True => case <ap1.infl, ap2.infl> of {
|
||||
<(Participle|Invariable),(Participle|Invariable)> =>
|
||||
or.s1 ++ ap1.s ! isMod ! (NCase Sg Nom) ++
|
||||
or.s2 ++ ap2.s ! isMod ! (NCase Sg Nom) ;
|
||||
<(Participle|Invariable),Regular> =>
|
||||
or.s1 ++ ap1.s ! isMod ! (NCase Sg Nom) ++
|
||||
or.s2 ++ ap2.s ! isMod ! nf ;
|
||||
<Regular,(Participle|Invariable)> =>
|
||||
or.s1 ++ ap1.s ! isMod ! nf ++
|
||||
or.s2 ++ ap2.s ! isMod ! (NCase Sg Nom) ;
|
||||
_ => or.s1 ++ ap1.s ! isMod ! nf ++ or.s2 ++ ap2.s ! isMod ! nf
|
||||
} ;
|
||||
False => or.s1 ++ ap1.s ! isMod ! nf ++ or.s2 ++ ap2.s ! isMod ! nf
|
||||
} ;
|
||||
infl = Regular ;
|
||||
lock_AP = <>
|
||||
} ;
|
||||
|
||||
}
|
||||
53105
lib/src/estonian/DictEst.gf
Normal file
53105
lib/src/estonian/DictEst.gf
Normal file
File diff suppressed because it is too large
Load Diff
53095
lib/src/estonian/DictEstAbs.gf
Normal file
53095
lib/src/estonian/DictEstAbs.gf
Normal file
File diff suppressed because it is too large
Load Diff
239
lib/src/estonian/ExtraEst.gf
Normal file
239
lib/src/estonian/ExtraEst.gf
Normal file
@@ -0,0 +1,239 @@
|
||||
concrete ExtraEst of ExtraEstAbs = CatEst **
|
||||
open ResEst, MorphoEst, Coordination, Prelude, NounEst, StructuralEst, (R = ParamX) in {
|
||||
|
||||
lin
|
||||
GenNP np = {
|
||||
s,sp = \\_,_ => np.s ! NPCase Gen ;
|
||||
isNum = False ;
|
||||
isDef = True ; --- "Jussin kolme autoa ovat" ; thus "...on" is missing
|
||||
isNeg = False
|
||||
} ;
|
||||
|
||||
GenCN n1 n2 = {s = \\nf => n1.s ! NPCase Gen ++ n2.s ! nf} ;
|
||||
|
||||
lincat
|
||||
VPI = {s : Str} ;
|
||||
[VPI] = {s1,s2 : Str} ;
|
||||
lin
|
||||
BaseVPI = twoSS ;
|
||||
ConsVPI = consrSS comma ;
|
||||
|
||||
MkVPI vp = {s = infVP (NPCase Nom) Pos (agrP3 Sg) vp InfDa} ;
|
||||
ConjVPI = conjunctDistrSS ;
|
||||
ComplVPIVV vv vpi =
|
||||
insertObj (\\_,_,_ => vpi.s) (predV vv) ;
|
||||
|
||||
lincat
|
||||
VPS = {
|
||||
s : Agr => Str ;
|
||||
sc : NPForm ; --- can be different for diff parts
|
||||
} ;
|
||||
|
||||
[VPS] = {
|
||||
s1,s2 : Agr => Str ;
|
||||
sc : NPForm ; --- take the first: minä osaan kutoa ja täytyy virkata
|
||||
} ;
|
||||
|
||||
lin
|
||||
BaseVPS x y = twoTable Agr x y ** {sc = x.sc} ;
|
||||
ConsVPS x y = consrTable Agr comma x y ** {sc = x.sc} ;
|
||||
|
||||
ConjVPS conj ss = conjunctDistrTable Agr conj ss ** {
|
||||
sc = ss.sc
|
||||
} ;
|
||||
|
||||
MkVPS t p vp = { -- Temp -> Pol -> VP -> VPS ;
|
||||
s = \\a => let vps = vp.s ! VIFin t.t ! t.a ! p.p ! a
|
||||
in
|
||||
t.s ++ p.s ++
|
||||
vps.fin ++ vps.inf ++
|
||||
vp.s2 ! True ! p.p ! a ++
|
||||
vp.adv ! p.p ++
|
||||
vp.ext ;
|
||||
sc = vp.sc ;
|
||||
} ;
|
||||
|
||||
PredVPS np vps = { -- NP -> VPS -> S ;
|
||||
s = subjForm np vps.sc Pos ++ vps.s ! np.a
|
||||
} ;
|
||||
|
||||
AdvExistNP adv np =
|
||||
mkClause (\_ -> adv.s) np.a (insertObj
|
||||
(\\_,b,_ => np.s ! NPCase Nom) (predV (verbOlema ** {sc = NPCase Nom}))) ;
|
||||
|
||||
RelExistNP prep rp np = {
|
||||
s = \\t,ant,bo,ag =>
|
||||
let
|
||||
n = complNumAgr ag ;
|
||||
cl = mkClause
|
||||
(\_ -> appCompl True Pos prep (rp2np n rp))
|
||||
np.a
|
||||
(insertObj
|
||||
(\\_,b,_ => np.s ! NPCase Nom)
|
||||
(predV (verbOlema ** {sc = NPCase Nom}))) ;
|
||||
in
|
||||
cl.s ! t ! ant ! bo ! SDecl ;
|
||||
c = NPCase Nom
|
||||
} ;
|
||||
|
||||
AdvPredNP adv v np =
|
||||
mkClause (\_ -> adv.s) np.a (insertObj
|
||||
(\\_,b,_ => np.s ! NPCase Nom) (predV v)) ;
|
||||
|
||||
ICompExistNP adv np =
|
||||
let cl = mkClause (\_ -> adv.s ! np.a) np.a (insertObj
|
||||
(\\_,b,_ => np.s ! NPCase Nom) (predV (verbOlema ** {sc = NPCase Nom}))) ;
|
||||
in {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
|
||||
IAdvPredNP iadv v np =
|
||||
let cl = mkClause (\_ -> iadv.s) np.a (insertObj
|
||||
(\\_,b,_ => np.s ! v.sc) (predV v)) ;
|
||||
in {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
|
||||
-- i_implicPron = mkPronoun [] "minun" "minua" "minuna" "minuun" Sg P1 ;
|
||||
whatPart_IP = {
|
||||
s = table {
|
||||
NPCase Nom | NPAcc => "mitä" ;
|
||||
c => whatSg_IP.s ! c
|
||||
} ;
|
||||
n = Sg
|
||||
} ;
|
||||
|
||||
PartCN cn =
|
||||
let
|
||||
acn = DetCN (DetQuant IndefArt NumSg) cn
|
||||
in {
|
||||
s = table {
|
||||
NPCase Nom | NPAcc => acn.s ! NPCase Part ;
|
||||
c => acn.s ! c
|
||||
} ;
|
||||
a = acn.a ;
|
||||
isPron = False ; isNeg = False
|
||||
} ;
|
||||
|
||||
vai_Conj = {s1 = [] ; s2 = "vai" ; n = Sg} ;
|
||||
|
||||
--The reflexive possessive "oma"
|
||||
--for "ta näeb oma koera" instead of *"tema koera"
|
||||
OmaPoss = {s,sp = \\_,_ => "oma" ; isDef,isNeg,isNum = False} ;
|
||||
|
||||
ma_Pron = mkPronoun "ma" "mu" "mind" Sg P1 ;
|
||||
sa_Pron = mkPronoun "sa" "su" "sind" Sg P2;
|
||||
ta_Pron = mkPronoun "ta" "ta" "teda" Sg P3 ;
|
||||
me_Pron =
|
||||
{s = table {
|
||||
NPCase Nom => "me" ;
|
||||
n => (we_Pron.s) ! n
|
||||
} ;
|
||||
a = Ag Pl P1 } ;
|
||||
|
||||
te_Pron =
|
||||
{s = table {
|
||||
NPCase Nom => "te" ;
|
||||
n => (youPl_Pron.s) ! n
|
||||
} ;
|
||||
a = Ag Pl P2 } ;
|
||||
|
||||
nad_Pron =
|
||||
{s = table {
|
||||
NPCase Nom => "nad" ;
|
||||
n => (they_Pron.s) ! n
|
||||
} ;
|
||||
a = Ag Pl P3 } ;
|
||||
|
||||
---- copied from VerbEst.CompAP, should be shared
|
||||
ICompAP ap = {
|
||||
s = \\agr =>
|
||||
let
|
||||
n = complNumAgr agr ;
|
||||
c = case n of {
|
||||
Sg => Nom ; -- Fin (Nom): minä olen iso ; te olette iso
|
||||
Pl => Nom -- Fin (Part): me olemme isoja ; te olette isoja
|
||||
} --- definiteness of NP ?
|
||||
in "kui" ++ ap.s ! False ! (NCase n c)
|
||||
} ;
|
||||
|
||||
IAdvAdv adv = {s = "kui" ++ adv.s} ;
|
||||
|
||||
ProDrop p = {
|
||||
s = table {NPCase (Nom | Gen) => [] ; c => p.s ! c} ;
|
||||
---- drop Gen only works in adjectival position
|
||||
a = p.a
|
||||
} ;
|
||||
|
||||
ProDropPoss p = {
|
||||
s = \\_,_ => "oma" ; --???
|
||||
sp = \\_,_ => p.s ! NPCase Gen ;
|
||||
isNum = False ;
|
||||
isDef = True ; --- "minun kolme autoani ovat" ; thus "...on" is missing
|
||||
isNeg = False
|
||||
} ;
|
||||
|
||||
lincat
|
||||
ClPlus, ClPlusObj, ClPlusAdv = ClausePlus ;
|
||||
Part = {s : Str} ;
|
||||
|
||||
lin
|
||||
S_SVO part t p clp =
|
||||
let
|
||||
cl = clp.s ! t.t ! t.a ! p.p ;
|
||||
pa = part.s ----
|
||||
in
|
||||
{s = t.s ++ p.s ++ cl.subj ++ pa ++ cl.fin ++ cl.inf ++ cl.compl ++ cl.adv ++ cl.ext} ;
|
||||
|
||||
S_OSV part t p clp =
|
||||
let
|
||||
cl = clp.s ! t.t ! t.a ! p.p ;
|
||||
pa = part.s ----
|
||||
in
|
||||
{s = t.s ++ p.s ++ cl.compl ++ pa ++ cl.subj ++ cl.fin ++ cl.inf ++ cl.adv ++ cl.ext} ;
|
||||
S_VSO part t p clp =
|
||||
let
|
||||
cl = clp.s ! t.t ! t.a ! p.p ;
|
||||
pa = part.s
|
||||
in
|
||||
{s = t.s ++ p.s ++ cl.fin ++ pa ++ cl.subj ++ cl.inf ++ cl.compl ++ cl.adv ++ cl.ext} ;
|
||||
S_ASV part t p clp =
|
||||
let
|
||||
cl = clp.s ! t.t ! t.a ! p.p ;
|
||||
pa = part.s
|
||||
in
|
||||
{s = t.s ++ p.s ++ cl.adv ++ pa ++ cl.subj ++ cl.fin ++ cl.inf ++ cl.compl ++ cl.ext} ;
|
||||
|
||||
S_OVS part t p clp =
|
||||
let
|
||||
cl = clp.s ! t.t ! t.a ! p.p ;
|
||||
pa = part.s ----
|
||||
in
|
||||
{s = t.s ++ p.s ++ cl.compl ++ pa ++ cl.fin ++ cl.inf ++ cl.subj ++ cl.adv ++ cl.ext} ;
|
||||
|
||||
PredClPlus np vp = mkClausePlus (subjForm np vp.sc) np.a vp ;
|
||||
PredClPlusFocSubj np vp = insertKinClausePlus 0 (mkClausePlus (subjForm np vp.sc) np.a vp) ;
|
||||
PredClPlusFocVerb np vp = insertKinClausePlus 1 (mkClausePlus (subjForm np vp.sc) np.a vp) ;
|
||||
PredClPlusObj np vps obj =
|
||||
insertObjClausePlus 0 False (\\b => appCompl True b vps.c2 obj) (mkClausePlus (subjForm np vps.sc) np.a vps) ;
|
||||
PredClPlusFocObj np vps obj =
|
||||
insertObjClausePlus 0 True (\\b => appCompl True b vps.c2 obj) (mkClausePlus (subjForm np vps.sc) np.a vps) ;
|
||||
PredClPlusAdv np vp adv =
|
||||
insertObjClausePlus 1 False (\\_ => adv.s) (mkClausePlus (subjForm np vp.sc) np.a vp) ;
|
||||
PredClPlusFocAdv np vp adv =
|
||||
insertObjClausePlus 1 True (\\_ => adv.s) (mkClausePlus (subjForm np vp.sc) np.a vp) ;
|
||||
|
||||
ClPlusWithObj c = c ;
|
||||
ClPlusWithAdv c = c ;
|
||||
|
||||
noPart = {s = []} ;
|
||||
{-han_Part = mkPart "han" "hän" ;
|
||||
pa_Part = mkPart "pa" "pä" ;
|
||||
pas_Part = mkPart "pas" "päs" ;
|
||||
ko_Part = mkPart "ko" "kö" ;
|
||||
kos_Part = mkPart "kos" "kös" ;
|
||||
kohan_Part = mkPart "kohan" "köhän" ;
|
||||
pahan_Part = mkPart "pahan" "pähän" ;
|
||||
-}
|
||||
|
||||
}
|
||||
67
lib/src/estonian/ExtraEstAbs.gf
Normal file
67
lib/src/estonian/ExtraEstAbs.gf
Normal file
@@ -0,0 +1,67 @@
|
||||
abstract ExtraEstAbs = Extra [
|
||||
GenNP,
|
||||
VPI,ListVPI,BaseVPI,ConsVPI,MkVPI,ComplVPIVV,ConjVPI,
|
||||
VPS,ListVPS,BaseVPS,ConsVPS,ConjVPS,MkVPS,PredVPS,ConjVPS,Tense,Temp,Pol,S,
|
||||
VV,VP,Conj,NP,Quant,IAdv,IComp,ICompAP,IAdvAdv,Adv,AP, Pron, ProDrop] ** {
|
||||
|
||||
fun
|
||||
GenCN : NP -> CN -> CN ; -- auton merkki
|
||||
|
||||
AdvExistNP : Adv -> NP -> Cl ; -- kuvassa olemme me
|
||||
AdvPredNP : Adv -> V -> NP -> Cl ; -- kuvassa hymyilee Veikko
|
||||
|
||||
ICompExistNP : IComp -> NP -> QCl ; -- missä/kuka on Veikko
|
||||
IAdvPredNP : IAdv -> V -> NP -> QCl ; -- mistä alkaa Ruotsi
|
||||
|
||||
RelExistNP : Prep -> RP -> NP -> RCl ; -- jossa on jazzia
|
||||
|
||||
-- i_implicPron : Pron ; -- (minä), minut, ...
|
||||
whatPart_IP : IP ;
|
||||
|
||||
PartCN : CN -> NP ; -- olutta
|
||||
|
||||
vai_Conj : Conj ; -- minä vai sinä? ("or" in question)
|
||||
|
||||
--Short forms of the pronouns
|
||||
ma_Pron : Pron ;
|
||||
sa_Pron : Pron ;
|
||||
ta_Pron : Pron ;
|
||||
me_Pron : Pron ;
|
||||
te_Pron : Pron ;
|
||||
nad_Pron : Pron ;
|
||||
|
||||
OmaPoss : Quant ; -- Reflexive possessive "oma"
|
||||
ProDropPoss : Pron -> Quant ; -- vaimoni --TODO Is this relevant in Estonian? Is the agreement of pronoun ever needed, or is it the same as oma?
|
||||
|
||||
cat
|
||||
ClPlus ; -- clause with more variation
|
||||
ClPlusObj ; -- which has a focusable object
|
||||
ClPlusAdv ; -- which has a focusable adverb
|
||||
Part ; -- discourse particle
|
||||
|
||||
fun
|
||||
S_SVO : Part -> Temp -> Pol -> ClPlus -> S ; -- mepäs juomme maitoa nyt
|
||||
S_OSV : Part -> Temp -> Pol -> ClPlusObj -> S ; -- maitoapas me juomme nyt
|
||||
S_VSO : Part -> Temp -> Pol -> ClPlus -> S ; -- juommepas me maitoa nyt
|
||||
S_ASV : Part -> Temp -> Pol -> ClPlusAdv -> S ; -- nytpäs me juomme maitoa
|
||||
|
||||
-- S_SOV : Part -> Temp -> Pol -> ClPlus -> S ; -- mepäs maitoa juomme
|
||||
S_OVS : Part -> Temp -> Pol -> ClPlus -> S ; -- maitoapas juomme me
|
||||
-- S_VOS : Part -> Temp -> Pol -> ClPlus -> S ; -- juommepas maitoa me
|
||||
|
||||
|
||||
PredClPlus : NP -> VP -> ClPlus ; -- me nukumme
|
||||
PredClPlusFocSubj : NP -> VP -> ClPlus ; -- mekin nukumme
|
||||
PredClPlusFocVerb : NP -> VP -> ClPlus ; -- me nukummekin
|
||||
PredClPlusObj : NP -> VPSlash -> NP -> ClPlusObj ; -- maitoa me juomme
|
||||
PredClPlusFocObj : NP -> VPSlash -> NP -> ClPlusObj ; -- maitoakin me juomme
|
||||
PredClPlusAdv : NP -> VP -> Adv -> ClPlusAdv ; -- nyt me nukumme
|
||||
PredClPlusFocAdv : NP -> VP -> Adv -> ClPlusAdv ; -- nytkin me nukumme
|
||||
|
||||
ClPlusWithObj : ClPlusObj -> ClPlus ; -- to make non-fronted obj focusable
|
||||
ClPlusWithAdv : ClPlusAdv -> ClPlus ; -- to make non-fronted adv focusable
|
||||
|
||||
noPart, han_Part, pa_Part, pas_Part, ko_Part, kos_Part,
|
||||
kohan_Part, pahan_Part : Part ;
|
||||
|
||||
}
|
||||
20
lib/src/estonian/GrammarEst.gf
Normal file
20
lib/src/estonian/GrammarEst.gf
Normal file
@@ -0,0 +1,20 @@
|
||||
concrete GrammarEst of Grammar =
|
||||
NounEst,
|
||||
VerbEst,
|
||||
AdjectiveEst,
|
||||
AdverbEst,
|
||||
NumeralEst,
|
||||
SentenceEst,
|
||||
QuestionEst,
|
||||
RelativeEst,
|
||||
ConjunctionEst,
|
||||
PhraseEst,
|
||||
TextX,
|
||||
IdiomEst,
|
||||
StructuralEst,
|
||||
TenseX
|
||||
** {
|
||||
|
||||
flags startcat = Phr ; unlexer = finnish ; lexer = text ;
|
||||
|
||||
} ;
|
||||
618
lib/src/estonian/HjkEst.gf
Normal file
618
lib/src/estonian/HjkEst.gf
Normal file
@@ -0,0 +1,618 @@
|
||||
resource HjkEst = open ResEst, Prelude, Predef in {
|
||||
|
||||
-- Implementation of the noun inflection rules from
|
||||
-- Heiki-Jaan Kaalep. "Eesti käänamissüsteemi seaduspärasused" (2012)
|
||||
--
|
||||
-- @author Kaarel Kaljurand
|
||||
-- @version 2013-09-09
|
||||
|
||||
flags
|
||||
coding = utf8 ;
|
||||
|
||||
-- TODO: change the name of this file and the names of the opers in this file
|
||||
|
||||
param
|
||||
-- S1: stress on the last syllable
|
||||
-- S2: stress on the penultimate syllable
|
||||
-- S3: stress not on the last 2 syllables
|
||||
-- If the S2 word ends with a vowel then we distinguish between:
|
||||
-- S21: 1st quantity: blo.gi, ta.la
|
||||
-- S22: 2nd quantity: rat.su, vol.le
|
||||
-- S23: 3rd quantity: aas.ta
|
||||
SylType = S1 | S2 | S21 | S22 | S23 | S3 ;
|
||||
|
||||
oper
|
||||
|
||||
NFS = {s : NForm => Str} ;
|
||||
|
||||
foreign : pattern Str = #("z" | "ž" | "š") ;
|
||||
-- Foreign vowel endings
|
||||
foreign_v : pattern Str = #("ko" | "po" | "to" | "fo" | "ka" | "pa" | "ta" | "fa" | "ku" | "pu" | "tu" | "fu") ;
|
||||
v : pattern Str = #("a" | "e" | "i" | "o" | "u" | "õ" | "ä" | "ö" | "ü" | "w") ;
|
||||
vv : pattern Str = #("aa" | "ee" | "ii" | "oo" | "uu" | "õõ" | "ää" | "öö" | "üü") ;
|
||||
c : pattern Str = #("m" | "n" | "p" | "b" | "t" | "d" | "k" | "g" | "f" | "v" | "s" | "h" | "l" | "j" | "r" | "z" | "ž" | "š" | "c" | "q") ;
|
||||
lmnr : pattern Str = #("l" | "m" | "n" | "r") ;
|
||||
kpt : pattern Str = #("k" | "p" | "t" | "f" | "š") ;
|
||||
gbd : pattern Str = #("g" | "b" | "d") ;
|
||||
|
||||
-- Types that map singular nominative to the full paradigm.
|
||||
-- VI and VII include gradation which is described separately.
|
||||
hjk_type,
|
||||
hjk_type_I_koi,
|
||||
hjk_type_II_ema,
|
||||
hjk_type_III_ratsu,
|
||||
hjk_type_IVa_aasta,
|
||||
hjk_type_IVb_maakas,
|
||||
hjk_type_Va_otsene,
|
||||
hjk_type_Vb_oluline,
|
||||
hjk_type_VI_link,
|
||||
hjk_type_VI_imelik,
|
||||
hjk_type_VI_meeskond,
|
||||
hjk_type_VI_seminar,
|
||||
hjk_type_VII_touge : Str -> NForms ;
|
||||
-- hjk_type_VII_touge : Str -> NFS ;
|
||||
|
||||
-- IVa additionally needs the stem vowel.
|
||||
hjk_type_IVb_audit,
|
||||
hjk_type_IVb_audit1 : Str -> Str -> NForms ; --NFS
|
||||
|
||||
hjk_type_VI_tukk : Str -> Str -> NForms ;
|
||||
|
||||
|
||||
-- Definition of the mapping rules.
|
||||
-- Verbatim from HJKEKS.
|
||||
hjk_type_I_koi x =
|
||||
nForms6 x x (x+"d") (x+"sse") (x+"de") (x+"sid") ;
|
||||
|
||||
hjk_type_II_ema x =
|
||||
nForms6 x x x (x+"sse") (x+"de") (x+"sid") ;
|
||||
|
||||
hjk_type_III_ratsu x =
|
||||
nForms6 x x (x+"t") (x+"sse") (x+"de") (x+"sid") ;
|
||||
|
||||
-- if ends with 'i' ('arvuti') then last form is 'arvut' + 'e' + 'id'
|
||||
-- There are ~50 such words in the WordNet.
|
||||
hjk_type_IVa_aasta x =
|
||||
let
|
||||
x1 : Str = case x of { _ + "i" => (init x) + "e" ; _ => x }
|
||||
in
|
||||
nForms6 x x (x+"t") (x+"sse") (x+"te") (x1+"id") ;
|
||||
|
||||
-- (audit "a") can be used with comparative and superlative adjectives.
|
||||
hjk_type_IVb_audit x v_g =
|
||||
let
|
||||
v_pl = case v_g of { "i" => "e" ; _ => v_g }
|
||||
in
|
||||
nForms6 x (x+v_g) (x+v_g+"t") (x+v_g+"sse") (x+v_g+"te") (x+v_pl+"id") ;
|
||||
|
||||
-- TODO: clean this up
|
||||
hjk_type_IVb_audit1 x y =
|
||||
nForms6 x (y + "i") (y+"it") (y+"isse") (y+"ite") (y+"eid") ;
|
||||
|
||||
hjk_type_IVb_maakas x =
|
||||
let
|
||||
gen = init x
|
||||
in
|
||||
nForms6 x gen (gen+"t") (gen+"sse") (gen+"te") (gen+"id") ;
|
||||
|
||||
|
||||
--Maakas is for maakas:maaka:maakat, this is for hammas:hamba:hammast
|
||||
--Not sure if this is already covered by some hjk_type,
|
||||
--anyway the grades are explicit with two args, more reliable
|
||||
dHammas : (_,_ : Str) -> NForms ;
|
||||
dHammas hammas hamba =
|
||||
nForms6 hammas hamba (hammas+"t") (hamba+"sse") (hammas+"te") (hamba+"id") ;
|
||||
|
||||
dMeri : (_,_ : Str) -> NForms ;
|
||||
dMeri meri mere =
|
||||
let
|
||||
mer = init mere ;
|
||||
in
|
||||
nForms6 meri mere (mer+"d") (mere+"sse") (mere+"de") (mere+"sid") ;
|
||||
|
||||
-- This rule handles the removal of -ne and -s endings, and the addition of 'e'
|
||||
-- in the case of Cne-nouns (e.g. 'raudne').
|
||||
-- vastus - vastuse - vastust
|
||||
-- otsene - otsese - otsest
|
||||
-- raudne - raudse - raudsEt - raudsesse - raudsEte - raudseid (additional 'e')
|
||||
-- TODO: variant: vastusesse | vastusse
|
||||
hjk_type_Va_otsene x =
|
||||
let
|
||||
f : Str = case x of {
|
||||
y + c@(#c) + "ne" => y + c + "se" ;
|
||||
y + "ne" => y + "s" ;
|
||||
_ => x
|
||||
} ;
|
||||
f1 : Str = case x of {
|
||||
y + "ne" => y + "s" ;
|
||||
_ => x
|
||||
}
|
||||
in
|
||||
nForms6 x (f1+"e") (f+"t") (f1+"esse") (f+"te") (f1+"eid") ;
|
||||
|
||||
-- TODO: variant: olulisesse | olulisse
|
||||
hjk_type_Vb_oluline x =
|
||||
let
|
||||
f : Str = case x of {
|
||||
y + "ne" => y + "s" ;
|
||||
y + "ke" => y + "kes" ;
|
||||
_ => x
|
||||
}
|
||||
in
|
||||
nForms6 x (f+"e") (f+"t") (f+"esse") (f+"te") (f+"i") ;
|
||||
|
||||
hjk_type_VI_link x =
|
||||
let
|
||||
x_n : Str = weaker_noun x
|
||||
in
|
||||
nForms6 x (x_n+"i") (x+"i") (x+"i") (x+"ide") (x+"e") ;
|
||||
|
||||
|
||||
--like link but
|
||||
-- gen form given (takes care of vowel and consonant gradation)
|
||||
-- -sid for pl.part (todo: generate short forms depending on vowel?)
|
||||
hjk_type_VI_tukk x x_gen =
|
||||
let
|
||||
v_g : Str = last x_gen ;
|
||||
|
||||
{- pl_part : Str =
|
||||
case v_g of {
|
||||
"i" => "e" ;
|
||||
_ => v_g + "sid" } ;
|
||||
-}
|
||||
|
||||
in
|
||||
nForms6 x x_gen (x+v_g) (x+v_g) (x+v_g+"de") (x+v_g+"sid") ;
|
||||
|
||||
|
||||
hjk_type_VI_imelik x =
|
||||
let
|
||||
x_t : Str = stronger_noun x
|
||||
in
|
||||
nForms6 x (x+"u") (x_t+"u") (x_t+"u") (x+"e") (x_t+"e") ;
|
||||
|
||||
hjk_type_VI_meeskond x =
|
||||
let
|
||||
x_n : Str = weaker_noun x
|
||||
in
|
||||
nForms6 x (x_n+"a") (x+"a") (x+"a") (x+"ade") (x+"i") ;
|
||||
|
||||
hjk_type_VI_seminar x =
|
||||
nForms6 x (x+"i") (x+"i") (x+"i") (x+"ide") (x+"e") ;
|
||||
|
||||
hjk_type_VII_touge x =
|
||||
let
|
||||
x_t : Str = (stronger_noun (init x)) + "e"
|
||||
in
|
||||
nForms6 x x_t (x+"t") (x_t+"sse") (x+"te") (x_t+"id") ;
|
||||
|
||||
--Identical to the above, just taking 2 arguments (nom + gen)
|
||||
--There are 67 nouns in test cases where stronger_noun gets it wrong
|
||||
--handles liige:liikme as well
|
||||
hjk_type_VII_touge2 : (_,_ : Str) -> NForms ;
|
||||
hjk_type_VII_touge2 touge touke =
|
||||
let
|
||||
liikme : Str = case touke of {
|
||||
_ + "me" => touke ;
|
||||
_ + "mne" => touke ;
|
||||
_ => touge }
|
||||
in
|
||||
nForms6 touge touke (touge+"t") (touke+"sse") (liikme+"te") (touke+"id") ;
|
||||
|
||||
-- Use this only to weaken the verbs
|
||||
weaker : Str -> Str ;
|
||||
weaker link =
|
||||
let
|
||||
li = Predef.tk 2 link ;
|
||||
nk = Predef.dp 2 link
|
||||
in
|
||||
case nk of {
|
||||
"kk" => li + "k" ;
|
||||
"pp" => li + "p" ;
|
||||
"tt" => li + "t" ;
|
||||
"ff" => li + "f" ;
|
||||
("üt"|"üs") => li + "ö" ; --süsi,söe ; ütlema,öelda
|
||||
--"ad" => li + "aj" ; --sada,saja; maybe remove
|
||||
V@(#v) + "k" => li + V + "g" ;
|
||||
V@(#v) + "p" => li + V + "b" ;
|
||||
V@(#v) + "t" => li + V + "d" ;
|
||||
V@(#v) + "g" => li + V ; --liuglema,liuelda
|
||||
V@(#v) + "b" => li + V + "v" ; --leib,leiva
|
||||
V@(#v) + "d" => li + V ; --hoidma,hoiab
|
||||
N@(#lmnr) + "k" => li + N + "g" ;
|
||||
N@(#lmnr) + "p" => li + N + "b" ;
|
||||
N@(#lmnr) + "t" => li + N + "d" ;
|
||||
N@(#lmnr) + "d" => li + N + N ;
|
||||
N@(#lmnr) + "b" => li + N + N ;
|
||||
N@("l"|"r") + "g" => li + N ; --algama,alata
|
||||
"sk" => li + "s" ;
|
||||
"h" + #kpt => li + "h" ;
|
||||
_ => link
|
||||
} ;
|
||||
|
||||
|
||||
-- Weakening of nouns.
|
||||
-- Only the very stable weakening that happens to nouns.
|
||||
-- TODO: verify correctness/completeness based on some other implementation.
|
||||
weaker_noun : Str -> Str ;
|
||||
weaker_noun link =
|
||||
case link of {
|
||||
li + "kk" => li + "k" ;
|
||||
li + "pp" => li + "p" ;
|
||||
li + "tt" => li + "t" ;
|
||||
li + "ff" => li + "f" ;
|
||||
li + "šš" => li + "š" ;
|
||||
li + N@(#lmnr) + "ss" => li + N + "s" ;
|
||||
li + V@(#v) + "k" => li + V + "g" ;
|
||||
li + V@(#v) + "p" => li + V + "b" ;
|
||||
li + V@(#v) + "t" => li + V + "d" ;
|
||||
li + N@(#lmnr) + "k" => li + N + "g" ;
|
||||
li + N@(#lmnr) + "p" => li + N + "b" ;
|
||||
li + N@(#lmnr) + "t" => li + N + "d" ;
|
||||
li + "h" + #kpt => li + "h" ;
|
||||
li + "kond" => li + "konn" ;
|
||||
_ => link
|
||||
} ;
|
||||
|
||||
-- Strengthening of nouns.
|
||||
-- Input must not have the last vowel.
|
||||
stronger_noun : Str -> Str ;
|
||||
stronger_noun x =
|
||||
case x of {
|
||||
y + "lg" => y + "lg" ;
|
||||
y + "hk" => y + "hk" ; -- tahke
|
||||
y + "tk" => y + "tk" ; -- katke
|
||||
y + "rs" => y + "rs" ; -- morse
|
||||
y + "rr" => y + "rd" ; -- murre
|
||||
y + "ks" => y + "ks" ; -- makse
|
||||
y + "us" => y + "us" ; -- lause
|
||||
y + "sk" => y + "sk" ; -- raske (?)
|
||||
y + "ts" => y + "ts" ; -- katse
|
||||
y + "ps" => y + "psm" ; -- ripse -> ripsme
|
||||
y + "nt" => y + "nt" ; -- tante
|
||||
y + "st" => y + "st" ; -- TODO: sometimes stm: iste, kaste
|
||||
y + k@("k"|"p"|"t"|"s") => y + k + k ;
|
||||
y + "g" => y + "k" ;
|
||||
y + "d" => y + "t" ;
|
||||
y + "b" => y + "p" ;
|
||||
y + v@(#v) + "v" => y + v + "b" ; -- works for 'iive' but not 'irve'
|
||||
y + "mm" => y + "mb" ; -- komme -> kombe
|
||||
y + "nn" => y + "nd" ;
|
||||
_ => x
|
||||
} ;
|
||||
|
||||
-- Strengthening of verbs.
|
||||
stronger : Str -> Str ;
|
||||
stronger x =
|
||||
let
|
||||
beginning = tk 2 x ;
|
||||
ending = dp 2 x
|
||||
in
|
||||
beginning + case ending of {
|
||||
y + k@("k"|"p"|"t"|"s") + e => y + k + k + e ;
|
||||
y + "g" + e => y + "k" + e ;
|
||||
y + "d" + e => y + "t" + e ;
|
||||
y + "b" + e => y + "p" + e ;
|
||||
_ => ending
|
||||
} ;
|
||||
|
||||
|
||||
-- Mapping of singular nominative to HJKEKS types.
|
||||
-- This implements the patterns from HJKEKS section 8 but
|
||||
-- makes the rule ordering explicit, handles things like dropping 'e'
|
||||
-- in 'reegel' -> 'reegli', etc.
|
||||
-- Works ~90% correctly, ~100% correctly with input longer than 10 letters.
|
||||
-- If this rule delivers an incorrect form, then use the 6-arg oper.
|
||||
-- This is also needed if another legal form is desired,
|
||||
-- e.g. palk -> palga (the default is palk -> palgi).
|
||||
--
|
||||
-- This rule does not cover:
|
||||
-- - exceptional words (workaround: take these from the lexicon)
|
||||
-- - compound words (workaround: mark the compound border manually)
|
||||
-- - comparative and superlative adjective forms (workaround: use mkA instead)
|
||||
-- - type VII (t6uge -> t6uke), as one needs to detect derivation from verb
|
||||
-- - last syllable superlong (rostbiif)
|
||||
hjk_type x =
|
||||
case <(syl_type x), x> of {
|
||||
<S3, _ + "ke">
|
||||
=> hjk_type_Vb_oluline x ;
|
||||
|
||||
<_, _ + "kond">
|
||||
=> hjk_type_VI_meeskond x ;
|
||||
|
||||
-- Some S2 -ik words (voolik), we only cover words with double vowel
|
||||
<_, _ + #vv + ("lik"|"nik"|"stik")>
|
||||
=> hjk_type_IVb_audit x "u" ;
|
||||
|
||||
-- Other -ik words as in HJKEKS,
|
||||
-- but added 'ndik' which fixes fractions ('kaheksandik')
|
||||
-- and is wrong only for 'kandik'.
|
||||
<_, _ + ("lik"|"nik"|"stik"|"ndik")>
|
||||
=> hjk_type_VI_imelik x ;
|
||||
|
||||
-- Remaining -k words (but need to be S2)
|
||||
-- but not 'konjak'
|
||||
<S2, _ + ("a"|"e"|"i") + ("ng"|"k")>
|
||||
=> hjk_type_IVb_audit x "u" ;
|
||||
|
||||
-- Other -ik words (not in HJKEKS)
|
||||
-- including also: alevik, asemik, lobudik, hämarik, sarapik, põletik
|
||||
<_, _ + ("vik"|"mik"|"dik"|"rik"|"pik"|"tik")>
|
||||
=> hjk_type_VI_imelik x ;
|
||||
|
||||
-- kikas
|
||||
<_, ? + #v + #c + #v + "s">
|
||||
=> hjk_type_Va_otsene x ;
|
||||
|
||||
<_, _ + ("ngas"|"kas"|"jas"|"nud"|"tud")>
|
||||
=> hjk_type_IVb_maakas x ;
|
||||
|
||||
<S1, _ + #v + #v>
|
||||
=> hjk_type_I_koi x ;
|
||||
|
||||
-- 'statiiv' (not like 'karjuv')
|
||||
<S1, _ + #vv + #c>
|
||||
=> hjk_type_VI_link x ;
|
||||
|
||||
<S3, _ + #c + #v + #lmnr>
|
||||
=> hjk_type_VI_seminar x ;
|
||||
|
||||
<S1, _ + #v + #v + #c>
|
||||
=> hjk_type_VI_link x ;
|
||||
|
||||
<_, _ + ("us"|"is")>
|
||||
=> hjk_type_Vb_oluline x ;
|
||||
|
||||
<S3, _ + #v + #v + #c>
|
||||
=> hjk_type_VI_link x ;
|
||||
|
||||
<(S1|S3), _ + #v + #c + #c>
|
||||
=> hjk_type_VI_link x ;
|
||||
|
||||
<(S1|S3), _ + #v + #c + #c + #c>
|
||||
=> hjk_type_VI_link x ;
|
||||
|
||||
<_, _ + "nna">
|
||||
=> hjk_type_III_ratsu x ;
|
||||
|
||||
<-(S21|S22), _ + ("nu"|"tu")>
|
||||
=> hjk_type_IVa_aasta x ;
|
||||
|
||||
-- TODO: improve foreign detection
|
||||
<S2, _ + #foreign + _ + "in">
|
||||
=> hjk_type_IVb_audit x "i" ;
|
||||
|
||||
-- TODO: this is not in HJKEKS
|
||||
-- 'absurd' vs 'ebard'
|
||||
<S2, _ + #v + #lmnr + "d">
|
||||
=> hjk_type_IVb_audit x "i" ;
|
||||
|
||||
-- sometimes 'a' (laurits) TODO: this is not in HJKEKS
|
||||
<S2, _ + #v + #kpt + "s">
|
||||
=> hjk_type_IVb_audit x "i" ;
|
||||
|
||||
-- TODO: next 3 rules: last syllable must be long
|
||||
-- portfell, TODO: not 'karask'
|
||||
<S2, _ + #v + #c + #c>
|
||||
=> hjk_type_VI_link x ;
|
||||
|
||||
-- rostbiif, not viiul
|
||||
<S2, _ + #c + #v + #v + #c>
|
||||
=> hjk_type_VI_link x ;
|
||||
|
||||
-- impulss
|
||||
<S2, _ + #v + #c + #c + #c>
|
||||
=> hjk_type_VI_link x ;
|
||||
|
||||
-- TODO: sometimes masked by 'maakas'
|
||||
<_, _ + #v + "s">
|
||||
=> hjk_type_Va_otsene x ;
|
||||
|
||||
<_, _ + ("v"|"tav")>
|
||||
=> hjk_type_IVb_audit x "a" ;
|
||||
|
||||
-- The choice between Va (pl part: -seid) and Vb (pl part: -si)
|
||||
-- is based on checking the derivational ending.
|
||||
-- We just check the ending of the word and require at least 2 letters
|
||||
-- to precede the ending.
|
||||
-- We added also -tine and -ldane (which occur with adjectives).
|
||||
<_, _ + ? + ? + ("line"|"lane"|"mine"|"kene"|"tine"|"ldane")>
|
||||
=> hjk_type_Vb_oluline x ;
|
||||
|
||||
-- k6ne
|
||||
<S21, _ + "e">
|
||||
=> hjk_type_III_ratsu x ;
|
||||
|
||||
-- Many adjectives end with "ne" (40% in WordNet)
|
||||
-- We require them to be at least 5 letters long (excluding 'öine'),
|
||||
-- to give a chance to VII_touge (next rule).
|
||||
<_, _ + ? + ? + ? + "ne">
|
||||
=> hjk_type_Va_otsene x ;
|
||||
|
||||
-- Note: this rule does not actually check the derivation from verb.
|
||||
-- verb + e, TODO: masked by S21/e
|
||||
<(S2|S22), _ + "e">
|
||||
=> hjk_type_VII_touge x ;
|
||||
|
||||
-- ufo, pita, lito
|
||||
<S21, _ + #foreign_v>
|
||||
=> hjk_type_III_ratsu x ;
|
||||
|
||||
<S21, _ + #v>
|
||||
=> hjk_type_II_ema x ;
|
||||
|
||||
<S22, _ + #v>
|
||||
=> hjk_type_III_ratsu x ;
|
||||
|
||||
<S23, _ + #v>
|
||||
=> hjk_type_IVa_aasta x ;
|
||||
|
||||
<S2, _ + "in">
|
||||
=> hjk_type_IVb_audit x "a" ;
|
||||
|
||||
-- 'e' deletion
|
||||
-- kringel -> kringli, amper -> ampri, meeter -> meetri, reegel -> reegli
|
||||
-- kaabel-> kaabli (TODO: not: juubel -> juubli)
|
||||
-- spikker -> spikri (TODO: not: pokker -> pokkeri)
|
||||
-- Note: pintsel -> pintsli, but not pitser -> pitsri
|
||||
-- Note: 'redel' and 'paber' do not lose the 'e'.
|
||||
<S2, y + kk@("kk"|"pp"|"tt"|"hh") + "e" + l@("l"|"r")>
|
||||
=> hjk_type_IVb_audit1 x (y + (init kk) + l) ;
|
||||
|
||||
-- aaker -> aakri, teater -> teatri
|
||||
<S2, y + vvkpt@(#v + #v + #kpt) + "e" + l@("l"|"r")>
|
||||
=> hjk_type_IVb_audit1 x (y+vvkpt+l) ;
|
||||
|
||||
<S2, y + vv@(#vv) + gbd@(#gbd) + "e" + l@("l"|"r")>
|
||||
=> hjk_type_IVb_audit1 x (y+vv+gbd+l) ;
|
||||
|
||||
-- Disabled, 50-50 correctness
|
||||
--<S2, y + vv@(#vv) + lmnr@(#lmnr) + "e" + l@("l"|"r")>
|
||||
-- => hjk_type_IVb_audit1 x (y+vv+lmnr+l) ; -- 50-50
|
||||
|
||||
<S2, y + vv@(#vv) + s@("s"|"v") + "e" + l@("l"|"r")>
|
||||
=> hjk_type_IVb_audit1 x (y+vv+s+l) ;
|
||||
|
||||
<S2, y + n@("ht"|"hk"|"hv"|"nts"|"ld"|"lv"|"lb"|"ng"|"nd"|"mb"|"mp"|"nt"|"ps"|"ks"|"sk"|"st") + "e" + l@("l"|"r")>
|
||||
=> hjk_type_IVb_audit1 x (y+n+l) ;
|
||||
|
||||
<S2, y + "e" + l@("l"|"r")>
|
||||
=> hjk_type_IVb_audit x "i" ;
|
||||
|
||||
-- TODO: sometimes masked by 'link'
|
||||
<S2, _ + #c>
|
||||
=> hjk_type_IVb_audit x "i" ;
|
||||
|
||||
<S3, _ + #v>
|
||||
=> hjk_type_IVa_aasta x ;
|
||||
|
||||
-- verb + 'e'
|
||||
<_, _ + "e">
|
||||
=> hjk_type_VII_touge x ;
|
||||
|
||||
-- catch all that end with consonant
|
||||
<_, _ + #c>
|
||||
=> hjk_type_IVb_audit x "i" ;
|
||||
|
||||
-- TODO: not in HJKEKS
|
||||
<_, _ + ("ia"|"ja")> --kündja, not gerilja
|
||||
=> hjk_type_IVa_aasta x ;
|
||||
|
||||
--added by Inari 07.10.
|
||||
<S23, _ + #c + ("la")> --haigla, not gorilla
|
||||
=> hjk_type_IVa_aasta x ;
|
||||
|
||||
-- catch all
|
||||
<_, _>
|
||||
=> hjk_type_III_ratsu x
|
||||
} ;
|
||||
|
||||
|
||||
-- Assigns stress/quantity indicator (SylType) to the word based on
|
||||
-- its character composition.
|
||||
-- Note: you cannot use recursion (circular definitions) in these rules
|
||||
-- Note: patterns must be linear (GF book C.4.13), i.e. you cannot write
|
||||
-- oi@(#v + #v) + oi => S2 ; -- oi-oi, ai-ai, oo-oo
|
||||
syl_type : Str -> SylType ;
|
||||
syl_type x =
|
||||
case x of {
|
||||
-- all 1-letters
|
||||
? => S1 ;
|
||||
-- all 2-letters
|
||||
? + ? => S1 ;
|
||||
-- all 3-letters
|
||||
#v + #c + #v => S21 ;
|
||||
#v + #v + #v => S22 ;
|
||||
? + ? + ? => S1 ; -- koi, kae
|
||||
-- all 4-letters
|
||||
#c + #v + #v + #c => S1 ; -- siid
|
||||
#c + #v + #c + #c => S1 ; -- link
|
||||
#v + #c + #v + #c => S2 ;
|
||||
#v + #vv + #c => S1 ; -- auul, ioon, oaas
|
||||
#v + #v + #v + #c => S2 ; -- aiak (?)
|
||||
#v + #v + #c + #v => S22 ; -- aine, aade; not: 6ige
|
||||
#v + #c + #v + #v => S1 ; -- epee, oboe
|
||||
#v + #c + #c + #v => S22 ; -- iste, iglu; not: 6htu
|
||||
#c + #v + #c + #v => S21 ;
|
||||
#c + #v + #v + #v => S22 ; -- muie, neiu, riie
|
||||
? + ? + ? + ? => S1 ;
|
||||
-- all 5-letters
|
||||
_ + #c + "ia" => S2 ; -- aaria, minia, orgia, kirurgia, nostalgia
|
||||
#v + #c + #c + #v + #v => S1 ; -- armee
|
||||
#c + #v + #c + #v + #v => S1 ; -- depoo
|
||||
#c + #c + #v + #c + #c => S1 ; -- tramm
|
||||
#c + #v + #c + #c + #c => S1 ;
|
||||
#c + #v + #vv + #c => S1 ; -- poeem
|
||||
#c + #v + #v + #v + #c => S2 ; -- hoius, laius, maius
|
||||
#c + #v + #c + #v + #c => S2 ; -- redel
|
||||
#c + #v + #c + #gbd + "e" => S23 ; -- valge, k6rge; p6rge, hange
|
||||
#c + #v + #v + #gbd + "e" => S22 ; -- haige, kauge; t6uge
|
||||
#c + #v + #v + #c + #v => S22 ; -- lause; TODO: leitu, rootu (S23)
|
||||
#c + #v + #c + #c + #v => S22 ; -- ratsu; not: surnu
|
||||
#v + #c + #c + #c + #v => S23 ;
|
||||
#v + #c + #c + #v + #c => S2 ; -- amper
|
||||
#v + #c + #v + #c + #c => S2 ; -- avang
|
||||
_ + #c + #vv + #c + #c => S1 ; -- loots (double vowel, otherwise the same as below)
|
||||
#c + #v + #v + #c + #c => S2 ; -- laeng, loend
|
||||
#c + #c + #v + #v + #c => S1 ; -- bluus, kruus, kreem
|
||||
#v + #c + #v + #v + #c => S1 ; -- ukaas, TODO: not 'avaus'
|
||||
#v + #v + #c + #v + #c => S2 ; -- aatom
|
||||
#v + #v + #c + #c + #v => S23 ; -- aasta
|
||||
#v + #v + #c + #v + #v => S1 ; -- aaloe (?)
|
||||
#c + #c + #v + #c + #v => S21 ; -- blogi
|
||||
_ + ? + #v + #vv + #c => S1 ; -- -ioos, kruiis
|
||||
#c + #c + #v + #v + #v + #c => S2 ; -- flaier
|
||||
_ + ? + #c + #v + #c + #v => S3 ; -- oluline
|
||||
-- all 6-letters
|
||||
#v + #c + #c + #v + #v + #c => S1 ; -- aplaus
|
||||
#v + #c + #c + #v + #c + #c => S2 ; -- astang, ellips
|
||||
#c + #vv + #c + #v + #v => S23 ; -- muumia, raadio, TODO: exclude 'vaarao'
|
||||
#c + #v + #v + #c + #v + #v => S1 ; -- peoleo
|
||||
#c + #v + #v + #c + #c + #v => S23 ; -- haigla --added by Inari, not sure if always correct
|
||||
#c + #v + #c + #c + #c + #v => S23 ; -- vangla --added by Inari, not sure if always correct
|
||||
#c + #v + #c + #vv + #c => S1 ; -- deviis (double vowel in the last syllable)
|
||||
#v + #c + #v + #c + #v + #v => S1 ; -- agoraa
|
||||
#c + #v + #c + #v + #c + #c => S2 ;
|
||||
#c + #v + #c + #v + #c + #v => S3 ;
|
||||
#v + #c + #v + #c + #c + #v => S3 ; -- yheksa
|
||||
#c + #v + #c + #c + #v + #c => S2 ; -- rektor
|
||||
#c + #v + #c + #v + #v + #c => S2 ; -- paleus
|
||||
#c + #v + #v + #c + #v + #c => S2 ; -- meeter, reegel
|
||||
#v + #v + #c + #c + #v + #c => S2 ; -- aastak
|
||||
#v + #c + #c + #c + #v + #c => S2 ; -- andmik
|
||||
#v + #c + #c + #v + #c + #v => S3 ;
|
||||
_ + #v + #c + #v + #c + #v + #c => S3 ; -- alevik, elanik
|
||||
-- all 7-letters
|
||||
_ + ? + ? + #c + #vv + #c => S1 ; -- double vowel in the last syllable: bensiin, benseen, bensool
|
||||
#c + #v + #v + #c + #c + #v + #c => S2 ; -- jooksik
|
||||
#c + #v + #c + #c + #c + #v + #c => S2 ; -- hurtsik
|
||||
#c + #v + #c + #c + #v + #c + #c => S2 ; -- kitsend
|
||||
#c + #v + #c + #c + #v + #v + #c => S2 ; -- pension
|
||||
#c + #v + #c + #v + #c + #v + #c => S3 ; -- seminar
|
||||
#c + #c + #v + #c + #c + #v + #c => S2 ; -- kringel, plastik
|
||||
_ + #v + #c + #v + #kpt + #kpt + #v + #c => S2 ; -- elekter, adapter
|
||||
_ + #c + #v + #lmnr + #gbd + #v + #c => S2 ; -- (k)alender, (dets)ember
|
||||
_ + #c + #v + #lmnr + #kpt + #v + #c => S2 ; -- (re)porter
|
||||
_ + #c + #v + "stik" => S3 ; -- kuristik (TODO: not logistik)
|
||||
_ + #c + #v + "s" + #kpt + #v + #c => S2 ; -- (k)anister
|
||||
#v + #c + #v + #c + #c + #v + #c => S3 ; -- apelsin
|
||||
#v + #c + #c + #v + #c + #v + #c => S3 ; -- admiral
|
||||
#c + #v + #c + #v + #c + #c + #v => S3 ; -- kaheksa
|
||||
#c + #c + #v + #c + #v + #c + #c => S2 ; -- klopits
|
||||
#c + #v + #v + #c + #v + #c + #c => S2 ; -- haarang
|
||||
#c + #v + #v + #c + #v + #v + #c => S2 ; -- raadius, kauneim
|
||||
_ + #c + #v + #v + #c + #v + #c => S2 ; -- araabik
|
||||
_ + #lmnr + #gbd + #v + #c + #c + #v + #c => S3 ; -- (pa)lderjan, (ko)rgitser
|
||||
-- other
|
||||
_ + #c + #v + #c + #c + #v + #c + #v + #c => S3 ; -- karneval
|
||||
#c + #v + #c + #v + #c + #c + #v + #c => S3 ; -- ragastik (kalender is handled above)
|
||||
_ + #v + #v + #c + #v + #c + #c + #v + #c => S3 ; -- ainestik
|
||||
_ + #c + #c + #v + #c + #c + #v + #c + #c => S3 ; -- ampersand
|
||||
_ + #c + #v + #c + #v + #c + #c => S1 ; -- dividend
|
||||
_ + #v + #c + #c + #c + #v + #v => S1 ; -- displei
|
||||
_ + #c + #v + #c + #c + #v + #v => S1 ; -- politsei
|
||||
_ + #c + #v + #c + #v + #v => S1 ; -- defilee, kompanii
|
||||
_ => S2 -- the default is S2, but the above rules should catch most of the words
|
||||
} ;
|
||||
|
||||
}
|
||||
79
lib/src/estonian/IdiomEst.gf
Normal file
79
lib/src/estonian/IdiomEst.gf
Normal file
@@ -0,0 +1,79 @@
|
||||
concrete IdiomEst of Idiom = CatEst **
|
||||
open MorphoEst, ParadigmsEst, Prelude in {
|
||||
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lin
|
||||
ExistNP np =
|
||||
let
|
||||
cas : Polarity -> NPForm = \p -> case p of {
|
||||
Pos => NPCase Nom ; -- on olemas lammas
|
||||
Neg => NPCase Part -- ei ole olemas lammast
|
||||
}
|
||||
in
|
||||
mkClause noSubj (agrP3 Sg) (insertObj
|
||||
(\\_,b,_ => "olemas" ++ np.s ! cas b) (predV olla)) ;
|
||||
|
||||
ExistIP ip =
|
||||
let
|
||||
cas : NPForm = NPCase Nom ; ---- also partitive in Extra
|
||||
vp = insertObj (\\_,b,_ => "olemas") (predV olla) ;
|
||||
cl = mkClause (subjForm (ip ** {isPron = False ; a = agrP3 ip.n}) cas) (agrP3 Sg) vp
|
||||
in {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
|
||||
-- Notice the nominative in the cleft $NP$: "se on Matti josta Liisa pitää"
|
||||
-- Est: "see on Mati, kellest Liis lugu peab"
|
||||
|
||||
CleftNP np rs = mkClause (\_ -> "see") (agrP3 Sg)
|
||||
(insertExtrapos (rs.s ! np.a)
|
||||
(insertObj (\\_,_,_ => np.s ! NPCase Nom) (predV olla))) ;
|
||||
|
||||
-- This gives the almost forbidden "se on Porissa kun Matti asuu".
|
||||
-- Est: "see on Toris, kus Mati elab" (?)
|
||||
|
||||
CleftAdv ad s = mkClause (\_ -> "see") (agrP3 Sg)
|
||||
(insertExtrapos ("kus" ++ s.s)
|
||||
(insertObj (\\_,_,_ => ad.s) (predV olla))) ;
|
||||
|
||||
ImpersCl vp = mkClause noSubj (agrP3 Sg) vp ;
|
||||
|
||||
GenericCl vp = mkClause noSubj (agrP3 Sg) {
|
||||
s = \\_ => vp.s ! VIPass ;
|
||||
s2 = vp.s2 ;
|
||||
adv = vp.adv ;
|
||||
p = vp.p ;
|
||||
ext = vp.ext ;
|
||||
sc = vp.sc ;
|
||||
} ;
|
||||
|
||||
ProgrVP vp =
|
||||
let
|
||||
inf = (vp.s ! VIInf InfMas ! Simul ! Pos ! agrP3 Sg).fin ;
|
||||
on = predV olla
|
||||
in {
|
||||
s = on.s ;
|
||||
s2 = \\b,p,a => vp.s2 ! b ! p ! a ++ inf ;
|
||||
adv = vp.adv ;
|
||||
p = vp.p ;
|
||||
ext = vp.ext ;
|
||||
sc = vp.sc ;
|
||||
} ;
|
||||
|
||||
-- This gives "otetaan oluet" instead of "ottakaamme oluet".
|
||||
-- The imperative is not available in a $VP$.
|
||||
|
||||
ImpPl1 vp =
|
||||
let vps = vp.s ! VIPass ! Simul ! Pos ! Ag Pl P1
|
||||
in
|
||||
{s = vps.fin ++ vps.inf ++
|
||||
vp.s2 ! True ! Pos ! Ag Pl P1 ++ vp.p ++ vp.ext
|
||||
} ;
|
||||
|
||||
oper
|
||||
olla = verbOlema ** {sc = NPCase Nom} ;
|
||||
|
||||
noSubj : Polarity -> Str = \_ -> [] ;
|
||||
}
|
||||
|
||||
15
lib/src/estonian/IrregEst.gf
Normal file
15
lib/src/estonian/IrregEst.gf
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
flags coding=utf8;
|
||||
|
||||
kayda_V = mkV "käima" ;
|
||||
tuntea_V = mkV "tundma" ;
|
||||
nahda_V = mkV "nägema" ;
|
||||
|
||||
tehda_V = mkV "tegema" ;
|
||||
|
||||
tietaa_V = mkV "teadma" ;
|
||||
|
||||
taitaa_V
|
||||
|
||||
siita_V
|
||||
|
||||
10
lib/src/estonian/LangEst.gf
Normal file
10
lib/src/estonian/LangEst.gf
Normal file
@@ -0,0 +1,10 @@
|
||||
-- TODO: include the full GrammarEst
|
||||
-- The Slash* is currently excluded only for performance reasons.
|
||||
concrete LangEst of Lang =
|
||||
GrammarEst - [Slash2V3,SlashV2A,Slash3V3,SlashV2VNP,SlashVV], ---- to speed up compilation
|
||||
LexiconEst
|
||||
** {
|
||||
|
||||
flags startcat = Phr ; unlexer = text ; lexer = finnish ;
|
||||
|
||||
} ;
|
||||
378
lib/src/estonian/LexiconEst.gf
Normal file
378
lib/src/estonian/LexiconEst.gf
Normal file
@@ -0,0 +1,378 @@
|
||||
concrete LexiconEst of Lexicon = CatEst ** open MorphoEst, ParadigmsEst, Prelude in {
|
||||
|
||||
flags
|
||||
optimize=values ; coding=utf8;
|
||||
|
||||
|
||||
lin
|
||||
airplane_N = mkN "lennuk" ;
|
||||
alas_Interj = ss "paraku" ;
|
||||
answer_V2S = mkV2 (mkV "vastama" "vastata") callative ;
|
||||
apartment_N = mkN "korter" ;
|
||||
apple_N = mkN "õun" ;
|
||||
art_N = mkN "kunst" ;
|
||||
ask_V2Q = mkV2 (mkV "küsima") (casePrep ablative) ;
|
||||
baby_N = mkN "beebi" ;
|
||||
bad_A = mkA (mkN "halb" "halva" "halba" "halba" "halbade" "halbu") "halvem" "halvim" ;
|
||||
bank_N = mkN "pank" ;
|
||||
beautiful_A = mkA (mkN "kaunis" "kauni" "kaunist" "kaunisse" "kaunite" "kauneid") ;
|
||||
become_VA = mkVA (mkV "saama") ctranslative ; -- tema saab vanaks
|
||||
beer_N = mkN "õlu" ;
|
||||
beg_V2V = mkV2V (mkV "paluma") cpartitive ;
|
||||
big_A = mkA (mkN "suur" "suure" "suurt" "suurde" "suurte" "suuri");
|
||||
bike_N = mkN "ratas" ;
|
||||
bird_N = mkN "lind" ;
|
||||
black_A = mkA (mkN "must" "musta" "musta") ;
|
||||
blue_A = mkA "sinine" ;
|
||||
boat_N = mkN "paat" ;
|
||||
book_N = mkN "raamat" "raamatu" "raamatut" "raamatusse" "raamatute" "raamatuid" ;
|
||||
boot_N = mkN "saabas" ;
|
||||
boss_N = mkN "boss" ;
|
||||
boy_N = mkN "poiss" ;
|
||||
bread_N = mkN "leib" ;
|
||||
break_V2 = mkV2 (mkV "katki" (mkV "tegema" "teha")) ;
|
||||
broad_A = mkA (mkN "lai" "laia" "laia" "laia" "laiade" "laiu") "laiem" "TODO" ;
|
||||
brother_N2 = mkN2 (mkN "vend" "venna" "venda" "venda" "vendade" "vendi") ;
|
||||
brown_A = mkA "pruun" ;
|
||||
butter_N = mkN "või" ;
|
||||
buy_V2 = mkV2 (mkV "ostma") ;
|
||||
camera_N = mkN "kaamera" ;
|
||||
cap_N = mkN "müts" ;
|
||||
car_N = mkN "auto" ;
|
||||
carpet_N = mkN "vaip" ;
|
||||
cat_N = mkN "kass" ;
|
||||
ceiling_N = mkN "lagi" ;
|
||||
chair_N = mkN "tool" ;
|
||||
cheese_N = mkN "juust" ;
|
||||
child_N = mkN "laps" "lapse" "last" "lapsesse" "laste" "lapsi" ;
|
||||
church_N = mkN "kirik" ;
|
||||
city_N = mkN "linn" "linna" "linna" "linna" "linnade" "linnu" ;
|
||||
clean_A = mkA (mkN "puhas" "puhta" "puhast" "puhtasse" "puhaste" "puhtaid");
|
||||
clever_A = mkA "tark" ;
|
||||
close_V2 = mkV2 (mkV "sulgema") ;
|
||||
coat_N = mkN "mantel" ;
|
||||
cold_A = mkA "külm" ;
|
||||
come_V = mkV "tulema" ;
|
||||
computer_N = mkN "arvuti" ;
|
||||
country_N = mkN "maa" ;
|
||||
cousin_N = mkN "nõbu" ;
|
||||
cow_N = mkN "lehm" ;
|
||||
die_V = mkV "surema" ;
|
||||
dirty_A = mkA "räpane" ;
|
||||
-- Using 'terminative' for the destination works better with nouns.
|
||||
-- And also with placenames, as one does not need to decide between
|
||||
-- illative (Tartusse) and allative (Põltsamaale).
|
||||
-- Unfortunately, we cannot use a similar trick for the source (*Põltsamaast vs Põltsamaalt).
|
||||
distance_N3 = mkN3 (mkN "kaugus") celative (casePrep terminative) ;
|
||||
doctor_N = mkN "arst" ;
|
||||
dog_N = mkN "koer" ;
|
||||
door_N = mkN "uks" ;
|
||||
drink_V2 = mkV2 (mkV "jooma") cpartitive ;
|
||||
easy_A2V = mkA2 (mkA (mkN "lihtne")) callative ;
|
||||
eat_V2 = mkV2 (mkV "sööma") cpartitive ;
|
||||
empty_A = mkA "tühi" ;
|
||||
enemy_N = mkN "vaenlane" ;
|
||||
factory_N = mkN "tehas" ;
|
||||
father_N2 = mkN2 (mkN "isa") ;
|
||||
fear_VS = mkVS (mk2V "kartma" "karta") ;
|
||||
find_V2 = mkV2 (mk2V "leidma" "leida") ;
|
||||
fish_N = mkN "kala" ;
|
||||
floor_N = mkN "põrand" ;
|
||||
forget_V2 = mkV2 (mkV "unustama") ;
|
||||
fridge_N = mkN "külm" (mkN "kapp") ;
|
||||
friend_N = mkN "sõber" ;
|
||||
fruit_N = mkN "puu" (mkN "vili") ;
|
||||
fun_AV = mkAV (mkA (mkN "lõbus")) ;
|
||||
garden_N = mkN "aed" ;
|
||||
girl_N = mkN "tüdruk" ;
|
||||
glove_N = mkN "kinnas" ;
|
||||
gold_N = mkN "kuld" ;
|
||||
good_A = mkA (mkN "hea") "parem" "parim" ;
|
||||
go_V = mkV "minema" "minna" "läheb" "minnakse"
|
||||
"minge" "läks" "läinud" "mindud" ;
|
||||
green_A = mkA "roheline" ;
|
||||
harbour_N = mkN "sadam" ;
|
||||
hate_V2 = mkV2 (mkV "vihkama") cpartitive ;
|
||||
hat_N = mkN "müts" ;
|
||||
hear_V2 = mkV2 (mkV "kuulma") ;
|
||||
hill_N = mkN "küngas" "künka" "küngast" "künkasse" "küngaste" "künkaid" ;
|
||||
hope_VS = mkVS (mkV "lootma") ;
|
||||
horse_N = mkN "hobune" ;
|
||||
hot_A = mkA "kuum" ;
|
||||
house_N = mkN "maja" ;
|
||||
important_A = mkA "tähtis" ;
|
||||
industry_N = mkN "tööstus" ;
|
||||
iron_N = mkN "raud" ;
|
||||
king_N = mkN "kuningas" ;
|
||||
know_VS = mkVS know_V ;
|
||||
know_VQ = mkVQ know_V ;
|
||||
know_V2 = mkV2 (mkV "tundma") ;
|
||||
lake_N = mkN "järv" ;
|
||||
lamp_N = mkN "lamp" ;
|
||||
learn_V2 = mkV2 (mkV "õppima") ;
|
||||
leather_N = mkN "nahk" ;
|
||||
leave_V2 = mkV2 (mkV "jätma") ;
|
||||
like_V2 = mkV2 (mkV "lugu" (mkV "pidama" "pidada" "peab" "peetakse")) celative ;
|
||||
listen_V2 = mkV2 (mkV "kuulama") partitive ;
|
||||
live_V = mkV "elama" ;
|
||||
long_A = mkA "pikk" ;
|
||||
lose_V2 = mkV2 (mkV "kaotama") ;
|
||||
love_N = mkN "armastus" ;
|
||||
love_V2 = mkV2 (mkV "armastama") partitive ;
|
||||
man_N = mkN "mees" "mehe" "meest" "mehesse" "meeste" "mehi" ;
|
||||
married_A2 = mkA2 (mkA "abielus") (casePrep comitative) ;
|
||||
meat_N = mkN "liha" ;
|
||||
milk_N = mkN "piim" ;
|
||||
moon_N = mkN "kuu" ;
|
||||
mother_N2 = mkN2 (mkN "ema") ;
|
||||
mountain_N = mkN "mägi" "mäe" "mäge" "mäkke" "mägede" "mägesid" ;
|
||||
music_N = mkN "muusika" ;
|
||||
narrow_A = mkA "kitsas" ;
|
||||
new_A = mkA (mkN "uus" "uue" "uut" "uude" "uute" "uusi") "uuem" "uusim" ;
|
||||
newspaper_N = mkN "aja" (mkN "leht") ;
|
||||
oil_N = mkN "õli" ;
|
||||
old_A = mkA (mkN "vana" "vana" "vana" "vanasse" "vanade" "vanasid") "vanem" "vanim" ;
|
||||
open_V2 = mkV2 (mkV "avama") ;
|
||||
paint_V2A = mkV2A (mkV "maalima") accPrep ctranslative ;
|
||||
paper_N = mkN "paber" ;
|
||||
paris_PN = mkPN (mkN "Pariis") ;
|
||||
peace_N = mkN "rahu" ;
|
||||
pen_N = mkN "pastakas" ;
|
||||
planet_N = mkN "planeet" ;
|
||||
plastic_N = mkN "kile" ;
|
||||
play_V2 = mkV2 (mkV "mängima") cpartitive ;
|
||||
policeman_N = mkN "politseinik" ;
|
||||
priest_N = mkN "preester" ;
|
||||
probable_AS = mkAS (mkA (mkN "tõenäoline")) ;
|
||||
queen_N = mkN "kuninganna" ;
|
||||
radio_N = mkN "raadio" ;
|
||||
rain_V0 = mkV0 (mkV "sadama" "sadada" "sajab") ;
|
||||
read_V2 = mkV2 (mkV "lugema" "lugeda" "loeb") ;
|
||||
red_A = mkA "punane" ;
|
||||
religion_N = mkN "usk" ;
|
||||
restaurant_N = mkN "restoran" ;
|
||||
river_N = mkN "jõgi" ;
|
||||
rock_N = mkN "kalju" ;
|
||||
roof_N = mkN "katus" ;
|
||||
rubber_N = mkN "kumm" ;
|
||||
run_V = mkV "jooksma" "joosta" ;
|
||||
say_VS = mkVS (mkV "ütlema") ;
|
||||
school_N = mkN "kool" ;
|
||||
science_N = mkN "teadus" ;
|
||||
sea_N = mkN "meri" ;
|
||||
seek_V2 = mkV2 (mkV "otsima") cpartitive ;
|
||||
see_V2 = mkV2 (mkV "nägema" "näha") ;
|
||||
sell_V3 = mkV3 (mkV "müüma") accPrep callative ;
|
||||
send_V3 = mkV3 (mkV "saatma") accPrep callative ;
|
||||
sheep_N = mkN "lammas" ;
|
||||
ship_N = mkN "laev" ;
|
||||
shirt_N = mkN "särk" ;
|
||||
shoe_N = mkN "king" ;
|
||||
shop_N = mkN "kauplus" ;
|
||||
short_A = mkA "lühike" ;
|
||||
silver_N = mkN "hõbe" ;
|
||||
sister_N = mkN "õde" "õe" "õde" "õesse" "õdede" "õdesid" ;
|
||||
sleep_V = mkV "magama" ;
|
||||
small_A = mkA (mkN "väike" "väikse" "väikest" "väiksesse" "väikeste" "väikseid") ;
|
||||
snake_N = mkN "uss" ;
|
||||
sock_N = mkN "sukk" ;
|
||||
speak_V2 = mkV2 talk_V cpartitive ;
|
||||
star_N = mkN "täht" ;
|
||||
steel_N = mkN "teras" ;
|
||||
stone_N = mkN "kivi" ;
|
||||
stove_N = mkN "ahi" ;
|
||||
student_N = mkN "tudeng" ;
|
||||
stupid_A = mkA "loll" ;
|
||||
sun_N = mkN "päike" ;
|
||||
switch8off_V2 = mkV2 (mkV "välja" (mkV "lülitama")) ;
|
||||
switch8on_V2 = mkV2 (mkV "sisse" (mkV "lülitama")) ;
|
||||
table_N = mkN "laud" ;
|
||||
talk_V3 = mkV3 talk_V callative celative ;
|
||||
teacher_N = mkN "õpetaja" ;
|
||||
teach_V2 = mkV2 (mkV "õpetama") ;
|
||||
television_N = mkN "televisioon" ;
|
||||
thick_A = mkA "paks" ;
|
||||
thin_A = mkA "õhuke" ;
|
||||
train_N = mkN "rong" ;
|
||||
travel_V = mkV "reisima" ;
|
||||
tree_N = mkN "puu" ;
|
||||
ugly_A = mkA "kole" ;
|
||||
understand_V2 = mkV2 (mkV "aru" (mkV "saama")) celative ;
|
||||
university_N = mkN "ülikool" ;
|
||||
village_N = mkN "küla" ;
|
||||
wait_V2 = mkV2 (mkV "ootama") partitive ;
|
||||
walk_V = mkV "kõndima" ;
|
||||
warm_A = mkA (mkN "soe" "sooja" "sooja" "sooja" "soojade" "soojasid") "soojem" "soojim" ;
|
||||
war_N = mkN "sõda" ;
|
||||
watch_V2 = mkV2 (mkV "vaatama") cpartitive ;
|
||||
water_N = mkN "vesi" ;
|
||||
white_A = mkA "valge" ;
|
||||
window_N = mkN "aken" ;
|
||||
wine_N = mkN "vein" ;
|
||||
win_V2 = mkV2 (mkV "võitma") ;
|
||||
woman_N = mkN "naine" "naise" "naist" "naisesse" "naiste" "naisi" ;
|
||||
wonder_VQ = mkVQ (mkV "arutlema" "arutleda") ; -- TODO
|
||||
wood_N = mkN "puu" ;
|
||||
write_V2 = mkV2 (mkV "kirjutama") ;
|
||||
yellow_A = mkA "kollane" ;
|
||||
young_A = mkA "noor" ;
|
||||
|
||||
do_V2 = mkV2 (mkV "tegema" "teha") ;
|
||||
|
||||
now_Adv = mkAdv "nüüd" ;
|
||||
already_Adv = mkAdv "juba" ;
|
||||
song_N = mkN "laul" ;
|
||||
add_V3 = mkV3 (mkV "lisama") accPrep callative ;
|
||||
number_N = mkN "number" ;
|
||||
put_V2 = mkV2 (mkV "panema") ;
|
||||
stop_V = mkV "peatuma" ;
|
||||
jump_V = mkV "hüppama" ;
|
||||
left_Ord = mkOrd1 (mkN "vasak") ;
|
||||
right_Ord = mkOrd1 (mkN "parem") ;
|
||||
far_Adv = mkAdv "kaugel" ;
|
||||
correct_A = mkA "õige" ;
|
||||
dry_A = mkA "kuiv" ;
|
||||
dull_A = mkA "igav" ;
|
||||
full_A = mkA (mkN "täis") "täiem" "täiim" Invariable ; -- 'täis' is one of the non-inflecting adjectives
|
||||
heavy_A = mkA "raske" ;
|
||||
near_A = mkA "lähedane" ;
|
||||
rotten_A = mkA "mäda" ;
|
||||
round_A = mkA "ümmargune" ;
|
||||
sharp_A = mkA "terav" ;
|
||||
smooth_A = mkA "sile" ;
|
||||
straight_A = mkA "sirge" ;
|
||||
wet_A = mkA "märg" ;
|
||||
wide_A = mkA "lai" ;
|
||||
animal_N = mkN "loom" ;
|
||||
ashes_N = mkN "tuhk" ;
|
||||
back_N = mkN "selg" ;
|
||||
bark_N = mkN "koor" ;
|
||||
belly_N = mkN "kõht" ;
|
||||
blood_N = mkN "veri" ;
|
||||
bone_N = mkN "luu" ;
|
||||
breast_N = mkN "rind" ;
|
||||
cloud_N = mkN "pilv" ;
|
||||
day_N = mkN "päev" ;
|
||||
dust_N = mkN "tolm" ;
|
||||
ear_N = mkN "kõrv" ;
|
||||
earth_N = mkN "maa" ;
|
||||
egg_N = mkN "muna" ;
|
||||
eye_N = mkN "silm" ;
|
||||
fat_N = mkN "rasv" ;
|
||||
feather_N = mkN "sulg" ;
|
||||
fingernail_N = mkN "küüs" ;
|
||||
fire_N = mkN "tuli" ;
|
||||
flower_N = mkN "lill" ;
|
||||
fog_N = mkN "udu" ;
|
||||
foot_N = mkN "jalg" ;
|
||||
forest_N = mkN "mets" ;
|
||||
grass_N = mkN "rohi" ;
|
||||
guts_N = mkN "soolestik" ;
|
||||
hair_N = mkN "juuksed" ; -- TODO: plural
|
||||
hand_N = mkN "käsi" ;
|
||||
head_N = mkN "pea" ;
|
||||
heart_N = mkN "süda" ;
|
||||
horn_N = mkN "sarv" ;
|
||||
husband_N = man_N ;
|
||||
ice_N = mkN "jää" ;
|
||||
knee_N = mkN "põlv" ;
|
||||
leaf_N = mkN "leht" ;
|
||||
leg_N = mkN "jalg" ;
|
||||
liver_N = mkN "maks" ;
|
||||
louse_N = mkN "täi" ;
|
||||
mouth_N = mkN "suu" ;
|
||||
name_N = mkN "nimi" ;
|
||||
neck_N = mkN "kael" ;
|
||||
night_N = mkN "öö" ;
|
||||
nose_N = mkN "nina" ;
|
||||
person_N = mkN "inimene" ;
|
||||
rain_N = mkN "vihm" ;
|
||||
road_N = mkN "tee" ;
|
||||
root_N = mkN "juur" ;
|
||||
rope_N = mkN "köis" ;
|
||||
salt_N = mkN "sool" ;
|
||||
sand_N = mkN "liiv" ;
|
||||
seed_N = mkN "seeme" ;
|
||||
skin_N = mkN "nahk" ;
|
||||
sky_N = mkN "taevas" ;
|
||||
smoke_N = mkN "suits" ;
|
||||
snow_N = mkN "lumi" ;
|
||||
stick_N = mkN "kepp" ;
|
||||
tail_N = mkN "saba" ;
|
||||
tongue_N = mkN "keel" ;
|
||||
tooth_N = mkN "hammas" ;
|
||||
wife_N = mkN "naine" ;
|
||||
wind_N = mkN "tuul" ;
|
||||
wing_N = mkN "tiib" ;
|
||||
worm_N = mkN "uss" ;
|
||||
year_N = mkN "aasta" ;
|
||||
bite_V2 = mkV2 (mkV "purema") ;
|
||||
blow_V = mkV "puhuma" ;
|
||||
burn_V = mkV "põlema" ;
|
||||
count_V2 = mkV2 (mkV "loendama") ;
|
||||
cut_V2 = mkV2 (mk2V "lõikama" "lõigata") ;
|
||||
dig_V = mkV "kaevama" ;
|
||||
fall_V = mkV "kukkuma" ;
|
||||
fear_V2 = mkV2 (mkV "kartma") cpartitive ;
|
||||
fight_V2 = mkV2 (mkV "võitlema") (postPrep partitive "vastu") ;
|
||||
float_V = mkV "liuglema" ;
|
||||
flow_V = mkV "voolama" ;
|
||||
fly_V = mkV "lendama" ;
|
||||
freeze_V = mkV "jäätuma" ;
|
||||
give_V3 = mkV3 (mkV "andma") accPrep callative ;
|
||||
hit_V2 = mkV2 (mkV "lööma") cpartitive ;
|
||||
hold_V2 = mkV2 (mkV "hoidma") cpartitive ;
|
||||
hunt_V2 = mkV2 (mkV "jahti" (mkV "pidama")) cpartitive ;
|
||||
kill_V2 = mkV2 (mkV "tapma") ;
|
||||
laugh_V = mkV "naerma" ;
|
||||
lie_V = mkV "lamama" ; -- TODO: maybe: valetama
|
||||
play_V = mkV "mängima" ;
|
||||
pull_V2 = mkV2 (mkV "tõmbama") ;
|
||||
push_V2 = mkV2 (mkV "suruma") ;
|
||||
rub_V2 = mkV2 (mkV "hõõruma") cpartitive ;
|
||||
scratch_V2 = mkV2 (mkV "kraapima") cpartitive ;
|
||||
sew_V = mkV "külvama" ;
|
||||
sing_V = mkV "laulma" "laulda" "laulab" "lauldakse" ;
|
||||
sit_V = mkV "istuma" ;
|
||||
smell_V = mk2V "haistma" "haista";
|
||||
spit_V = mkV "sülitama" ;
|
||||
split_V2 = mkV2 (mkV "poolitama") ;
|
||||
squeeze_V2 = mkV2 (mkV "pigistama") cpartitive ;
|
||||
stab_V2 = mkV2 (mkV "pussitama") cpartitive ;
|
||||
stand_V = mkV "seisma" "seista" "seisab" "seistakse" ;
|
||||
suck_V2 = mkV2 (mkV "imema") cpartitive ;
|
||||
swell_V = mkV "paistetama" ; -- TODO: üles paistetama
|
||||
swim_V = mkV "ujuma" ;
|
||||
think_V = mkV "mõtlema" "mõtelda" "mõtleb" "mõeldakse";
|
||||
throw_V2 = mkV2 (mkV "viskama") ;
|
||||
tie_V2 = mkV2 (mkV "siduma" "siduda" "seob") ;
|
||||
turn_V = mkV "pöörama" ;
|
||||
vomit_V = mkV "oksendama" ;
|
||||
wash_V2 = mkV2 (mkV "pesema") ;
|
||||
wipe_V2 = mkV2 (mkV "pühkima") ;
|
||||
|
||||
breathe_V = mkV "hingama" ;
|
||||
|
||||
grammar_N = mkN "grammatika" ;
|
||||
language_N = mkN "keel" ;
|
||||
rule_N = mkN "reegel" ;
|
||||
|
||||
john_PN = mkPN "Juhan" ;
|
||||
question_N = mkN "küsimus" ;
|
||||
ready_A = mkA (mkN "valmis" "valmi" "valmit" "valmisse" "valmite" "valmeid") "valmim" "valmeim" Invariable ; -- 'valmis' is one of the non-inflecting adjectives
|
||||
reason_N = mkN "põhjus" ;
|
||||
today_Adv = mkAdv "täna" ;
|
||||
uncertain_A = mkA "ebakindel" ;
|
||||
|
||||
|
||||
oper
|
||||
mkOrd1 : N -> Ord ;
|
||||
mkOrd1 x = {s = x.s ; lock_Ord = <> } ;
|
||||
cpartitive = casePrep partitive ;
|
||||
ctranslative = casePrep translative ;
|
||||
celative = casePrep elative ;
|
||||
callative = casePrep allative ;
|
||||
know_V = (mkV "teadma" "teada" "teab") ;
|
||||
talk_V = mkV "rääkima" "rääkida" "räägib" ;
|
||||
|
||||
} ;
|
||||
11
lib/src/estonian/MakeStructuralEst.gf
Normal file
11
lib/src/estonian/MakeStructuralEst.gf
Normal file
@@ -0,0 +1,11 @@
|
||||
resource MakeStructuralEst = open CatEst, ParadigmsEst, MorphoEst, Prelude in {
|
||||
|
||||
oper
|
||||
mkConj : Str -> Str -> ParadigmsEst.Number -> Conj = \x,y,n ->
|
||||
{s1 = x ; s2 = y ; n = n ; lock_Conj = <>} ;
|
||||
mkSubj : Str -> Subj = \x ->
|
||||
{s = x ; lock_Subj = <>} ;
|
||||
mkIQuant : Str -> IQuant = \s ->
|
||||
{s = \\n,c => s ; lock_IQuant = <>} ; ----
|
||||
|
||||
}
|
||||
612
lib/src/estonian/MorphoEst.gf
Normal file
612
lib/src/estonian/MorphoEst.gf
Normal file
@@ -0,0 +1,612 @@
|
||||
--1 A Simple Estonian Resource Morphology
|
||||
--
|
||||
-- Inari Listenmaa, Kaarel Kaljurand, based on Aarne Ranta's Finnish grammar
|
||||
--
|
||||
-- This resource morphology contains definitions needed in the resource
|
||||
-- syntax. To build a lexicon, it is better to use $ParadigmsEst$, which
|
||||
-- gives a higher-level access to this module.
|
||||
|
||||
resource MorphoEst = ResEst ** open Prelude, Predef, HjkEst in {
|
||||
|
||||
flags optimize=all ; coding=utf8;
|
||||
|
||||
oper
|
||||
|
||||
----------------------
|
||||
-- morph. paradigms --
|
||||
----------------------
|
||||
|
||||
--Noun paradigms in HjkEst
|
||||
|
||||
--Comparative adjectives
|
||||
--(could just use hjk_type_IVb_audit "suurem" "a")
|
||||
-- Comparative adjectives inflect in the same way
|
||||
-- TODO: confirm this
|
||||
dSuurempi : Str -> NForms = \suurem ->
|
||||
let
|
||||
suurema = suurem + "a" ;
|
||||
in nForms6
|
||||
suurem (suurema) (suurema + "t") (suurema + "sse")
|
||||
(suurema + "te") (suurema + "id") ;
|
||||
|
||||
-- Superlatives follow the exact same pattern as comparatives
|
||||
-- TODO: confirm this
|
||||
dSuurin : Str -> NForms = \suurim -> dSuurempi suurim ;
|
||||
|
||||
--Verb paradigms
|
||||
|
||||
|
||||
-- TS 49
|
||||
-- d in da, takse, dud ; imperfect 3sg ends in i
|
||||
cSaama : (_ : Str) -> VForms = \saama ->
|
||||
let
|
||||
saa = Predef.tk 2 saama ;
|
||||
sa = init saa ;
|
||||
sai = sa + "i" ;
|
||||
in vForms8
|
||||
saama
|
||||
(saa + "da")
|
||||
(saa + "b")
|
||||
(saa + "dakse")
|
||||
(saa + "ge") -- Imper Pl
|
||||
sai
|
||||
(saa + "nud")
|
||||
(saa + "dud") ;
|
||||
|
||||
-- TS 49
|
||||
-- no d/t in da, takse ; imperfect 3sg ends in s
|
||||
cKaima : (_ : Str) -> VForms = \kaima ->
|
||||
let
|
||||
kai = Predef.tk 2 kaima ;
|
||||
in vForms8
|
||||
kaima
|
||||
(kai + "a")
|
||||
(kai + "b")
|
||||
(kai + "akse")
|
||||
(kai + "ge")
|
||||
(kai + "s")
|
||||
(kai + "nud")
|
||||
(kai + "dud") ;
|
||||
|
||||
-- TS 49
|
||||
-- vowel changes in da, takse, no d/t ; imperfect 3sg ends in i
|
||||
cJooma : (_ : Str) -> VForms = \jooma ->
|
||||
let
|
||||
j = Predef.tk 4 jooma ;
|
||||
joo = Predef.tk 2 jooma;
|
||||
o = last joo ;
|
||||
u = case o of {
|
||||
"o" => "u" ;
|
||||
"ö" => "ü" ;
|
||||
_ => o
|
||||
} ;
|
||||
q = case o of {
|
||||
("o"|"ö") => "õ" ;
|
||||
_ => o
|
||||
} ;
|
||||
juua = j + u + u + "a" ;
|
||||
j6i = j + q + "i" ;
|
||||
in vForms8
|
||||
jooma
|
||||
juua
|
||||
(joo + "b")
|
||||
(juua + "kse")
|
||||
(joo + "ge")
|
||||
j6i
|
||||
(joo + "nud")
|
||||
(joo + "dud") ;
|
||||
|
||||
-- TS 50-52 (elama, muutuma, kirjutama), 53 (tegelema) alt forms
|
||||
-- t in takse, tud; no cons.grad
|
||||
cElama : (_ : Str) -> VForms = \elama ->
|
||||
let
|
||||
ela = Predef.tk 2 elama;
|
||||
in vForms8
|
||||
elama
|
||||
(ela + "da")
|
||||
(ela + "b")
|
||||
(ela + "takse")
|
||||
(ela + "ge") -- Imperative P1 Pl
|
||||
(ela + "s") -- Imperfect P3 Sg
|
||||
(ela + "nud")
|
||||
(ela + "tud") ;
|
||||
|
||||
-- TS 53 (tegelema)
|
||||
-- d in takse, tud; g in ge; consonant stem in takse, tud, nud, ge; no cons.grad
|
||||
cTegelema : (_ : Str) -> VForms = \tegelema ->
|
||||
let
|
||||
tegele = Predef.tk 2 tegelema ;
|
||||
tegel = init tegele ;
|
||||
in vForms8
|
||||
tegelema
|
||||
(tegel + "da")
|
||||
(tegele + "b")
|
||||
(tegel + "dakse")
|
||||
(tegel + "ge") -- Imperative P1 Pl
|
||||
(tegele + "s") -- Imperfect P3 Sg
|
||||
(tegel + "nud")
|
||||
(tegel + "dud") ;
|
||||
|
||||
-- TS 54 (tulema)
|
||||
-- consonant assimilation (l,r,n) in da, takse
|
||||
-- d in tud, g in ge
|
||||
-- imperfect 3sg ends in i
|
||||
cTulema : (_ : Str) -> VForms = \tulema ->
|
||||
let
|
||||
tul = Predef.tk 3 tulema ;
|
||||
l = last tul ;
|
||||
tull = tul + l ;
|
||||
in
|
||||
vForms8
|
||||
tulema
|
||||
(tull + "a")
|
||||
(tul + "eb")
|
||||
(tull + "akse")
|
||||
(tul + "ge")
|
||||
(tul + "i")
|
||||
(tul + "nud")
|
||||
(tul + "dud") ;
|
||||
|
||||
-- TS 55-56 (õppima, sündima)
|
||||
-- t in takse, tud ; consonant gradation on stem
|
||||
cLeppima : (_ : Str) -> VForms = \leppima ->
|
||||
let
|
||||
leppi = Predef.tk 2 leppima ;
|
||||
i = last leppi ;
|
||||
lepp = init leppi ;
|
||||
lepi = (weaker lepp) + i
|
||||
in vForms8
|
||||
leppima
|
||||
(leppi + "da")
|
||||
(lepi + "b")
|
||||
(lepi + "takse")
|
||||
(leppi + "ge") -- Imperative P1 Pl
|
||||
(leppi + "s") -- Imperfect P3 Sg
|
||||
(leppi + "nud")
|
||||
(lepi + "tud") ;
|
||||
|
||||
-- TS 57 (lugema)
|
||||
-- Like 55-56 but irregular gradation patterns, that shouldn't be in HjkEst.weaker
|
||||
--including also marssima,valssima
|
||||
cLugema : (_ : Str) -> VForms = \lugema ->
|
||||
let
|
||||
luge = Predef.tk 2 lugema ;
|
||||
lug = init luge ;
|
||||
l = Predef.tk 3 luge ;
|
||||
e = last luge ;
|
||||
loe = case luge of {
|
||||
_ + ("aju"|"adu"|"agu") => l + "ao" ;
|
||||
_ + "adi" => l + "ae" ;
|
||||
"haudu" => "hau" ;
|
||||
_ + ("idu"|"igu") => l + "eo" ;
|
||||
_ + "ida" => l + "ea" ;
|
||||
_ + "udu" => l + "oo" ;
|
||||
_ + ("uge"|"ude") => l + "oe" ;
|
||||
|
||||
_ + #c + "ssi" => (init lug) + e;
|
||||
_ => (weaker lug) + e
|
||||
} ;
|
||||
in vForms8
|
||||
lugema
|
||||
(luge + "da")
|
||||
(loe + "b")
|
||||
(loe + "takse")
|
||||
(luge + "ge") -- Imperative P1 Pl
|
||||
(luge + "s") -- Imperfect P3 Sg
|
||||
(luge + "nud")
|
||||
(loe + "tud") ;
|
||||
|
||||
|
||||
-- TS 58 muutma, saatma,
|
||||
-- like laskma (TS 62, 64), but no reduplication of stem consonant (muutma~muuta, not *muutta)
|
||||
-- like andma (TS 63) but different takse (muudetakse vs. antakse)
|
||||
cMuutma : (_ : Str) -> VForms = \muutma ->
|
||||
let
|
||||
muut = Predef.tk 2 muutma ;
|
||||
muud = weaker muut ;
|
||||
in vForms8
|
||||
muutma
|
||||
(muut + "a")
|
||||
(muud + "ab")
|
||||
(muud + "etakse") -- always e?
|
||||
(muut + "ke")
|
||||
(muut + "is")
|
||||
(muut + "nud")
|
||||
(muud + "etud") ; -- always e?
|
||||
|
||||
-- TS 59-60 (petma~petetakse, jätma~jäetakse)
|
||||
-- takse given as second argument
|
||||
cPetma : (_,_ : Str) -> VForms = \petma,jaetakse ->
|
||||
let
|
||||
pet = Predef.tk 2 petma ;
|
||||
pett = stronger pet ;
|
||||
jaet = Predef.tk 4 jaetakse ;
|
||||
jaetud = jaet + "ud"
|
||||
in vForms8
|
||||
petma
|
||||
(pett + "a")
|
||||
(pet + "ab")
|
||||
jaetakse
|
||||
(pet + "ke")
|
||||
(pett + "is")
|
||||
(pet + "nud")
|
||||
jaetud ;
|
||||
|
||||
{- -- TS 60 (jatma)
|
||||
-- weak stem in ma, strong in da ; irregular takse, tud
|
||||
cJatma : (_ : Str) -> VForms = \jatma ->
|
||||
let
|
||||
jat = Predef.tk 2 jatma ;
|
||||
jatt = stronger jat ;
|
||||
ko = (weaker (weaker jat))
|
||||
--weaker jät = jäd ; weaker (weaker jät) = jä
|
||||
--weaker küt = kö ; weaker (weaker küt) = kö
|
||||
--HjkEst.weaker takes care of kütma->köetud
|
||||
in vForms8
|
||||
jatma
|
||||
(jatt + "a")
|
||||
(jat + "ab")
|
||||
(ko + "etakse") --always e?
|
||||
(jat + "ke")
|
||||
(jatt + "is")
|
||||
(jat + "nud")
|
||||
(ko + "etud") ;
|
||||
-}
|
||||
|
||||
-- TS 61 (laulma)
|
||||
--vowel (a/e) given with the second argument
|
||||
--veenma,naerma
|
||||
cKuulma : (_,_ : Str) -> VForms = \kuulma,kuuleb ->
|
||||
let
|
||||
kuul = Predef.tk 2 kuulma ;
|
||||
in vForms8
|
||||
kuulma
|
||||
(kuul + "da")
|
||||
kuuleb
|
||||
(kuul + "dakse")
|
||||
(kuul + "ge")
|
||||
(kuul + "is")
|
||||
(kuul + "nud")
|
||||
(kuul + "dud") ;
|
||||
|
||||
-- TS 62 (tõusma), 64 (mõksma)
|
||||
-- vowel (a/e) given with the second argument
|
||||
-- doesn't give alt. forms joosta, joostes
|
||||
cLaskma : (_,_ : Str) -> VForms = \laskma,laseb ->
|
||||
let
|
||||
lask = Predef.tk 2 laskma ;
|
||||
las = weaker lask ; --no effect on tõusma
|
||||
in vForms8
|
||||
laskma
|
||||
(las + "ta")
|
||||
laseb
|
||||
(las + "takse")
|
||||
(las + "ke")
|
||||
(lask + "is")
|
||||
(lask + "nud")
|
||||
(las + "tud") ;
|
||||
|
||||
-- TS 62 alt forms
|
||||
cJooksma : (_ : Str) -> VForms = \jooksma ->
|
||||
let
|
||||
jooks = Predef.tk 2 jooksma ;
|
||||
joos = (Predef.tk 2 jooks) + "s" ;
|
||||
in vForms8
|
||||
jooksma
|
||||
(joos + "ta")
|
||||
(jooks + "eb")
|
||||
(joos + "takse")
|
||||
(joos + "ke")
|
||||
(jooks + "is")
|
||||
(jooks + "nud")
|
||||
(joos + "tud") ;
|
||||
|
||||
-- TS 63 (andma, murdma, hoidma)
|
||||
-- vowel given in second arg (andma~annab; tundma~tunneb)
|
||||
cAndma : (_,_ : Str) -> VForms = \andma,annab ->
|
||||
let
|
||||
and = Predef.tk 2 andma ; --murd(ma), hoid(ma)
|
||||
an = init and ; --mur(d), hoi(d)
|
||||
ann = weaker and ; --murr, hoi
|
||||
te = case (last ann) of { --to prevent teadma~teaab
|
||||
"a" => init ann ;
|
||||
_ => ann
|
||||
} ;
|
||||
in vForms8
|
||||
andma
|
||||
(and + "a")
|
||||
annab
|
||||
(an + "takse")
|
||||
(and + "ke")
|
||||
(and + "is")
|
||||
(and + "nud")
|
||||
(an + "tud") ;
|
||||
|
||||
-- TS 65 (pesema)
|
||||
-- a consonant stem verb in disguise
|
||||
cPesema : (_ : Str) -> VForms = \pesema ->
|
||||
let
|
||||
pese = Predef.tk 2 pesema ;
|
||||
pes = init pese ;
|
||||
in vForms8
|
||||
pesema
|
||||
(pes + "ta")
|
||||
(pese + "b")
|
||||
(pes + "takse")
|
||||
(pes + "ke")
|
||||
(pes + "i")
|
||||
(pes + "nud")
|
||||
(pes + "tud") ;
|
||||
|
||||
-- TS 66 (nägema)
|
||||
-- näg, näh and näi stems
|
||||
cNagema : (_ : Str) -> VForms = \nagema ->
|
||||
let
|
||||
nage = Predef.tk 2 nagema ;
|
||||
nag = init nage ;
|
||||
na = init nag ;
|
||||
nah = na + "h" ;
|
||||
nai = na + "i" ;
|
||||
in vForms8
|
||||
nagema
|
||||
(nah + "a")
|
||||
(na + "eb")
|
||||
(nah + "akse")
|
||||
(nah + "ke")
|
||||
(nag + "i")
|
||||
(nai + "nud")
|
||||
(nah + "tud") ;
|
||||
|
||||
|
||||
-- TS 67-68 (hüppama, tõmbama)
|
||||
-- strong stem in ma, b, s
|
||||
-- weak stem in da, takse, ge, nud, tud
|
||||
-- t in da, takse; k in ge
|
||||
cHyppama : (_ : Str) -> VForms = \hyppama ->
|
||||
let
|
||||
hyppa = Predef.tk 2 hyppama ;
|
||||
hypp = init hyppa ;
|
||||
a = last hyppa ;
|
||||
hypa = (weaker hypp) + a
|
||||
in vForms8
|
||||
hyppama
|
||||
(hypa + "ta")
|
||||
(hyppa + "b")
|
||||
(hypa + "takse") -- Passive
|
||||
(hypa + "ke") -- Imperative P1 Pl
|
||||
(hyppa + "s") -- Imperfect Sg P3
|
||||
(hypa + "nud") -- PastPartAct
|
||||
(hypa + "tud") ; -- PastPartPass
|
||||
|
||||
-- TS 69 (õmblema)
|
||||
cOmblema : (_ : Str) -> VForms = \omblema ->
|
||||
let
|
||||
omble = Predef.tk 2 omblema ;
|
||||
e = last omble ;
|
||||
l = last (init omble) ;
|
||||
omb = Predef.tk 2 omble ;
|
||||
omm = case omb of {
|
||||
"mõt" => "mõe" ; --some "double weak" patterns; however weaker (weaker omb) makes the coverage worse
|
||||
_ => weaker omb
|
||||
} ;
|
||||
ommel = omm + e + l ;
|
||||
in vForms8
|
||||
omblema
|
||||
(ommel + "da")
|
||||
(omble + "b")
|
||||
(ommel + "dakse") -- Passive
|
||||
(ommel + "ge") -- Imperative P1 Pl
|
||||
(omble + "s") -- Imperfect Sg P3
|
||||
(ommel + "nud") -- PastPartAct
|
||||
(ommel + "dud") ; -- PastPartPass
|
||||
|
||||
-- 2-arg paradigm to distinguish between 50-52 and 55-57
|
||||
cSattumaPettuma : (_,_ : Str) -> VForms = \pettuma,satub ->
|
||||
let
|
||||
pettu = Predef.tk 2 pettuma ;
|
||||
satu = init satub ;
|
||||
in vForms8
|
||||
pettuma
|
||||
(pettu + "da")
|
||||
(satu + "b")
|
||||
(satu + "takse") -- Passive
|
||||
(pettu + "ge") -- Imperative P1 Pl
|
||||
(pettu + "s") -- Imperfect Sg P3
|
||||
(pettu + "nud") -- PastPartAct
|
||||
(satu + "tud") ; -- PastPartPass
|
||||
|
||||
|
||||
|
||||
-----------------
|
||||
-- auxiliaries --
|
||||
-----------------
|
||||
|
||||
|
||||
{- Noun internal opers moved to ResEst
|
||||
|
||||
These used to be here:
|
||||
NForms : Type = Predef.Ints 5 => Str ;
|
||||
Noun : Type = {s: NForm => Str } ;
|
||||
nForms6 : (x1,_,_,_,_,x6 : Str) -> NForms ;
|
||||
n2nforms : Noun -> NForms ;
|
||||
nForms2N : NForms -> Noun ;
|
||||
|
||||
-}
|
||||
|
||||
-- Adjective forms
|
||||
|
||||
AForms : Type = {
|
||||
posit : NForms ;
|
||||
compar : NForms ;
|
||||
superl : NForms ;
|
||||
adv_posit, adv_compar, adv_superl : Str ;
|
||||
} ;
|
||||
|
||||
aForms2A : AForms -> Adjective = \afs -> {
|
||||
s = table {
|
||||
Posit => table {
|
||||
AN n => (nForms2N afs.posit).s ! n ;
|
||||
AAdv => afs.adv_posit
|
||||
} ;
|
||||
Compar => table {
|
||||
AN n => (nForms2N afs.compar).s ! n ;
|
||||
AAdv => afs.adv_compar
|
||||
} ;
|
||||
Superl => table {
|
||||
AN n => (nForms2N afs.superl).s ! n ;
|
||||
AAdv => afs.adv_superl
|
||||
}
|
||||
} ;
|
||||
lock_A = <>
|
||||
} ;
|
||||
|
||||
nforms2aforms : NForms -> AForms = \nforms ->
|
||||
let
|
||||
suure = init (nforms ! 1) ;
|
||||
suur = Predef.tk 4 (nforms ! 8) ;
|
||||
in {
|
||||
posit = nforms ;
|
||||
compar = dSuurempi (suure ++ "m") ;
|
||||
superl = dSuurin (suur ++ "im") ;
|
||||
adv_posit = suure + "sti" ;
|
||||
adv_compar = suure + "mmin" ;
|
||||
adv_superl = suur + "immin" ;
|
||||
} ;
|
||||
|
||||
{- Verb internal opers moved to ResEst
|
||||
|
||||
These used to be here:
|
||||
VForms : Type = Predef.Ints 7 => Str ;
|
||||
vForms8 : (x1,_,_,_,_,_,_,x8 : Str) -> VForms ;
|
||||
regVForms : (x1,_,_,x4 : Str) -> VForms ;
|
||||
vforms2V : VForms -> Verb ;
|
||||
-}
|
||||
|
||||
|
||||
-----------------------
|
||||
-- for Structural
|
||||
-----------------------
|
||||
|
||||
caseTable : Number -> CommonNoun -> Case => Str = \n,cn ->
|
||||
\\c => cn.s ! NCase n c ;
|
||||
|
||||
mkDet : Number -> CommonNoun -> {
|
||||
s,sp : Case => Str ; -- minun kolme
|
||||
n : Number ; -- Pl (agreement feature for verb)
|
||||
isNum : Bool ; -- True (a numeral is present)
|
||||
isDef : Bool -- True (verb agrees in Pl, Nom is not Part)
|
||||
} = \n, noun -> heavyDet {
|
||||
s = \\c => noun.s ! NCase n c ;
|
||||
n = n ;
|
||||
isNum = False ;
|
||||
isDef = True --- does this hold for all new dets?
|
||||
} ;
|
||||
|
||||
-- Here we define personal and relative pronouns.
|
||||
|
||||
-- input forms: Nom, Gen, Part
|
||||
-- Note that the Fin version required 5 input forms, the
|
||||
-- Est pronouns thus seem to be much simpler.
|
||||
-- TODO: remove NPAcc?
|
||||
-- I: keep NPAcc; see appCompl in ResEst, it takes care of finding a right case for various types of complements; incl. when pronouns get different treatment than nouns (PassVP).
|
||||
mkPronoun : (_,_,_ : Str) -> Number -> Person ->
|
||||
{s : NPForm => Str ; a : Agr} =
|
||||
\mina, minu, mind, n, p ->
|
||||
let {
|
||||
minu_short = ie_to_i minu
|
||||
} in
|
||||
{s = table {
|
||||
NPCase Nom => mina ;
|
||||
NPCase Gen => minu ;
|
||||
NPCase Part => mind ;
|
||||
NPCase Transl => minu + "ks" ;
|
||||
NPCase Ess => minu + "na" ;
|
||||
NPCase Iness => minu_short + "s" ;
|
||||
NPCase Elat => minu_short + "st" ;
|
||||
NPCase Illat => minu_short + "sse" ;
|
||||
NPCase Adess => minu_short + "l" ;
|
||||
NPCase Ablat => minu_short + "lt" ;
|
||||
NPCase Allat => minu_short + "le" ;
|
||||
NPCase Abess => minu + "ta" ;
|
||||
NPCase Comit => minu + "ga" ;
|
||||
NPCase Termin => minu + "ni" ;
|
||||
NPAcc => mind
|
||||
} ;
|
||||
a = Ag n p
|
||||
} ;
|
||||
|
||||
-- meiesse/teiesse -> meisse/teisse
|
||||
ie_to_i : Str -> Str ;
|
||||
ie_to_i x =
|
||||
case x of {
|
||||
x1 + "ie" + x2 => x1 + "i" + x2 ;
|
||||
_ => x
|
||||
} ;
|
||||
|
||||
-- TODO: this does not seem to be called from anyway
|
||||
mkDemPronoun : (_,_,_,_,_ : Str) -> Number ->
|
||||
{s : NPForm => Str ; a : Agr} =
|
||||
\tuo, tuon, tuota, tuona, tuohon, n ->
|
||||
let pro = mkPronoun tuo tuon tuota n P3
|
||||
in {
|
||||
s = table {
|
||||
NPAcc => tuo ;
|
||||
c => pro.s ! c
|
||||
} ;
|
||||
a = pro.a
|
||||
} ;
|
||||
|
||||
-- The relative pronoun, "joka", is inflected in case and number,
|
||||
-- like common nouns, but it does not take possessive suffixes.
|
||||
-- The inflextion shows a surprising similarity with "suo".
|
||||
|
||||
oper
|
||||
-- TODO: fix: Nom => kelled
|
||||
-- TODO: mis
|
||||
relPron : Number => Case => Str =
|
||||
let kes = nForms2N (nForms6 "kes" "kelle" "keda" "kellesse" "kelle" "keda") in
|
||||
\\n,c => kes.s ! NCase n c ;
|
||||
|
||||
ProperName = {s : Case => Str} ;
|
||||
|
||||
-- TODO: generate using mkPronoun
|
||||
pronSe : ProperName = {
|
||||
s = table {
|
||||
Nom => "see" ;
|
||||
Gen => "selle" ;
|
||||
Part => "seda" ;
|
||||
Transl => "selleks" ;
|
||||
Ess => "sellena" ;
|
||||
Iness => "selles" ;
|
||||
Elat => "sellest" ;
|
||||
Illat => "sellesse" ;
|
||||
Adess => "sellel" ;
|
||||
Ablat => "sellelt" ;
|
||||
Allat => "sellele" ;
|
||||
Abess => "selleta" ;
|
||||
Comit => "sellega" ;
|
||||
Termin => "selleni"
|
||||
} ;
|
||||
} ;
|
||||
|
||||
-- TODO: generate using mkPronoun
|
||||
pronNe : ProperName = {
|
||||
s = table {
|
||||
Nom => "need" ;
|
||||
Gen => "nende" ;
|
||||
Part => "neid" ;
|
||||
Transl => "nendeks" ;
|
||||
Ess => "nendena" ;
|
||||
Iness => "nendes" ;
|
||||
Elat => "nendest" ;
|
||||
Illat => "nendesse" ;
|
||||
Adess => "nendel" ;
|
||||
Ablat => "nendelt" ;
|
||||
Allat => "nendele" ;
|
||||
Abess => "nendeta" ;
|
||||
Comit => "nendega" ;
|
||||
Termin => "nendeni"
|
||||
} ;
|
||||
} ;
|
||||
|
||||
}
|
||||
226
lib/src/estonian/NounEst.gf
Normal file
226
lib/src/estonian/NounEst.gf
Normal file
@@ -0,0 +1,226 @@
|
||||
concrete NounEst of Noun = CatEst ** open ResEst, HjkEst, MorphoEst, Prelude in {
|
||||
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lin
|
||||
|
||||
-- The $Number$ is subtle: "nuo autot", "nuo kolme autoa" are both plural
|
||||
-- for verb agreement, but the noun form is singular in the latter.
|
||||
|
||||
DetCN det cn =
|
||||
let
|
||||
n : Number = case det.isNum of {
|
||||
True => Sg ;
|
||||
_ => det.n
|
||||
} ;
|
||||
ncase : NPForm -> Case * NForm = \c ->
|
||||
let k = npform2case n c
|
||||
in
|
||||
case <n, c, det.isNum, det.isDef> of {
|
||||
<_, NPAcc, True,_> => <Nom,NCase Sg Part> ; -- kolm kassi (as object)
|
||||
<_, NPCase Nom, True,_> => <Nom,NCase Sg Part> ; -- kolm kassi (as subject)
|
||||
|
||||
--Only the last word gets case ending.
|
||||
<_, NPCase Comit, _, _> => <Gen,NCase n Comit> ; -- kolme kassiga
|
||||
<_, NPCase Abess, _, _> => <Gen,NCase n Abess> ; -- kolme kassita
|
||||
<_, NPCase Ess, _, _> => <Gen,NCase n Ess> ; -- kolme kassina
|
||||
<_, NPCase Termin,_, _> => <Gen,NCase n Termin> ; -- kolme kassini
|
||||
|
||||
<_, _, True,_> => <k, NCase Sg k> ; -- kolmeks kassiks (all other cases)
|
||||
_ => <k, NCase n k> -- kass, kassi, ... (det is not a number)
|
||||
}
|
||||
in {
|
||||
s = \\c => let
|
||||
k = ncase c ;
|
||||
in
|
||||
det.s ! k.p1 ++ cn.s ! k.p2 ;
|
||||
a = agrP3 det.n ;
|
||||
-- (case det.isNum of {
|
||||
-- True => Sg ;
|
||||
-- _ => det.n
|
||||
-- }) ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
DetNP det =
|
||||
let
|
||||
n : Number = case det.isNum of {
|
||||
True => Sg ;
|
||||
_ => det.n
|
||||
} ;
|
||||
in {
|
||||
s = \\c => let k = npform2case n c in
|
||||
det.sp ! k ;
|
||||
a = agrP3 (case det.isDef of {
|
||||
False => Sg ; -- autoja menee; kolme autoa menee
|
||||
_ => det.n
|
||||
}) ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
UsePN pn = {
|
||||
s = \\c => pn.s ! npform2case Sg c ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
UsePron p = p ** {isPron = True} ;
|
||||
|
||||
PredetNP pred np = {
|
||||
s = \\c => pred.s ! complNumAgr np.a ! c ++ np.s ! c ;
|
||||
a = np.a ;
|
||||
isPron = np.isPron -- kaikki minun - ni
|
||||
} ;
|
||||
|
||||
PPartNP np v2 =
|
||||
let
|
||||
num : Number = complNumAgr np.a ;
|
||||
part : Str = v2.s ! (PastPart Pass) ;
|
||||
adj : NForms = hjk_type_IVb_maakas part ;
|
||||
partGen : Str = adj ! 1 ;
|
||||
partEss : Str = partGen + "na"
|
||||
in {
|
||||
s = \\c => np.s ! c ++ part ; --partEss ;
|
||||
a = np.a ;
|
||||
isPron = np.isPron -- minun täällä - ni
|
||||
} ;
|
||||
|
||||
AdvNP np adv = {
|
||||
s = \\c => np.s ! c ++ adv.s ;
|
||||
a = np.a ;
|
||||
isPron = np.isPron -- minun täällä - ni
|
||||
} ;
|
||||
|
||||
DetQuantOrd quant num ord = {
|
||||
s = \\c => quant.s ! num.n ! c ++ num.s ! Sg ! c ++ ord.s ! NCase num.n c ;
|
||||
sp = \\c => quant.sp ! num.n ! c ++ num.s ! Sg ! c ++ ord.s ! NCase num.n c ;
|
||||
n = num.n ;
|
||||
isNum = num.isNum ;
|
||||
isDef = quant.isDef
|
||||
} ;
|
||||
|
||||
DetQuant quant num = {
|
||||
s = \\c => quant.s ! num.n ! c ++ num.s ! Sg ! c ;
|
||||
sp = \\c => quant.sp ! num.n ! c ++ num.s ! Sg ! c ;
|
||||
n = num.n ;
|
||||
isNum = num.isNum ; -- case num.n of {Sg => False ; _ => True} ;
|
||||
isDef = quant.isDef
|
||||
} ;
|
||||
|
||||
PossPron p = {
|
||||
s,sp = \\_,_ => p.s ! NPCase Gen ;
|
||||
isNum = False ;
|
||||
isDef = True --- "minun kolme autoani ovat" ; thus "...on" is missing
|
||||
} ;
|
||||
|
||||
NumSg = {s = \\_,_ => [] ; isNum = False ; n = Sg} ;
|
||||
NumPl = {s = \\_,_ => [] ; isNum = False ; n = Pl} ;
|
||||
|
||||
NumCard n = n ** {isNum = case n.n of {Sg => False ; _ => True}} ; -- üks raamat/kaks raamatut
|
||||
|
||||
NumDigits numeral = {
|
||||
s = \\n,c => numeral.s ! NCard (NCase n c) ;
|
||||
n = numeral.n
|
||||
} ;
|
||||
OrdDigits numeral = {s = \\nc => numeral.s ! NOrd nc} ;
|
||||
|
||||
NumNumeral numeral = {
|
||||
s = \\n,c => numeral.s ! NCard (NCase n c) ;
|
||||
n = numeral.n
|
||||
} ;
|
||||
OrdNumeral numeral = {s = \\nc => numeral.s ! NOrd nc} ;
|
||||
|
||||
AdNum adn num = {
|
||||
s = \\n,c => adn.s ++ num.s ! n ! c ;
|
||||
n = num.n
|
||||
} ;
|
||||
|
||||
-- OrdSuperl a = {s = \\nc => a.s ! Superl ! AN nc} ;
|
||||
-- TODO: it is more robust to use: kõige + Compar
|
||||
OrdSuperl a = {s = \\nc => "kõige" ++ a.s ! Compar ! AN nc} ;
|
||||
|
||||
DefArt = {
|
||||
s = \\_,_ => [] ;
|
||||
sp = table {Sg => pronSe.s ; Pl => pronNe.s} ;
|
||||
isNum = False ;
|
||||
isDef = True -- autot ovat
|
||||
} ;
|
||||
|
||||
IndefArt = {
|
||||
s = \\_,_ => [] ; --use isDef in DetCN
|
||||
sp = \\n,c =>
|
||||
(nForms2N (nForms6 "üks" "ühe" "üht" "ühesse" "ühtede"
|
||||
"ühtesid")).s ! NCase n c ;
|
||||
isNum,isDef = False -- autoja on
|
||||
} ;
|
||||
|
||||
MassNP cn =
|
||||
let
|
||||
n : Number = Sg ;
|
||||
ncase : Case -> NForm = \c -> NCase n c ;
|
||||
in {
|
||||
s = \\c => let k = npform2case n c in
|
||||
cn.s ! ncase k ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
UseN n = n ;
|
||||
|
||||
UseN2 n = n ;
|
||||
|
||||
Use2N3 f = lin N2 {
|
||||
s = f.s ;
|
||||
c2 = f.c2 ;
|
||||
isPre = f.isPre
|
||||
} ;
|
||||
Use3N3 f = lin N2 {
|
||||
s = f.s ;
|
||||
c2 = f.c3 ;
|
||||
isPre = f.isPre2
|
||||
} ;
|
||||
|
||||
ComplN2 f x = {
|
||||
s = \\nf => preOrPost f.isPre (f.s ! nf) (appCompl True Pos f.c2 x)
|
||||
} ;
|
||||
|
||||
|
||||
ComplN3 f x = lin N2 {
|
||||
s = \\nf => preOrPost f.isPre (f.s ! nf) (appCompl True Pos f.c2 x) ;
|
||||
c2 = f.c3 ;
|
||||
isPre = f.isPre2
|
||||
} ;
|
||||
|
||||
|
||||
AdjCN ap cn = {
|
||||
s = \\nf =>
|
||||
case ap.infl of {
|
||||
(Invariable|Participle) => ap.s ! True ! (NCase Sg Nom) ++ cn.s ! nf ; --valmis kassile; väsinud kassile
|
||||
Regular => case nf of {
|
||||
NCase num (Ess|Abess|Comit|Termin) => ap.s ! True ! (NCase num Gen) ++ cn.s ! nf ; --suure kassiga, not *suurega kassiga
|
||||
_ => ap.s ! True ! nf ++ cn.s ! nf
|
||||
}
|
||||
}
|
||||
} ;
|
||||
|
||||
RelCN cn rs = {s = \\nf => cn.s ! nf ++ rs.s ! agrP3 (numN nf)} ;
|
||||
|
||||
RelNP np rs = {
|
||||
s = \\c => np.s ! c ++ "," ++ rs.s ! np.a ;
|
||||
a = np.a ;
|
||||
isPron = np.isPron ---- correct ?
|
||||
} ;
|
||||
|
||||
AdvCN cn ad = {s = \\nf => cn.s ! nf ++ ad.s} ;
|
||||
|
||||
SentCN cn sc = {s = \\nf=> cn.s ! nf ++ sc.s} ;
|
||||
|
||||
ApposCN cn np = {s = \\nf=> cn.s ! nf ++ np.s ! NPCase Nom} ; --- luvun x
|
||||
|
||||
oper
|
||||
numN : NForm -> Number = \nf -> case nf of {
|
||||
NCase n _ => n ;
|
||||
_ => Sg ---
|
||||
} ;
|
||||
|
||||
|
||||
}
|
||||
160
lib/src/estonian/NumeralEst.gf
Normal file
160
lib/src/estonian/NumeralEst.gf
Normal file
@@ -0,0 +1,160 @@
|
||||
concrete NumeralEst of Numeral = CatEst [Numeral,Digits] ** open Prelude, ParadigmsEst, MorphoEst in {
|
||||
|
||||
-- Notice: possessive forms are not used. They get wrong, since every
|
||||
-- part is made to agree in them.
|
||||
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lincat
|
||||
Sub1000000 = {s : CardOrd => Str ; n : MorphoEst.Number} ;
|
||||
Digit = {s : CardOrd => Str} ;
|
||||
Sub10, Sub100, Sub1000 = {s : NumPlace => CardOrd => Str ; n : MorphoEst.Number} ;
|
||||
|
||||
lin
|
||||
num x = x ;
|
||||
n2 = co (mkN "kaks" "kahe" "kahte" "kahte" "kahtede" "kahtesid")
|
||||
(mkN "teine" "teise" "teist" "teisesse" "teiste" "teisi") ;
|
||||
n3 = co (mkN "kolm" "kolme" "kolme" "kolme" "kolmede" "kolmi")
|
||||
(mkN "kolmas" "kolmanda" "kolmandat" "kolmandasse" "kolmandate" "kolmandaid") ;
|
||||
n4 = co (mkN "neli" "nelja" "nelja" "nelja" "neljade" "neljasid")
|
||||
(mkN "neljas" "neljanda" "neljandat" "neljandasse" "neljandate" "neljandaid") ;
|
||||
n5 = co (mkN "viis" "viie" "viit" "viide" "viite" "viisi")
|
||||
(mkN "viies" "viienda" "viiendat" "viiendasse" "viiendate" "viiendaid") ;
|
||||
n6 = co (mkN "kuus" "kuue" "kuut" "kuude" "kuute" "kuusi")
|
||||
(mkN "kuues" "kuuenda" "kuuendat" "kuuendasse" "kuuendate" "kuuendaid") ;
|
||||
n7 = co (mkN "seitse" "seitsme" "seitset" "seitsmesse" "seitsmete" "seitsmeid")
|
||||
(mkN "seitsmes" "seitsmenda" "seitsmendat" "seitsmendasse" "seitsmendate" "seitsmendaid") ;
|
||||
n8 = co (mkN "kaheksa")
|
||||
(mkN "kaheksas" "kaheksanda" "kaheksandat" "kaheksandasse" "kaheksandate" "kaheksandaid") ;
|
||||
n9 = co (mkN "üheksa")
|
||||
(mkN "üheksas" "üheksanda" "üheksandat" "üheksandasse" "üheksandate" "üheksandaid") ;
|
||||
|
||||
pot01 =
|
||||
{s = table {
|
||||
NumAttr => \\_ => [] ;
|
||||
NumIndep => yksN.s
|
||||
} ;
|
||||
n = Sg
|
||||
} ;
|
||||
pot0 d = {n = Pl ; s = \\_ => d.s} ;
|
||||
pot110 =
|
||||
{s = \\_ => kymmeN.s ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
pot111 = {n = Pl ; s = \\_,c => yksN.s ! c ++ BIND ++ "teist"} ;
|
||||
pot1to19 d = {n = Pl ; s = \\_,c => d.s ! c ++ BIND ++ "teist"} ;
|
||||
pot0as1 n = n ;
|
||||
|
||||
pot1 d = {n = Pl ; s = \\_,c => d.s ! c ++ BIND ++ kymmendN.s ! c} ;
|
||||
pot1plus d e = {
|
||||
n = Pl ;
|
||||
s = \\_,c => d.s ! c ++ BIND ++ kymmendN.s ! c ++ e.s ! NumIndep ! c
|
||||
} ;
|
||||
pot1as2 n = n ;
|
||||
pot2 d = {n = Pl ; s = \\_,c => d.s ! NumAttr ! c ++ nBIND d.n ++ sataaN.s ! d.n ! c} ;
|
||||
pot2plus d e = {
|
||||
n = Pl ;
|
||||
s = \\_,c => d.s ! NumAttr ! c ++ nBIND d.n ++ sataaN.s ! d.n ! c ++
|
||||
e.s ! NumIndep ! c
|
||||
} ;
|
||||
pot2as3 n = {n = n.n ; s = n.s ! NumIndep} ;
|
||||
pot3 d = {n = Pl ; s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c} ;
|
||||
pot3plus d e = {
|
||||
n = Pl ;
|
||||
s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c ++ e.s ! NumIndep ! c
|
||||
} ;
|
||||
|
||||
oper
|
||||
co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> {
|
||||
s = table {
|
||||
NCard nf => c.s ! nf ;
|
||||
NOrd nf => o.s ! nf
|
||||
}
|
||||
} ;
|
||||
|
||||
nBIND : Number -> Str = \n -> case n of {Sg => [] ; _ => BIND} ; -- no BIND after silent 1
|
||||
|
||||
param
|
||||
NumPlace = NumIndep | NumAttr ;
|
||||
|
||||
oper
|
||||
yksN = co
|
||||
(mkN "üks" "ühe" "ühte" "ühte" "ühtede" "ühtesid")
|
||||
(mkN "esimene" "esimese" "esimest" "esimesse" "esimeste" "esimesi") ;
|
||||
|
||||
kymmeN = co
|
||||
(mkN "kümme" "kümne" "kümmet" "kümnesse" "kümnete" "kümneid")
|
||||
(mkN "kümnes" "kümnenda" "kümnendat" "kümnendasse" "kümnendate" "kümnendaid") ;
|
||||
|
||||
sadaN = co
|
||||
(mkN "sada" "saja" "sadat" "sajasse" "sadade" "sadu")
|
||||
(mkN "sajas" "sajanda" "sajandat" "sajandasse" "sajandate" "sajandaid") ;
|
||||
|
||||
tuhatN = co
|
||||
(mkN "tuhat" "tuhande" "tuhandet" "tuhandesse" "tuhandete" "tuhandeid")
|
||||
(mkN "tuhandes" "tuhandenda" "tuhandendat" "tuhandendasse" "tuhandete" "tuhandendaid") ;
|
||||
|
||||
kymmendN =
|
||||
{s = table {
|
||||
NCard (NCase Sg Nom) => "kümmend" ;
|
||||
k => kymmeN.s ! k
|
||||
}
|
||||
} ;
|
||||
|
||||
sataaN : {s : MorphoEst.Number => CardOrd => Str} = {s = table {
|
||||
Sg => sadaN.s ;
|
||||
Pl => table {
|
||||
NCard (NCase Sg Nom) => "sada" ;
|
||||
k => sadaN.s ! k
|
||||
}
|
||||
}
|
||||
} ;
|
||||
|
||||
tuhattaN = {s = table {
|
||||
Sg => tuhatN.s ;
|
||||
Pl => table {
|
||||
NCard (NCase Sg Nom) => "tuhat" ;
|
||||
k => tuhatN.s ! k
|
||||
}
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
lincat
|
||||
Dig = TDigit ;
|
||||
|
||||
lin
|
||||
IDig d = d ;
|
||||
|
||||
IIDig d i = {
|
||||
s = \\o => d.s ! NCard (NCase Sg Nom) ++ i.s ! o ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
D_0 = mkDig "0" ;
|
||||
D_1 = mk3Dig "1" "1." MorphoEst.Sg ;
|
||||
D_2 = mkDig "2" ;
|
||||
D_3 = mkDig "3" ;
|
||||
D_4 = mkDig "4" ;
|
||||
D_5 = mkDig "5" ;
|
||||
D_6 = mkDig "6" ;
|
||||
D_7 = mkDig "7" ;
|
||||
D_8 = mkDig "8" ;
|
||||
D_9 = mkDig "9" ;
|
||||
|
||||
oper
|
||||
mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o MorphoEst.Pl ;
|
||||
mkDig : Str -> TDigit = \c -> mk2Dig c (c + ".") ;
|
||||
|
||||
mk3Dig : Str -> Str -> MorphoEst.Number -> TDigit = \c,o,n -> {
|
||||
s = table {NCard _ => c ; NOrd _ => o} ;
|
||||
n = n
|
||||
} ;
|
||||
|
||||
TDigit = {
|
||||
n : MorphoEst.Number ;
|
||||
s : CardOrd => Str
|
||||
} ;
|
||||
|
||||
}
|
||||
786
lib/src/estonian/ParadigmsEst.gf
Normal file
786
lib/src/estonian/ParadigmsEst.gf
Normal file
@@ -0,0 +1,786 @@
|
||||
--1 Estonian Lexical Paradigms
|
||||
--
|
||||
-- Based on the Finnish Lexical Paradigms by Aarne Ranta 2003--2008
|
||||
--
|
||||
-- This is an API to the user of the resource grammar
|
||||
-- for adding lexical items. It gives functions for forming
|
||||
-- expressions of open categories: nouns, adjectives, verbs.
|
||||
--
|
||||
-- Closed categories (determiners, pronouns, conjunctions) are
|
||||
-- accessed through the resource syntax API and $Structural.gf$.
|
||||
--
|
||||
-- The main difference with $MorphoEst.gf$ is that the types
|
||||
-- referred to are compiled resource grammar types. We have moreover
|
||||
-- had the design principle of always having existing forms, rather
|
||||
-- than stems, as string arguments of the paradigms.
|
||||
--
|
||||
-- The structure of functions for each word class $C$ is the following:
|
||||
-- there is a polymorphic constructor $mkC$, which takes one or
|
||||
-- a few arguments. In Estonian, one argument is enough in ??? % of
|
||||
-- cases in average.
|
||||
|
||||
resource ParadigmsEst = open
|
||||
(Predef=Predef),
|
||||
Prelude,
|
||||
MorphoEst,
|
||||
HjkEst,
|
||||
CatEst
|
||||
in {
|
||||
|
||||
flags optimize=noexpand ; coding=utf8;
|
||||
|
||||
--2 Parameters
|
||||
--
|
||||
-- To abstract over gender, number, and (some) case names,
|
||||
-- we define the following identifiers. The application programmer
|
||||
-- should always use these constants instead of the constructors
|
||||
-- defined in $ResEst$.
|
||||
|
||||
oper
|
||||
Number : Type ;
|
||||
|
||||
singular : Number ;
|
||||
plural : Number ;
|
||||
|
||||
Case : Type ;
|
||||
nominative : Case ; -- e.g. "karp"
|
||||
genitive : Case ; -- e.g. "karbi"
|
||||
partitive : Case ; -- e.g. "karpi"
|
||||
illative : Case ; -- e.g. "karbisse/karpi"
|
||||
inessive : Case ; -- e.g. "karbis"
|
||||
elative : Case ; -- e.g. "karbist"
|
||||
allative : Case ; -- e.g. "karbile"
|
||||
adessive : Case ; -- e.g. "karbil"
|
||||
ablative : Case ; -- e.g. "karbilt"
|
||||
translative : Case ; -- e.g. "karbiks"
|
||||
terminative : Case ; -- e.g. "karbini"
|
||||
essive : Case ; -- e.g. "karbina"
|
||||
abessive : Case ; -- e.g. "karbita"
|
||||
comitative : Case ; -- e.g. "karbiga"
|
||||
|
||||
infDa : InfForm ; -- e.g. "lugeda"
|
||||
infDes : InfForm ;
|
||||
infMa : InfForm ; -- e.g. "lugema"
|
||||
infMas : InfForm ; -- e.g. "lugemas"
|
||||
infMaks : InfForm ; -- e.g. "lugemaks"
|
||||
infMast : InfForm ; -- e.g. "lugemast"
|
||||
infMata : InfForm ; -- e.g. "lugemata"
|
||||
|
||||
-- The following type is used for defining *rection*, i.e. complements
|
||||
-- of many-place verbs and adjective. A complement can be defined by
|
||||
-- just a case, or a pre/postposition and a case.
|
||||
|
||||
prePrep : Case -> Str -> Prep ; -- preposition, e.g. comitative "koos"
|
||||
postPrep : Case -> Str -> Prep ; -- postposition, e.g. genitive "taga"
|
||||
postGenPrep : Str -> Prep ; -- genitive postposition, e.g. "taga"
|
||||
casePrep : Case -> Prep ; -- just case, e.g. adessive
|
||||
|
||||
-- TODO build the dict
|
||||
NW : Type ; -- Noun from DictEst (WordNet)
|
||||
AW : Type ; -- Adjective from DictEst (WordNet)
|
||||
VW : Type ; -- Verb from DictEst (WordNet)
|
||||
AdvW : Type ; -- Adverb from DictEst (WordNet)
|
||||
|
||||
--2 Nouns
|
||||
|
||||
-- The worst case gives six forms.
|
||||
-- In practice just a couple of forms are needed to define the different
|
||||
-- stems, vowel alternation, and vowel harmony.
|
||||
|
||||
oper
|
||||
|
||||
-- The regular noun heuristic takes just one form (singular
|
||||
-- nominative) and analyses it to pick the correct paradigm.
|
||||
-- It does automatic grade alternation, and is hence not usable
|
||||
-- for words like "auto" (whose genitive would become "audon").
|
||||
--
|
||||
-- If the one-argument paradigm does not give the correct result, one can try and give
|
||||
-- two or three forms. Most notably, the two-argument variant is used
|
||||
-- for nouns like "kivi - kiviä", which would otherwise become like
|
||||
-- "rivi - rivejä". Three arguments are used e.g. for
|
||||
-- "auto - auton - autoja", which would otherwise become
|
||||
-- "auto - audon".
|
||||
|
||||
mkN : overload {
|
||||
mkN : (kukko : Str) -> N ; -- predictable nouns, covers 82%
|
||||
mkN : (savi,savia : Str) -> N ; -- different pl.part
|
||||
mkN : (vesi,veden,vesia : Str) -> N ; -- also different sg.gen
|
||||
mkN : (pank,panga,panka,panku : Str) -> N ; -- sg nom,gen,part, pl.part
|
||||
|
||||
-- mkN : (olo,n,a,na,oon,jen,ja,ina,issa,ihin : Str) -> N ; -- worst case, 10 forms
|
||||
mkN : (oun,ouna,ouna,ounasse,ounte,ounu : Str) -> N ; -- worst case, 6 forms
|
||||
mkN : (oun,ouna,ouna,ounasse,ounte,ounu,ountesse : Str) -> N ; -- worst case, 7 forms
|
||||
mkN : (pika : Str) -> (juna : N) -> N ; -- compound with invariable prefix
|
||||
mkN : (oma : N) -> (tunto : N) -> N ; -- compound with inflecting prefix
|
||||
mkN : NW -> N ; -- noun from DictEst (WordNet)
|
||||
} ;
|
||||
|
||||
-- Nouns used as functions need a case, of which the default is
|
||||
-- the genitive.
|
||||
|
||||
mkN2 : overload {
|
||||
mkN2 : N -> N2 ; -- relational noun with genitive
|
||||
mkN2 : N -> Prep -> N2 -- relational noun another prep.
|
||||
} ;
|
||||
|
||||
mkN3 : N -> Prep -> Prep -> N3 ; -- relation with two complements
|
||||
|
||||
-- Proper names can be formed by using declensions for nouns.
|
||||
-- The plural forms are filtered away by the compiler.
|
||||
|
||||
mkPN : overload {
|
||||
mkPN : Str -> PN ; -- predictable noun made into name
|
||||
mkPN : N -> PN -- any noun made into name
|
||||
} ;
|
||||
|
||||
--2 Adjectives
|
||||
|
||||
-- Non-comparison one-place adjectives are just like nouns.
|
||||
-- The regular adjectives are based on $regN$ in the positive.
|
||||
-- Comparison adjectives have three forms.
|
||||
-- The comparative and the superlative
|
||||
-- are always inflected in the same way, so the nominative of them is actually
|
||||
-- enough (TODO: confirm).
|
||||
-- TODO: update these types to include the new boolean non-inflection marker
|
||||
|
||||
mkA : overload {
|
||||
mkA : Str -> A ; -- regular noun made into adjective
|
||||
mkA : N -> A ; -- any noun made into adjective
|
||||
mkA : N -> (infl : Bool) -> A ; -- noun made into adjective, agreement type specified
|
||||
mkA : N -> (parem, parim : Str) -> A ; -- deviating comparison forms
|
||||
mkA : AW -> A ; -- adjective from DictEst (WordNet)
|
||||
} ;
|
||||
|
||||
-- Two-place adjectives need a case for the second argument.
|
||||
|
||||
mkA2 : A -> Prep -> A2 -- e.g. "jaollinen" casePrep adessive
|
||||
= \a,p -> a ** {c2 = p ; lock_A2 = <>};
|
||||
|
||||
genAttrA : Str -> A ; -- genitive attributes ; no agreement to head, no comparison forms.
|
||||
|
||||
--2 Verbs
|
||||
--
|
||||
-- The grammar does not cover the quotative mood and some nominal
|
||||
-- forms. One way to see the coverage is to linearize a verb to
|
||||
-- a table.
|
||||
-- The worst case needs eight forms, as shown in the following.
|
||||
|
||||
mkV : overload {
|
||||
mkV : (lugema : Str) -> V ; -- predictable verbs, covers n %
|
||||
mkV : (lugema,lugeda : Str) -> V ; -- deviating past 3sg
|
||||
mkV : (lugema,loeb,lugeda : Str) -> V ; -- also deviating pres. 1sg
|
||||
mkV : (lugema,lugeda,loeb,loetakse : Str) -> V ;
|
||||
mkV : (tegema,teha,teeb,tehakse,tehke,tegi,teinud,tehtud : Str) -> V ; -- worst-case verb
|
||||
mkV : (saama : V) -> (aru : Str) -> V ; -- püsiühendid TODO
|
||||
mkV : VW -> V ; -- verb from DictEst (WordNet)
|
||||
} ;
|
||||
|
||||
-- All the patterns above have $nominative$ as subject case.
|
||||
-- If another case is wanted, use the following.
|
||||
|
||||
caseV : Case -> V -> V ; -- deviating subj. case, e.g. genitive "täytyä"
|
||||
|
||||
-- The verbs "be" and "go" are special.
|
||||
|
||||
vOlema : V ; -- the verb "be"
|
||||
vMinema : V ; -- the verb "go"
|
||||
|
||||
|
||||
--3 Two-place verbs
|
||||
--
|
||||
-- Two-place verbs need an object case, and can have a pre- or postposition.
|
||||
-- The default is direct (accusative) object. There is also a special case
|
||||
-- with case only. The string-only argument case yields a regular verb with
|
||||
-- accusative object.
|
||||
|
||||
mkV2 : overload {
|
||||
mkV2 : Str -> V2 ; -- predictable direct transitive
|
||||
mkV2 : V -> V2 ; -- direct transitive
|
||||
mkV2 : V -> Case -> V2 ; -- complement just case
|
||||
mkV2 : V -> Prep -> V2 ; -- complement pre/postposition
|
||||
} ;
|
||||
|
||||
|
||||
--3 Three-place verbs
|
||||
--
|
||||
-- Three-place (ditransitive) verbs need two prepositions, of which
|
||||
-- the first one or both can be absent.
|
||||
|
||||
mkV3 : V -> Prep -> Prep -> V3 ; -- e.g. puhua, allative, elative
|
||||
dirV3 : V -> Case -> V3 ; -- siirtää, (accusative), illative
|
||||
dirdirV3 : V -> V3 ; -- antaa, (accusative), (allative)
|
||||
|
||||
|
||||
--3 Other complement patterns
|
||||
--
|
||||
-- Verbs and adjectives can take complements such as sentences,
|
||||
-- questions, verb phrases, and adjectives.
|
||||
|
||||
mkV0 : V -> V0 ; --%
|
||||
mkVS : V -> VS ;
|
||||
mkV2S : V -> Prep -> V2S ; -- e.g. "sanoa" allative
|
||||
mkVV : V -> VV ; -- e.g. "alkaa"
|
||||
mkVVf : V -> InfForm -> VV ; -- e.g. "hakkama" infMa
|
||||
mkV2V : V -> Prep -> V2V ; -- e.g. "käskeä" genitive
|
||||
mkV2Vf : V -> Prep -> InfForm -> V2V ; -- e.g. "kieltää" partitive infMast
|
||||
mkVA : V -> Prep -> VA ; -- e.g. "maistua" ablative
|
||||
mkV2A : V -> Prep -> Prep -> V2A ; -- e.g. "maalata" accusative translative
|
||||
mkVQ : V -> VQ ;
|
||||
mkV2Q : V -> Prep -> V2Q ; -- e.g. "kysyä" ablative
|
||||
|
||||
mkAS : A -> AS ; --%
|
||||
mkA2S : A -> Prep -> A2S ; --%
|
||||
mkAV : A -> AV ; --%
|
||||
mkA2V : A -> Prep -> A2V ; --%
|
||||
|
||||
-- Notice: categories $AS, A2S, AV, A2V$ are just $A$,
|
||||
-- and the second argument is given
|
||||
-- as an adverb. Likewise
|
||||
-- $V0$ is just $V$.
|
||||
|
||||
V0 : Type ; --%
|
||||
AS, A2S, AV, A2V : Type ; --%
|
||||
|
||||
--.
|
||||
-- The definitions should not bother the user of the API. So they are
|
||||
-- hidden from the document.
|
||||
|
||||
Case = MorphoEst.Case ;
|
||||
Number = MorphoEst.Number ;
|
||||
|
||||
singular = Sg ;
|
||||
plural = Pl ;
|
||||
|
||||
nominative = Nom ;
|
||||
genitive = Gen ;
|
||||
partitive = Part ;
|
||||
illative = Illat ;
|
||||
inessive = Iness ;
|
||||
elative = Elat ;
|
||||
allative = Allat ;
|
||||
adessive = Adess ;
|
||||
ablative = Ablat ;
|
||||
translative = Transl ;
|
||||
terminative = Termin ;
|
||||
essive = Ess ;
|
||||
abessive = Abess ;
|
||||
comitative = Comit ;
|
||||
|
||||
infDa = InfDa ; infMa = InfMa ; infMast = InfMast ;
|
||||
infDes = InfDes ; infMas = InfMas ; infMaks = InfMaks ; infMata = InfMata ;
|
||||
|
||||
prePrep : Case -> Str -> Prep =
|
||||
\c,p -> {c = NPCase c ; s = p ; isPre = True ; lock_Prep = <>} ;
|
||||
postPrep : Case -> Str -> Prep =
|
||||
\c,p -> {c = NPCase c ; s = p ; isPre = False ; lock_Prep = <>} ;
|
||||
postGenPrep p = {
|
||||
c = NPCase genitive ; s = p ; isPre = False ; lock_Prep = <>} ;
|
||||
casePrep : Case -> Prep =
|
||||
\c -> {c = NPCase c ; s = [] ; isPre = True ; lock_Prep = <>} ;
|
||||
accPrep = {c = NPAcc ; s = [] ; isPre = True ; lock_Prep = <>} ;
|
||||
|
||||
NW = {s : NForms ; lock_NW : {}} ;
|
||||
AW = {s : NForms ; lock_AW : {}} ;
|
||||
VW = {s : VForms ; lock_VW : {}} ;
|
||||
AdvW = {s : Str ; lock_AdvW : {}} ;
|
||||
|
||||
|
||||
mkN = overload {
|
||||
mkN : (nisu : Str) -> N = mk1N ;
|
||||
mkN : (link,lingi : Str) -> N = mk2N ;
|
||||
mkN : (tukk,tuku,tukku : Str) -> N = mk3N ;
|
||||
mkN : (paat,paadi,paati,paatide : Str) -> N = mk4N ;
|
||||
mkN : (oun,ouna,ouna,ounasse,ounte,ounu : Str) -> N = mk6N ;
|
||||
|
||||
mkN : (sora : Str) -> (tie : N) -> N = mkStrN ;
|
||||
mkN : (oma,tunto : N) -> N = mkNN ;
|
||||
mkN : (sana : NW) -> N = \w -> nForms2N w.s ;
|
||||
} ;
|
||||
|
||||
-- Adjective forms (incl. comp and sup) are derived from noun forms
|
||||
mk1A : Str -> A = \suur ->
|
||||
let aforms = aForms2A (nforms2aforms (hjk_type suur))
|
||||
in aforms ** {infl = Regular } ;
|
||||
|
||||
mkNA : N -> A = \suur ->
|
||||
let aforms = aForms2A (nforms2aforms (n2nforms suur)) ;
|
||||
in aforms ** {infl = Regular } ;
|
||||
|
||||
|
||||
mk1N : (link : Str) -> N = \s -> nForms2N (hjk_type s) ** {lock_N = <> } ;
|
||||
|
||||
mk2N : (link,lingi : Str) -> N = \link,lingi ->
|
||||
let nfs : NForms = (nForms2 link lingi) ;
|
||||
nfs_fixed : NForms = table {
|
||||
0 => link ;
|
||||
1 => lingi ;
|
||||
2 => nfs ! 2 ;
|
||||
3 => nfs ! 3 ;
|
||||
4 => nfs ! 4 ;
|
||||
5 => nfs ! 5
|
||||
} ;
|
||||
in nForms2N nfs_fixed ** {lock_N = <> } ;
|
||||
|
||||
|
||||
mk3N : (tukk,tuku,tukku : Str) -> N = \tukk,tuku,tukku ->
|
||||
let nfs : NForms = (nForms3 tukk tuku tukku) ;
|
||||
nfs_fixed : NForms = table {
|
||||
0 => tukk ;
|
||||
1 => tuku ;
|
||||
2 => tukku ;
|
||||
3 => nfs ! 3 ;
|
||||
4 => nfs ! 4 ;
|
||||
5 => nfs ! 5
|
||||
} ;
|
||||
in nForms2N nfs_fixed ** {lock_N = <> } ;
|
||||
|
||||
{- mk1N : (link : Str) -> N = \s -> nForms2N (hjk_type s) ** {lock_N = <> } ;
|
||||
mk2N : (link,lingi : Str) -> N = \s,t -> nForms2N (nForms2 s t) ** {lock_N = <>} ;
|
||||
mk3N : (tukk,tuku,tukku : Str) -> N = \s,t,u -> nForms2N (nForms3 s t u) ** {lock_N = <>} ;
|
||||
--regular mk4N
|
||||
mk4N : (paat,paadi,paati,paate : Str) -> N = \s,t,u,v -> nForms2N (nForms4 s t u v) ** {lock_N = <>} ;
|
||||
-}
|
||||
|
||||
--experimental: make sure that the user specified forms end up in the paradigm, even though the rest is wrong
|
||||
--this is using pl part
|
||||
mk4N : (paat,paadi,paati,paatide : Str) -> N = \paat,paadi,paati,paate ->
|
||||
let nfs : NForms = (nForms4 paat paadi paati paate) ;
|
||||
nfs_fixed : NForms = table {
|
||||
0 => paat ;
|
||||
1 => paadi ;
|
||||
2 => paati ;
|
||||
3 => nfs ! 3 ;
|
||||
4 => nfs ! 4 ;
|
||||
5 => paate
|
||||
} ;
|
||||
in nForms2N nfs_fixed ** {lock_N = <> } ;
|
||||
|
||||
|
||||
mk6N : (oun,ouna,ouna,ounasse,ounte,ounu : Str) -> N =
|
||||
\a,b,c,d,e,f -> nForms2N (nForms6 a b c d e f) ** {lock_N = <> } ;
|
||||
|
||||
mkStrN : Str -> N -> N = \sora,tie -> {
|
||||
s = \\c => sora + tie.s ! c ; lock_N = <>
|
||||
} ;
|
||||
mkNN : N -> N -> N = \oma,tunto -> {
|
||||
s = \\c => oma.s ! c + tunto.s ! c ; lock_N = <>
|
||||
} ; ---- TODO: oma in possessive suffix forms
|
||||
|
||||
nForms2 : (_,_ : Str) -> NForms = \link,lingi ->
|
||||
let
|
||||
i = last lingi ;
|
||||
reegl = init lingi ;
|
||||
in
|
||||
case <link,lingi> of {
|
||||
<_ + "el", _ + #c + "li"> => hjk_type_IVb_audit1 link reegl ;
|
||||
<_ + "er", _ + #c + "ri"> => hjk_type_IVb_audit1 link reegl ;
|
||||
<_ + #c + "el", _ + #c + "eli"> => hjk_type_IVb_audit link i ;
|
||||
<_ + #c + "er", _ + #c + "eri"> => hjk_type_IVb_audit link i ;
|
||||
|
||||
<_ + "be", _ + "pe"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + "de", _ + "te"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + "ge", _ + "ke"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + "pe", _ + "ppe"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + "te", _ + "tte"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + "ke", _ + "kke"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + "nne", _ + "nde"> => hjk_type_VII_touge2 link lingi ;
|
||||
|
||||
--below 3 don't add much, could just delete
|
||||
--t6uge recognition is easy, because that doesn't introduce lot of other errors
|
||||
--but probably pointless to fill this with all cases
|
||||
<_ + "e", _ + #c + "me"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + "se", _ + "ske"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + "re", _ + "rde"> => hjk_type_VII_touge2 link lingi ;
|
||||
<_ + #v + "e", _+"de"> => hjk_type_VII_touge2 link lingi ; --riie:riide
|
||||
|
||||
--improved total count a little, but introduced new errors
|
||||
--not recommended, not stable and productive word class
|
||||
--<_ + "i", _ + "e"> => dMeri link lingi ;
|
||||
|
||||
--introduced a couple of errors, "aine" recognized as "kõne"
|
||||
--<_ + "ne", _ + "ne"> => hjk_type_III_ratsu link ;
|
||||
|
||||
--heuristics to catch palk:palga but not maakas:maaka (for longer words, same with more ?s)
|
||||
--didn't work, don't try this
|
||||
--<? + ? + #c, ? + ? + #c + #v> => hjk_type_IVb_audit link i ;
|
||||
_ => hjk_type link
|
||||
} ;
|
||||
|
||||
nForms3 : (_,_,_ : Str) -> NForms = \tukk,tuku,tukku ->
|
||||
let u = last tuku ;
|
||||
in case <tukk,tuku,tukku> of {
|
||||
--cases handled reliabl(ish) by 1- and 2-arg opers
|
||||
<_+"nd",_,_> => hjk_type tukk ;
|
||||
<_+"el",_,_> => nForms2 tukk tuku ;
|
||||
<_+"er",_,_> => nForms2 tukk tuku ;
|
||||
|
||||
--distinguish between hammas and maakas
|
||||
<_+"as",_+"a",_+"ast"> => dHammas tukk tuku ;
|
||||
<_+"es",_+"e",_+"est"> => dHammas tukk tuku ;
|
||||
<_+"us",_+"u",_+"ust"> => dHammas tukk tuku ;
|
||||
<_+"as",_,_+"at"> => hjk_type_IVb_maakas tukk ;
|
||||
|
||||
<_ + "ik", _ + "iku", _ + "ikku"> => hjk_type_VI_imelik tukk ; --imelik:_:imelikku caught here
|
||||
|
||||
<_ + #c, _ + #v, _ + #v> => hjk_type_VI_tukk tukk tuku ;
|
||||
<_ + "ud", _ + "u", _ + "ut"> => nForms2 tukk tuku ; -- -nud/-tud participles are not like 'voolik'
|
||||
<_ + #c, _ + #v, _ + #v + "t"> => hjk_type_IVb_audit tukk u ; --voolik:_:voolikut caught here
|
||||
_ => nForms2 tukk tuku
|
||||
} ;
|
||||
|
||||
nForms4 : (_,_,_,_ : Str) -> NForms = \paat,paadi,paati,paate ->
|
||||
case <paat,paadi,paati,paate> of {
|
||||
-- distinguish between joonis and segadus
|
||||
<_ +("ne"|"s"), _+"se", _+"st", _+"seid"> => hjk_type_Va_otsene paat ;
|
||||
<_ +("ne"|"s"), _+"se", _+"st", _+"si"> => hjk_type_Vb_oluline paat ;
|
||||
|
||||
<_ +"ne", _+"se", _+"set", _+"seid"> => nForms3 paat paadi paati ; -- -ne adjectives ('algne') are not like 'tõuge'
|
||||
|
||||
--distinguish between kõne and aine
|
||||
<_ +"e", _+"e", _+"et", _+"sid"> => hjk_type_III_ratsu paat ;
|
||||
<_ +"e", _+"e", _+"et", _+"eid"> => hjk_type_VII_touge2 paat paadi ;
|
||||
|
||||
_ => nForms3 paat paadi paati
|
||||
} ;
|
||||
{-
|
||||
--Version that uses pl gen instead of pl part
|
||||
nForms4 : (_,_,_,_ : Str) -> NForms = \paat,paadi,paati,paatide ->
|
||||
case <paat,paadi,paati,paatide> of {
|
||||
-- pl gen can't distinguish between joonis and segadus
|
||||
-- <_ +("ne"|"s"), _+"se", _+"st", _+"seid"> => hjk_type_Va_otsene paat ;
|
||||
-- <_ +("ne"|"s"), _+"se", _+"st", _+"si"> => hjk_type_Vb_oluline paat ;
|
||||
|
||||
--pl gen can distinguish between kõne and aine
|
||||
--plus side that any noun that is formed with 4-arg,
|
||||
--the user given forms are inserted to the paradigm,
|
||||
--and more forms are created from pl gen, none from pl part
|
||||
<_ +"e", _+"e", _+"et", _+"de"> => hjk_type_III_ratsu paat ;
|
||||
<_ +"e", _+"e", _+"et", _+"te"> => hjk_type_VII_touge2 paat paadi ;
|
||||
|
||||
_ => nForms3 paat paadi paati
|
||||
} ;
|
||||
-}
|
||||
|
||||
mkN2 = overload {
|
||||
mkN2 : N -> N2 = \n -> mmkN2 n (casePrep genitive) ;
|
||||
mkN2 : N -> Prep -> N2 = mmkN2
|
||||
} ;
|
||||
|
||||
mmkN2 : N -> Prep -> N2 = \n,c -> n ** {c2 = c ; isPre = mkIsPre c ; lock_N2 = <>} ;
|
||||
mkN3 = \n,c,e -> n ** {c2 = c ; c3 = e ;
|
||||
isPre = mkIsPre c ; -- matka Lontoosta Pariisiin
|
||||
isPre2 = mkIsPre e ; -- Suomen voitto Ruotsista
|
||||
lock_N3 = <>
|
||||
} ;
|
||||
|
||||
mkIsPre : Prep -> Bool = \p -> case p.c of {
|
||||
NPCase Gen => notB p.isPre ; -- Jussin veli (prep is <Gen,"",True>, isPre becomes False)
|
||||
_ => True -- syyte Jussia vastaan, puhe Jussin puolesta
|
||||
} ;
|
||||
|
||||
mkPN = overload {
|
||||
mkPN : Str -> PN = mkPN_1 ;
|
||||
mkPN : N -> PN = \s -> {s = \\c => s.s ! NCase Sg c ; lock_PN = <>} ;
|
||||
} ;
|
||||
|
||||
mkPN_1 : Str -> PN = \s -> {s = \\c => (mk1N s).s ! NCase Sg c ; lock_PN = <>} ;
|
||||
|
||||
-- adjectives
|
||||
|
||||
mkA = overload {
|
||||
mkA : Str -> A = mkA_1 ;
|
||||
mkA : N -> A = \n -> noun2adjDeg n ** {infl = Regular ; lock_A = <>} ;
|
||||
mkA : N -> (parem,parim : Str) -> A = regAdjective ;
|
||||
mkA : N -> (infl : Infl) -> A = \n,infl -> noun2adjDeg n ** {infl = infl ; lock_A = <>} ;
|
||||
-- TODO: temporary usage of regAdjective1
|
||||
mkA : N -> (valmim,valmeim : Str) -> (infl : Infl) -> A =
|
||||
\n,c,s,infl -> (regAdjective1 n c s) ** {infl = infl ; lock_A = <>} ;
|
||||
mkA : (sana : AW) -> A = \w -> noun2adjDeg (nForms2N w.s) ** {infl = Regular} ;
|
||||
} ;
|
||||
|
||||
genAttrA balti = {s = \\_,_ => balti ; infl = Invariable ; lock_A = <>} ;
|
||||
|
||||
mkA_1 : Str -> A = \x -> noun2adjDeg (mk1N x) ** {infl = Regular ; lock_A = <>} ;
|
||||
|
||||
-- auxiliaries
|
||||
mkAdjective : (_,_,_ : Adj) -> A = \hea,parem,parim ->
|
||||
{s = table {
|
||||
Posit => hea.s ;
|
||||
Compar => parem.s ;
|
||||
Superl => parim.s
|
||||
} ;
|
||||
infl = Regular ;
|
||||
lock_A = <>
|
||||
} ;
|
||||
|
||||
-- Adjectives whose comparison forms are explicitly given.
|
||||
-- The inflection of these forms with the audit-rule always works.
|
||||
regAdjective : Noun -> Str -> Str -> A = \posit,compar,superl ->
|
||||
mkAdjective
|
||||
(noun2adj posit)
|
||||
(noun2adjComp False (nForms2N (hjk_type_IVb_audit compar "a")))
|
||||
(noun2adjComp False (nForms2N (hjk_type_IVb_audit superl "a"))) ;
|
||||
|
||||
-- TODO: this is a temporary hack that converts A ~> Adjective.
|
||||
-- The caller needs this otherwise ** fails.
|
||||
-- This should be cleaned up but I don't know how (K).
|
||||
regAdjective1 : Noun -> Str -> Str -> Adjective = regAdjective ;
|
||||
|
||||
-- Adjectives whose comparison forms can be derived from the sg gen.
|
||||
-- In case of comparative this fails only for 70 adjectives.
|
||||
-- Superlative is more complex, and does not always exist,
|
||||
-- e.g. lai -> laiem -> laiim? / laieim?
|
||||
-- See also: http://www.eki.ee/books/ekk09/index.php?p=3&p1=4&id=208
|
||||
-- Rather use "kõige" + Comp instead of the superlative.
|
||||
noun2adjDeg : Noun -> Adjective = \kaunis ->
|
||||
let
|
||||
kauni = (kaunis.s ! NCase Sg Gen) ;
|
||||
-- Convert the final 'i' to 'e' for the superlative
|
||||
kaune : Str = case kauni of { kaun@(_) + "i" => kaun + "e" ; _ => kauni }
|
||||
in
|
||||
regAdjective kaunis (kauni + "m") (kaune + "im") ;
|
||||
|
||||
|
||||
-- verbs
|
||||
|
||||
mkV = overload {
|
||||
mkV : (lugema : Str) -> V = mk1V ;
|
||||
mkV : (lugema,lugeda : Str) -> V = mk2V ;
|
||||
mkV : (lugema,lugeda,loeb : Str) -> V = mk3V ;
|
||||
mkV : (lugema,lugeda,loeb,loetakse : Str) -> V = mk4V ;
|
||||
mkV : (tegema,teha,teeb,tehakse,tehke,tegi,teinud,tehtud : Str) -> V = mk8V ;
|
||||
mkV : (aru : Str) -> (saama : V) -> V = mkPV ; -- particle verbs
|
||||
mkV : (sana : VW) -> V = \w -> vforms2V w.s ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
} ;
|
||||
|
||||
mk1V : Str -> V = \s ->
|
||||
let vfs = vforms2V (vForms1 s) in
|
||||
vfs ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
mk2V : (_,_ : Str) -> V = \x,y ->
|
||||
let
|
||||
vfs = vforms2V (vForms2 x y)
|
||||
in vfs ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
mk3V : (_,_,_ : Str) -> V = \x,y,z ->
|
||||
let
|
||||
vfs = vforms2V (vForms3 x y z)
|
||||
in vfs ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
mk4V : (x1,_,_,x4 : Str) -> V = \a,b,c,d ->
|
||||
let
|
||||
vfs = vforms2V (vForms4 a b c d)
|
||||
in vfs ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
mk8V : (x1,_,_,_,_,_,_,x8 : Str) -> V = \a,b,c,d,e,f,g,h ->
|
||||
let
|
||||
vfs = vforms2V (vForms8 a b c d e f g h)
|
||||
in vfs ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
mkPV : (aru : Str) -> (saama : V) -> V = \aru,saama ->
|
||||
{s = saama.s ; p = aru ; sc = saama.sc ; lock_V = <> } ;
|
||||
|
||||
|
||||
-- This used to be the last case: _ => Predef.error (["expected infinitive, found"] ++ ottaa)
|
||||
-- regexp example: ("" | ?) + ("a" | "e" | "i") + _ + "aa" =>
|
||||
vForms1 : Str -> VForms = \lugema ->
|
||||
let
|
||||
luge = Predef.tk 2 lugema ;
|
||||
loe = weaker luge ;
|
||||
in
|
||||
case lugema of {
|
||||
-- TS 49
|
||||
-- Small class of CVVma
|
||||
? + ("ä"|"õ"|"i") + "ima" =>
|
||||
cKaima lugema ; --käima,viima,võima
|
||||
? + ("aa"|"ee"|"ää") + "ma" =>
|
||||
cSaama lugema ; -- saama,jääma,keema
|
||||
? + ("oo"|"öö"|"üü") + "ma" =>
|
||||
cJooma lugema ; --jooma,looma,lööma,müüma,pooma,sööma,tooma
|
||||
|
||||
-- TS 53
|
||||
_ + #c + #v + "elema" =>
|
||||
cTegelema lugema ; --not aelema
|
||||
|
||||
-- TS 54
|
||||
-- Small class, just list all members
|
||||
("tule"|"sure"|"pane") + "ma" =>
|
||||
cTulema lugema ;
|
||||
|
||||
-- TS 55-57
|
||||
-- Consonant gradation
|
||||
-- Regular (55-56)'leppima' and irregular (57) 'lugema'
|
||||
-- For reliable results regarding consonant gradation, use mk3V
|
||||
_ + "ndima" =>
|
||||
cLeppima lugema ;
|
||||
_ + #lmnr + ("k"|"p"|"t"|"b") + ("ima"|"uma") =>
|
||||
cLeppima lugema ;
|
||||
_ + ("sk"|"ps"|"ks"|"ts"|"pl") + ("ima") => --|"uma") =>
|
||||
cLeppima lugema ;
|
||||
_ + ("hk"|"hm"|"hn"|"hr"|"ht") + ("ima") => --most *hCuma are TS 51 (muutuma)
|
||||
cLeppima lugema ;
|
||||
_ + #c + "ssima" => --weaker *ss = *ss; should be weaker Css = Cs
|
||||
cLugema lugema ;
|
||||
_ + ("pp"|"kk"|"tt"|"ss"|"ff"|"nn"|"mm"|"ll"|"rr") + ("ima"|"uma") =>
|
||||
cLeppima lugema ;
|
||||
|
||||
-- TS 59 (petma, tapma)
|
||||
-- Use mk4V for TS 60 (jätma, võtma)
|
||||
? + #v + ("tma"|"pma") =>
|
||||
cPetma lugema (luge + "etakse") ;
|
||||
-- TS 58 for rest that end tma (muutma,kartma,...)
|
||||
_ + "tma" =>
|
||||
cMuutma lugema ;
|
||||
|
||||
-- TS 61 (laulma,kuulma,naerma,möönma)
|
||||
-- Default vowel e for lma, a for (r|n)ma.
|
||||
-- Other vowel with mk3V.
|
||||
_ + "lma" =>
|
||||
cKuulma lugema (loe + "eb") ;
|
||||
_ + ("r"|"n") + "ma" =>
|
||||
cKuulma lugema (loe + "ab") ;
|
||||
|
||||
-- TS 63 (andma,hoidma)
|
||||
-- Other vowel than a (tundma~tunneb) with mk3V
|
||||
_ + "dma" =>
|
||||
cAndma lugema (loe + "ab") ;
|
||||
|
||||
-- TS 62, 64 (tõusma,mõskma), default vowel e
|
||||
-- 62 alt form (jooksma,joosta) with mk2V
|
||||
-- Other vowel than e with mk3V
|
||||
_ + #c + "ma" =>
|
||||
cLaskma lugema (loe + "eb") ;
|
||||
|
||||
-- TS 65 (pesema)
|
||||
#c + #v + "sema" =>
|
||||
cPesema lugema ;
|
||||
|
||||
-- TS 66 (nägema)
|
||||
-- Small class, just list all members
|
||||
("nägema"|"tegema") =>
|
||||
cNagema lugema ;
|
||||
|
||||
-- TS 67-68 with mk2V
|
||||
-- no 100% way to distinguish from 50-52 that end in ama
|
||||
|
||||
-- TS 69
|
||||
(?|"") + (?|"") + ? + "tlema" => --vestlema,mõtlema,ütlema; not õnnitlema
|
||||
cOmblema lugema ;
|
||||
_ + "tlema" =>
|
||||
cElama lugema ;
|
||||
_ + #c + "lema" =>
|
||||
cOmblema lugema ;
|
||||
|
||||
-- TS 50-52
|
||||
-- Default case
|
||||
_ =>
|
||||
cElama lugema
|
||||
} ;
|
||||
|
||||
vForms2 : (_,_ : Str) -> VForms = \petma,petta ->
|
||||
-- Arguments: ma infinitive, da infinitive
|
||||
-- Use this for the following cases:
|
||||
-- * 62 alt form (Csma, sta)
|
||||
-- * 50-52 (elama) recognized as 69 (õmblema)
|
||||
-- * 66 (nägema~näha)
|
||||
-- * 54 (tulema~tulla)
|
||||
-- * 67-68 (hüppama~hüpata)
|
||||
case <petma,petta> of {
|
||||
<_ + "ksma", _ + "sta"> => cJooksma petma ; --62 alt forms
|
||||
<_, _ + "ata"> => cHyppama petma ; --67-68
|
||||
<_, _ + "ha"> => cNagema petma ; --66
|
||||
<_, _ + ("rra"|"lla"|"nna")> => cTulema petma ; --54
|
||||
<_ + #c + "lema",
|
||||
_ + #c + "leda"> => cElama petma ; --50-52 (õnnitlema) recognized as 69 (mõtlema)
|
||||
_ => vForms1 petma
|
||||
} ;
|
||||
|
||||
vForms3 : (_,_,_ : Str) -> VForms = \taguma,taguda,taob ->
|
||||
-- Arguments: ma infinitive, da infinitive, b
|
||||
-- Use this for the following cases:
|
||||
-- * Irregular gradation (taguma~taob)
|
||||
-- * Non-detectable gradation (sattuma~satub ; pettuma~pettub)
|
||||
-- * Non-default vowel in b for TS 58-64 (laulma~laulab)
|
||||
case <taguma,taguda,taob> of {
|
||||
|
||||
--to be sure about vowel in b
|
||||
<_ + "dma", _ + "da", _> => cAndma taguma taob ;
|
||||
<_, _ + #vv + #lmnr + "da", _> => cKuulma taguma taob ;
|
||||
<_, _ + #c + "ta", _> => cLaskma taguma taob ;
|
||||
|
||||
--irregular gradation
|
||||
<_, _, (""|#c) + #c + #v + #v + "b"> => cLugema taguma ; --57
|
||||
|
||||
--to be sure about consonant gradation
|
||||
<_ + #c + "lema", _, _> => vForms2 taguma taguda ; --catch "-Clema" first
|
||||
<_ + #v + "ma", _+"da", _> => cSattumaPettuma taguma taob ;
|
||||
|
||||
<_,_,_> => vForms2 taguma taguda
|
||||
} ;
|
||||
|
||||
vForms4 : (x1,_,_,x4 : Str) -> VForms = \jatma,jatta,jatab,jaetakse ->
|
||||
-- 4 forms needed to get full paradigm for regular verbs
|
||||
-- (source: http://www.eki.ee/books/ekk09/index.php?p=3&p1=5&id=227)
|
||||
-- regVForms in MorphoEst handles majority of these.
|
||||
-- Filter out known irregularities and give rest to regVForms.
|
||||
-- Not trying to match TS 49 ; can't separate käima (49) from täima (50), or detect compounds like taaslooma.
|
||||
case <jatma,jatta,jatab,jaetakse> of {
|
||||
<_, _+("kka"|"ppa"|"tta"),
|
||||
_, _+"takse"> => cPetma jatma jaetakse ;
|
||||
<_ + "dma", _,
|
||||
_, _+"takse"> => cAndma jatma jatab ;
|
||||
<_ + ("ts"|"ks"|"sk") + "ma", _,_,_> => cLaskma jatma jatab ;
|
||||
<_, _ + ("lla"|"nna"|"rra"), _, _> => cTulema jatma ;
|
||||
<_, _ + "ha", _, _> => cNagema jatma ;
|
||||
<_ + #v + "sema", _ + "sta", _, _> => cPesema jatma ;
|
||||
<_,_,_,_> => regVForms jatma jatta jatab jaetakse
|
||||
} ;
|
||||
|
||||
caseV c v = {s = v.s ; p = v.p; sc = NPCase c ; lock_V = <>} ;
|
||||
|
||||
vOlema = verbOlema ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
vMinema = verbMinema ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
|
||||
mk2V2 : V -> Prep -> V2 = \v,c -> v ** {c2 = c ; lock_V2 = <>} ;
|
||||
caseV2 : V -> Case -> V2 = \v,c -> mk2V2 v (casePrep c) ;
|
||||
dirV2 v = mk2V2 v accPrep ;
|
||||
|
||||
mkAdv = overload {
|
||||
mkAdv : Str -> Adv = \s -> {s = s ; lock_Adv = <>} ;
|
||||
mkAdv : AdvW -> Adv = \s -> {s = s.s ; lock_Adv = <>} ;
|
||||
} ;
|
||||
|
||||
mkV2 = overload {
|
||||
mkV2 : Str -> V2 = \s -> dirV2 (mk1V s) ;
|
||||
mkV2 : V -> V2 = dirV2 ;
|
||||
mkV2 : V -> Case -> V2 = caseV2 ;
|
||||
mkV2 : V -> Prep -> V2 = mk2V2 ;
|
||||
} ;
|
||||
|
||||
mk2V2 : V -> Prep -> V2 ;
|
||||
caseV2 : V -> Case -> V2 ;
|
||||
dirV2 : V -> V2 ;
|
||||
|
||||
mkV3 v p q = v ** {c2 = p ; c3 = q ; lock_V3 = <>} ;
|
||||
dirV3 v p = mkV3 v accPrep (casePrep p) ;
|
||||
dirdirV3 v = dirV3 v allative ;
|
||||
|
||||
mkVS v = v ** {lock_VS = <>} ;
|
||||
mkVV v = mkVVf v infDa ;
|
||||
mkVVf v f = v ** {vi = f ; lock_VV = <>} ;
|
||||
mkVQ v = v ** {lock_VQ = <>} ;
|
||||
|
||||
V0 : Type = V ;
|
||||
AS, A2S, AV : Type = A ;
|
||||
A2V : Type = A2 ;
|
||||
|
||||
mkV0 v = v ** {lock_V = <>} ;
|
||||
mkV2S v p = mk2V2 v p ** {lock_V2S = <>} ;
|
||||
mkV2V v p = mkV2Vf v p infMa ;
|
||||
mkV2Vf v p f = mk2V2 v p ** {vi = f ; lock_V2V = <>} ;
|
||||
|
||||
mkVA v p = v ** {c2 = p ; lock_VA = <>} ;
|
||||
mkV2A v p q = v ** {c2 = p ; c3 = q ; lock_V2A = <>} ;
|
||||
mkV2Q v p = mk2V2 v p ** {lock_V2Q = <>} ;
|
||||
|
||||
mkAS v = v ** {lock_A = <>} ;
|
||||
mkA2S v p = mkA2 v p ** {lock_A = <>} ;
|
||||
mkAV v = v ** {lock_A = <>} ;
|
||||
mkA2V v p = mkA2 v p ** {lock_A2 = <>} ;
|
||||
|
||||
} ;
|
||||
27
lib/src/estonian/PhraseEst.gf
Normal file
27
lib/src/estonian/PhraseEst.gf
Normal file
@@ -0,0 +1,27 @@
|
||||
concrete PhraseEst of Phrase = CatEst ** open ResEst, (P = Prelude) in {
|
||||
|
||||
lin
|
||||
PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
|
||||
|
||||
UttS s = s ;
|
||||
UttQS qs = {s = qs.s} ;
|
||||
UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! Ag Sg P2} ;
|
||||
UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! Ag Pl P2} ;
|
||||
UttImpPol pol imp = {s = pol.s ++ imp.s ! pol.p ! AgPol} ;
|
||||
|
||||
UttIP ip = {s = ip.s ! NPCase Nom} ;
|
||||
UttIAdv iadv = iadv ;
|
||||
UttNP np = {s = np.s ! NPCase Nom} ;
|
||||
UttVP vp = {s = infVP (NPCase Nom) Pos (agrP3 Sg) vp InfDa} ;
|
||||
UttAdv adv = adv ;
|
||||
UttCN np = {s = np.s ! NCase Sg Nom} ;
|
||||
UttAP np = {s = np.s ! P.False ! NCase Sg Nom} ;
|
||||
UttCard n = {s = n.s ! Sg ! Nom} ;
|
||||
|
||||
NoPConj = {s = []} ;
|
||||
PConjConj conj = {s = conj.s2} ;
|
||||
|
||||
NoVoc = {s = []} ;
|
||||
VocNP np = {s = "," ++ np.s ! NPCase Nom} ;
|
||||
|
||||
}
|
||||
102
lib/src/estonian/QuestionEst.gf
Normal file
102
lib/src/estonian/QuestionEst.gf
Normal file
@@ -0,0 +1,102 @@
|
||||
concrete QuestionEst of Question = CatEst ** open ResEst, Prelude in {
|
||||
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lin
|
||||
|
||||
QuestCl cl = {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SQuest
|
||||
} ;
|
||||
|
||||
QuestVP ip vp =
|
||||
let
|
||||
cl = mkClause (subjForm (ip ** {isPron = False ; a = agrP3 ip.n}) vp.sc) (agrP3 ip.n) vp
|
||||
in {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
|
||||
QuestSlash ip slash = {
|
||||
s = \\t,a,p =>
|
||||
let
|
||||
cls = slash.s ! t ! a ! p ;
|
||||
who = appCompl True p slash.c2 (ip ** {a = agrP3 ip.n ; isPron = False})
|
||||
in
|
||||
who ++ cls
|
||||
} ;
|
||||
|
||||
QuestIAdv iadv cl = {
|
||||
s = \\t,a,p => iadv.s ++ cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
|
||||
QuestIComp icomp np = {
|
||||
s = \\t,a,p =>
|
||||
let
|
||||
vp = predV (verbOlema ** {sc = NPCase Nom}) ;
|
||||
cl = mkClause (subjForm np vp.sc) np.a vp ;
|
||||
in
|
||||
icomp.s ! np.a ++ cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
|
||||
PrepIP p ip = {s =
|
||||
appCompl True Pos p (ip ** {a = agrP3 ip.n ; isPron = False})} ;
|
||||
|
||||
AdvIP ip adv = {
|
||||
s = \\c => ip.s ! c ++ adv.s ;
|
||||
n = ip.n
|
||||
} ;
|
||||
|
||||
-- The computation of $ncase$ is a special case of that in $NounEst.DetCN$,
|
||||
-- since we don't have possessive suffixes or definiteness.
|
||||
--- It could still be nice to have a common oper...
|
||||
|
||||
IdetCN idet cn = let n = idet.n in {
|
||||
s = \\c =>
|
||||
let
|
||||
k : Case = npform2case n c ;
|
||||
icase : Case = Nom ; --case k of { --mis kassiga
|
||||
-- (Ess|Abess|Comit|Termin) => Gen ;
|
||||
-- _ => k
|
||||
-- } ;
|
||||
ncase : NForm = case <icase,idet.isNum> of {
|
||||
<Nom, True> => NCase Sg Part ; -- mitkä kolme kytkintä
|
||||
<_, True> => NCase Sg k ; -- miksi kolmeksi kytkimeksi
|
||||
_ => NCase n k -- mitkä kytkimet
|
||||
}
|
||||
in
|
||||
idet.s ! icase ++ cn.s ! ncase ;
|
||||
n = n
|
||||
} ;
|
||||
|
||||
IdetIP idet = let n = idet.n in {
|
||||
s = \\c =>
|
||||
let
|
||||
k = npform2case n c ;
|
||||
in
|
||||
idet.s ! k ;
|
||||
n = n
|
||||
} ;
|
||||
|
||||
IdetQuant idet num =
|
||||
let
|
||||
n = num.n ;
|
||||
isn = num.isNum
|
||||
in {
|
||||
s = \\k =>
|
||||
let
|
||||
ncase = case <k,isn> of {
|
||||
<Nom, True> => NCase Sg Part ; -- mitkä kolme kytkintä
|
||||
<_, True> => NCase Sg k ; -- miksi kolmeksi kytkimeksi
|
||||
_ => NCase n k -- mitkä kytkimet
|
||||
}
|
||||
in
|
||||
idet.s ! n ! k ++ num.s ! Sg ! k ;
|
||||
n = n ;
|
||||
isNum = isn
|
||||
} ;
|
||||
|
||||
AdvIAdv i a = {s = i.s ++ a.s} ;
|
||||
|
||||
CompIAdv a = {s = \\_ => a.s} ;
|
||||
CompIP ip = {s = \\_ => ip.s ! NPCase Nom} ;
|
||||
|
||||
}
|
||||
50
lib/src/estonian/RelativeEst.gf
Normal file
50
lib/src/estonian/RelativeEst.gf
Normal file
@@ -0,0 +1,50 @@
|
||||
concrete RelativeEst of Relative = CatEst ** open Prelude, ResEst, MorphoEst in {
|
||||
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lin
|
||||
|
||||
RelCl cl = {
|
||||
s = \\t,a,p,_ => "nii" ++ "et" ++ cl.s ! t ! a ! p ! SDecl ;
|
||||
---- sellainen
|
||||
c = NPCase Nom
|
||||
} ;
|
||||
|
||||
RelVP rp vp = {
|
||||
s = \\t,ant,b,ag =>
|
||||
let
|
||||
agr = case rp.a of {
|
||||
RNoAg => ag ;
|
||||
RAg a => a
|
||||
} ;
|
||||
cl = mkClause
|
||||
(subjForm {s = rp.s ! (complNumAgr agr) ;
|
||||
a = agr ; isPron = False} vp.sc) agr vp
|
||||
in
|
||||
cl.s ! t ! ant ! b ! SDecl ;
|
||||
c = NPCase Nom
|
||||
} ;
|
||||
|
||||
RelSlash rp slash = {
|
||||
s = \\t,a,p,ag =>
|
||||
let
|
||||
cls = slash.s ! t ! a ! p ;
|
||||
who = appCompl True p slash.c2 (rp2np (complNumAgr ag) rp)
|
||||
in
|
||||
who ++ cls ;
|
||||
c = slash.c2.c
|
||||
} ;
|
||||
|
||||
FunRP p np rp = {
|
||||
s = \\n,c => appCompl True Pos p (rp2np n rp) ++ np.s ! c ; --- is c OK?
|
||||
a = RAg np.a
|
||||
} ;
|
||||
|
||||
IdRP = {
|
||||
s = \\n,c => relPron ! n ! npform2case n c ;
|
||||
a = RNoAg
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
}
|
||||
713
lib/src/estonian/ResEst.gf
Normal file
713
lib/src/estonian/ResEst.gf
Normal file
@@ -0,0 +1,713 @@
|
||||
--1 Estonian auxiliary operations.
|
||||
|
||||
-- This module contains operations that are needed to make the
|
||||
-- resource syntax work. To define everything that is needed to
|
||||
-- implement $Test$, it moreover contains regular lexical
|
||||
-- patterns needed for $Lex$.
|
||||
|
||||
resource ResEst = ParamX ** open Prelude in {
|
||||
|
||||
flags optimize=all ; coding=utf8;
|
||||
|
||||
|
||||
--2 Parameters for $Noun$
|
||||
|
||||
-- This is the $Case$ as needed for both nouns and $NP$s.
|
||||
|
||||
param
|
||||
Case = Nom | Gen | Part
|
||||
| Illat | Iness | Elat | Allat | Adess | Ablat
|
||||
| Transl | Ess | Termin | Abess | Comit;
|
||||
|
||||
NForm = NCase Number Case ;
|
||||
|
||||
|
||||
-- Agreement of $NP$ has number*person and the polite second ("te olette valmis").
|
||||
|
||||
|
||||
Agr = Ag Number Person | AgPol ;
|
||||
|
||||
oper
|
||||
complNumAgr : Agr -> Number = \a -> case a of {
|
||||
Ag n _ => n ;
|
||||
AgPol => Sg
|
||||
} ;
|
||||
verbAgr : Agr -> {n : Number ; p : Person} = \a -> case a of {
|
||||
Ag n p => {n = n ; p = p} ;
|
||||
AgPol => {n = Pl ; p = P2}
|
||||
} ;
|
||||
|
||||
oper
|
||||
NP = {s : NPForm => Str ; a : Agr ; isPron : Bool} ;
|
||||
|
||||
--
|
||||
--2 Adjectives
|
||||
--
|
||||
-- The major division is between the comparison degrees. A degree fixed,
|
||||
-- an adjective is like common nouns, except for the adverbial form.
|
||||
|
||||
param
|
||||
AForm = AN NForm | AAdv ;
|
||||
|
||||
Infl = Regular | Participle | Invariable ;
|
||||
|
||||
oper
|
||||
Adjective : Type = {s : Degree => AForm => Str; lock_A : {}} ;
|
||||
|
||||
--2 Noun phrases
|
||||
--
|
||||
-- Two forms of *virtual accusative* are needed for nouns in singular,
|
||||
-- the nominative and the genitive one ("loen raamatu"/"loe raamat").
|
||||
-- For nouns in plural, only a nominative accusative exists in positive clauses.
|
||||
-- Pronouns use the partitive as their accusative form ("mind", "sind"), in both
|
||||
-- positive and negative, indicative and imperative clauses.
|
||||
|
||||
param
|
||||
NPForm = NPCase Case | NPAcc ;
|
||||
|
||||
oper
|
||||
npform2case : Number -> NPForm -> Case = \n,f ->
|
||||
|
||||
-- type signature: workaround for gfc bug 9/11/2007
|
||||
case <<f,n> : NPForm * Number> of {
|
||||
<NPCase c,_> => c ;
|
||||
<NPAcc,Sg> => Gen ;-- appCompl does the job
|
||||
<NPAcc,Pl> => Nom
|
||||
} ;
|
||||
|
||||
--2 For $Verb$
|
||||
|
||||
-- A special form is needed for the negated plural imperative.
|
||||
|
||||
param
|
||||
VForm =
|
||||
Inf InfForm
|
||||
| Presn Number Person
|
||||
| Impf Number Person
|
||||
| Condit Number Person
|
||||
| Imper Number
|
||||
| ImperP3
|
||||
| ImperP1Pl
|
||||
| ImpNegPl
|
||||
| PassPresn Bool
|
||||
| PassImpf Bool
|
||||
| Quotative Voice
|
||||
| PresPart Voice
|
||||
| PastPart Voice
|
||||
;
|
||||
|
||||
Voice = Act | Pass ;
|
||||
|
||||
InfForm =
|
||||
InfDa -- lugeda
|
||||
| InfDes -- lugedes
|
||||
| InfMa -- lugema
|
||||
| InfMas -- lugemas
|
||||
| InfMast -- lugemast
|
||||
| InfMata -- lugemata
|
||||
| InfMaks -- lugemaks
|
||||
;
|
||||
|
||||
SType = SDecl | SQuest | SInv ;
|
||||
|
||||
--2 For $Relative$
|
||||
|
||||
RAgr = RNoAg | RAg Agr ;
|
||||
|
||||
--2 For $Numeral$
|
||||
|
||||
CardOrd = NCard NForm | NOrd NForm ;
|
||||
|
||||
--2 Transformations between parameter types
|
||||
|
||||
oper
|
||||
agrP3 : Number -> Agr = \n ->
|
||||
Ag n P3 ;
|
||||
|
||||
conjAgr : Agr -> Agr -> Agr = \a,b -> case <a,b> of {
|
||||
<Ag n p, Ag m q> => Ag (conjNumber n m) (conjPerson p q) ;
|
||||
<Ag n p, AgPol> => Ag Pl (conjPerson p P2) ;
|
||||
<AgPol, Ag n p> => Ag Pl (conjPerson p P2) ;
|
||||
_ => b
|
||||
} ;
|
||||
|
||||
---
|
||||
|
||||
Compl : Type = {s : Str ; c : NPForm ; isPre : Bool} ;
|
||||
|
||||
appCompl : Bool -> Polarity -> Compl -> NP -> Str = \isFin,b,co,np ->
|
||||
let
|
||||
c = case co.c of {
|
||||
NPAcc => case b of {
|
||||
Neg => NPCase Part ; -- ma ei näe raamatut/sind
|
||||
Pos => case isFin of {
|
||||
True => NPAcc ; -- ma näen raamatu/sind
|
||||
_ => case np.isPron of {
|
||||
False => NPCase Nom ; --tuleb see raamat lugeda
|
||||
_ => NPAcc --tuleb sind näha --TODO I: is this correct?
|
||||
}
|
||||
}
|
||||
} ;
|
||||
_ => co.c
|
||||
} ;
|
||||
{-
|
||||
c = case <isFin, b, co.c, np.isPron> of {
|
||||
<_, Neg, NPAcc,_> => NPCase Part ; -- en näe taloa/sinua
|
||||
<_, Pos, NPAcc,True> => NPAcc ; -- näen/täytyy sinut
|
||||
<False,Pos, NPAcc,False> => NPCase Nom ; -- täytyy nähdä talo
|
||||
<_,_,coc,_> => coc
|
||||
} ;
|
||||
-}
|
||||
nps = np.s ! c
|
||||
in
|
||||
preOrPost co.isPre co.s nps ;
|
||||
|
||||
-- For $Verb$.
|
||||
|
||||
Verb : Type = {
|
||||
s : VForm => Str ;
|
||||
p : Str -- particle verbs
|
||||
} ;
|
||||
|
||||
param
|
||||
VIForm =
|
||||
VIFin Tense
|
||||
| VIInf InfForm
|
||||
| VIPass
|
||||
| VIImper
|
||||
;
|
||||
|
||||
oper
|
||||
VP = {
|
||||
s : VIForm => Anteriority => Polarity => Agr => {fin, inf : Str} ;
|
||||
s2 : Bool => Polarity => Agr => Str ; -- raamat/raamatu/raamatut
|
||||
adv : Polarity => Str ; -- ainakin/ainakaan --TODO relevant for Est?
|
||||
p : Str ; --uninflecting component in multi-word verbs
|
||||
ext : Str ;
|
||||
sc : NPForm ;
|
||||
} ;
|
||||
|
||||
predV : (Verb ** {sc : NPForm}) -> VP = \verb -> {
|
||||
s = \\vi,ant,b,agr0 =>
|
||||
let
|
||||
agr = verbAgr agr0 ;
|
||||
verbs = verb.s ;
|
||||
part : Str = case vi of {
|
||||
VIPass => verbs ! (PastPart Pass) ;
|
||||
_ => verbs ! (PastPart Act)
|
||||
} ;
|
||||
|
||||
eiv : Str = case agr of {
|
||||
_ => "ei"
|
||||
} ;
|
||||
|
||||
einegole : Str * Str * Str = case <vi,agr.n> of {
|
||||
<VIFin Pres, _> => <eiv, verbs ! Imper Sg, "ole"> ;
|
||||
<VIFin Fut, _> => <eiv, verbs ! Imper Sg, "ole"> ;
|
||||
<VIFin Cond, _> => <eiv, verbs ! Condit Sg P3, "oleks"> ;
|
||||
<VIFin Past, Sg> => <eiv, part, "olnud"> ;
|
||||
<VIFin Past, Pl> => <eiv, part, "olnud"> ;
|
||||
<VIImper, Sg> => <"ära", verbs ! Imper Sg, "ole"> ;
|
||||
<VIImper, Pl> => <"ärge", verbs ! ImpNegPl, "olge"> ;
|
||||
<VIPass, _> => <"ei", verbs ! PassPresn False, "ole"> ;
|
||||
<VIInf i, _> => <"ei", verbs ! Inf i, "olla">
|
||||
} ;
|
||||
|
||||
ei : Str = einegole.p1 ;
|
||||
neg : Str = einegole.p2 ;
|
||||
ole : Str = einegole.p3 ;
|
||||
|
||||
olema : VForm => Str = verbOlema.s ;
|
||||
|
||||
vf : Str -> Str -> {fin, inf : Str} = \x,y -> {fin = x ; inf = y} ;
|
||||
|
||||
mkvf : VForm -> {fin, inf : Str} = \p -> case <ant,b> of {
|
||||
<Simul,Pos> => vf (verbs ! p) [] ;
|
||||
<Anter,Pos> => vf (olema ! p) part ;
|
||||
-- <Anter,Neg> => vf ei (ole ++ part) ;
|
||||
-- <Simul,Neg> => vf ei neg
|
||||
<Simul,Neg> => vf (ei ++ neg) [] ; --changed grouping from Fin
|
||||
<Anter,Neg> => vf (ei ++ ole) part
|
||||
}
|
||||
in case vi of {
|
||||
VIFin Past => mkvf (Impf agr.n agr.p) ;
|
||||
VIFin Cond => mkvf (Condit agr.n agr.p) ;
|
||||
VIFin Fut => mkvf (Presn agr.n agr.p) ;
|
||||
VIFin Pres => mkvf (Presn agr.n agr.p) ;
|
||||
VIImper => mkvf (Imper agr.n) ;
|
||||
VIPass => mkvf (PassPresn True) ;
|
||||
VIInf i => mkvf (Inf i)
|
||||
} ;
|
||||
|
||||
s2 = \\_,_,_ => [] ;
|
||||
adv = \\_ => [] ;
|
||||
ext = [] ; --relative clause
|
||||
p = verb.p ; --particle verbs
|
||||
sc = verb.sc
|
||||
} ;
|
||||
|
||||
insertObj : (Bool => Polarity => Agr => Str) -> VP -> VP = \obj,vp -> {
|
||||
s = vp.s ;
|
||||
s2 = \\fin,b,a => vp.s2 ! fin ! b ! a ++ obj ! fin ! b ! a ;
|
||||
adv = vp.adv ;
|
||||
p = vp.p ;
|
||||
ext = vp.ext ;
|
||||
sc = vp.sc ;
|
||||
} ;
|
||||
|
||||
insertObjPre : (Bool => Polarity => Agr => Str) -> VP -> VP = \obj,vp -> {
|
||||
s = vp.s ;
|
||||
s2 = \\fin,b,a => obj ! fin ! b ! a ++ vp.s2 ! fin ! b ! a ;
|
||||
adv = vp.adv ;
|
||||
p = vp.p ;
|
||||
ext = vp.ext ;
|
||||
sc = vp.sc ;
|
||||
} ;
|
||||
|
||||
insertAdv : (Polarity => Str) -> VP -> VP = \adv,vp -> {
|
||||
s = vp.s ;
|
||||
s2 = vp.s2 ;
|
||||
p = vp.p ;
|
||||
ext = vp.ext ;
|
||||
adv = \\b => vp.adv ! b ++ adv ! b ;
|
||||
sc = vp.sc ;
|
||||
} ;
|
||||
|
||||
insertExtrapos : Str -> VP -> VP = \obj,vp -> {
|
||||
s = vp.s ;
|
||||
s2 = vp.s2 ;
|
||||
p = vp.p ;
|
||||
ext = vp.ext ++ obj ;
|
||||
adv = vp.adv ;
|
||||
sc = vp.sc ;
|
||||
} ;
|
||||
|
||||
-- For $Sentence$.
|
||||
|
||||
Clause : Type = {
|
||||
s : Tense => Anteriority => Polarity => SType => Str
|
||||
} ;
|
||||
|
||||
ClausePlus : Type = {
|
||||
s : Tense => Anteriority => Polarity => {subj,fin,inf,compl,adv,p,ext : Str}
|
||||
} ;
|
||||
|
||||
-- The Finnish version of SQuest featured a word order change and
|
||||
-- the question particle "ko". The Estonian version just prefixes the
|
||||
-- declarative sentence with the yes/no-queryword "kas".
|
||||
-- SQuest: "kas" + SDecl
|
||||
-- It would be also correct to use the Finnish structure, just without the ko-particle.
|
||||
-- Inari: added a third SType, SInv.
|
||||
-- Not sure if SInv is needed, but keeping it for possible future use.
|
||||
-- There's need for an inverted word order with auxiliary verbs; infVP handles that. ComplVV calls infVP, which inverts the word order for the complement VP, and puts it into the resulting VP's `compl' field.
|
||||
-- SInv made by mkClause would be for cases where you just need to construct an inverted word order, and then call it from some other place; application grammar (TODO: api oper for SType) or ExtraEst.
|
||||
mkClause : (Polarity -> Str) -> Agr -> VP -> Clause =
|
||||
\sub,agr,vp -> {
|
||||
s = \\t,a,b =>
|
||||
let
|
||||
c = (mkClausePlus sub agr vp).s ! t ! a ! b ;
|
||||
-- saan sinust aru 0
|
||||
-- ma olen täna sinust aru saanud
|
||||
declCl = c.subj ++ c.fin ++ c.adv ++ c.compl ++ c.p ++ c.inf ++ c.ext ;
|
||||
-- [sind näha] 0 tahtnud
|
||||
-- täna olen ma sinust aru saanud
|
||||
invCl = c.adv ++ c.fin ++ c.subj ++ c.compl ++ c.p ++ c.inf ++ c.ext
|
||||
in
|
||||
table {
|
||||
SDecl => declCl ;
|
||||
SQuest => "kas" ++ declCl ;
|
||||
SInv => invCl
|
||||
}
|
||||
} ;
|
||||
|
||||
mkClausePlus : (Polarity -> Str) -> Agr -> VP -> ClausePlus =
|
||||
\sub,agr,vp -> {
|
||||
s = \\t,a,b =>
|
||||
let
|
||||
agrfin = case vp.sc of {
|
||||
NPCase Nom => <agr,True> ;
|
||||
_ => <agrP3 Sg,False> -- minun täytyy, minulla on
|
||||
} ;
|
||||
verb = vp.s ! VIFin t ! a ! b ! agrfin.p1 ;
|
||||
in {subj = sub b ;
|
||||
fin = verb.fin ;
|
||||
inf = verb.inf ;
|
||||
compl = vp.s2 ! agrfin.p2 ! b ! agr ;
|
||||
p = vp.p ;
|
||||
adv = vp.adv ! b ;
|
||||
ext = vp.ext ;
|
||||
}
|
||||
} ;
|
||||
|
||||
insertKinClausePlus : Predef.Ints 1 -> ClausePlus -> ClausePlus = \p,cl -> {
|
||||
s = \\t,a,b =>
|
||||
let
|
||||
c = cl.s ! t ! a ! b
|
||||
in
|
||||
case p of {
|
||||
0 => {subj = c.subj ++ gi ; fin = c.fin ; inf = c.inf ; -- Jussikin nukkuu
|
||||
compl = c.compl ; p = c.p ; adv = c.adv ; ext = c.ext ; h = c.h} ;
|
||||
1 => {subj = c.subj ; fin = c.fin ++ gi ; inf = c.inf ; -- Jussi nukkuukin
|
||||
compl = c.compl ; p = c.p ; adv = c.adv ; ext = c.ext ; h = c.h}
|
||||
}
|
||||
} ;
|
||||
|
||||
insertObjClausePlus : Predef.Ints 1 -> Bool -> (Polarity => Str) -> ClausePlus -> ClausePlus =
|
||||
\p,ifKin,obj,cl -> {
|
||||
s = \\t,a,b =>
|
||||
let
|
||||
c = cl.s ! t ! a ! b ;
|
||||
co = obj ! b ++ if_then_Str ifKin (kin b) [] ;
|
||||
in case p of {
|
||||
0 => {subj = c.subj ; fin = c.fin ; inf = c.inf ;
|
||||
compl = co ; p = c.p ; adv = c.compl ++ c.adv ; ext = c.ext ; h = c.h} ; -- Jussi juo maitoakin
|
||||
1 => {subj = c.subj ; fin = c.fin ; inf = c.inf ;
|
||||
compl = c.compl ; p = c.p ; adv = co ; ext = c.adv ++ c.ext ; h = c.h} -- Jussi nukkuu nytkin
|
||||
}
|
||||
} ;
|
||||
|
||||
kin : Polarity -> Str =
|
||||
\p -> case p of {Pos => "gi" ; Neg => "gi"} ;
|
||||
|
||||
--allomorph "ki", depends only on phonetic rules "üks+ki", "ühe+gi"
|
||||
--waiting for post construction in GF :P
|
||||
gi : Str = "gi" ;
|
||||
|
||||
glueTok : Str -> Str = \s -> "&+" ++ s ;
|
||||
|
||||
|
||||
-- This is used for subjects of passives: therefore isFin in False.
|
||||
|
||||
subjForm : NP -> NPForm -> Polarity -> Str = \np,sc,b ->
|
||||
appCompl False b {s = [] ; c = sc ; isPre = True} np ;
|
||||
|
||||
infVP : NPForm -> Polarity -> Agr -> VP -> InfForm -> Str =
|
||||
\sc,pol,agr,vp,vi ->
|
||||
let
|
||||
fin = case sc of { -- subject case
|
||||
NPCase Nom => True ; -- mina tahan joosta
|
||||
_ => False -- minul peab auto olema
|
||||
} ;
|
||||
verb = vp.s ! VIInf vi ! Simul ! Pos ! agr ; -- no "ei"
|
||||
compl = vp.s2 ! fin ! pol ! agr ; -- but compl. case propagated
|
||||
adv = vp.adv ! pol
|
||||
in
|
||||
-- inverted word order; e.g.
|
||||
--sinust kunagi aru saada tahtnud rel. clause
|
||||
compl ++ adv ++ vp.p ++ verb.inf ++ verb.fin ++ vp.ext ;
|
||||
--TODO adv placement?
|
||||
--TODO inf ++ fin or fin ++ inf? does it ever become a case here?
|
||||
|
||||
-- The definitions below were moved here from $MorphoEst$ so that
|
||||
-- auxiliary of predication can be defined.
|
||||
|
||||
verbOlema : Verb =
|
||||
let olema = mkVerb
|
||||
"olema" "olla" "olen" "ollakse"
|
||||
"olge" "oli" "olnud" "oldud"
|
||||
in {s = table {
|
||||
Presn _ P3 => "on" ;
|
||||
v => olema.s ! v
|
||||
} ;
|
||||
p = []
|
||||
} ;
|
||||
|
||||
verbMinema : Verb =
|
||||
let minema = mkVerb
|
||||
"minema" "minna" "läheb" "minnakse"
|
||||
"minge" "läks" "läinud" "mindud"
|
||||
in {s = table {
|
||||
Impf Sg P1 => "läksin" ;
|
||||
Impf Sg P2 => "läksid" ;
|
||||
Impf Pl P1 => "läksime" ;
|
||||
Impf Pl P2 => "läksite" ;
|
||||
Impf Pl P3 => "läksid" ;
|
||||
Imper Sg => "mine" ;
|
||||
v => minema.s ! v
|
||||
} ;
|
||||
p = []
|
||||
} ;
|
||||
|
||||
|
||||
--3 Verbs
|
||||
|
||||
--Auxiliary for internal use
|
||||
mkVerb : (x1,_,_,_,_,_,_,x8 : Str) -> Verb =
|
||||
\tulema,tulla,tuleb,tullakse,tulge,tuli,tulnud,tuldud ->
|
||||
vforms2V (vForms8
|
||||
tulema tulla tuleb tullakse tulge tuli tulnud tuldud
|
||||
) ;
|
||||
|
||||
--below moved here from MorphoEst
|
||||
VForms : Type = Predef.Ints 7 => Str ;
|
||||
|
||||
vForms8 : (x1,_,_,_,_,_,_,x8 : Str) -> VForms =
|
||||
\tulema,tulla,tuleb,tullakse,tulge,tuli,tulnud,tuldud ->
|
||||
table {
|
||||
0 => tulema ;
|
||||
1 => tulla ;
|
||||
2 => tuleb ;
|
||||
3 => tullakse ;
|
||||
4 => tulge ;
|
||||
5 => tuli ;
|
||||
6 => tulnud ;
|
||||
7 => tuldud
|
||||
} ;
|
||||
|
||||
vforms2V : VForms -> Verb = \vh ->
|
||||
let
|
||||
tulema = vh ! 0 ;
|
||||
tulla = vh ! 1 ;
|
||||
tuleb = vh ! 2 ;
|
||||
tullakse = vh ! 3 ; --juuakse; loetakse
|
||||
tulge = vh ! 4 ; --necessary for tulla, surra (otherwise *tulege, *surege)
|
||||
tuli = vh ! 5 ; --necessary for jooma-juua-jõi
|
||||
tulnud = vh ! 6 ;
|
||||
tuldud = vh ! 7 ; --necessary for t/d in tuldi; loeti
|
||||
|
||||
tull_ = init tulla ; --juu(a); saad(a); tull(a);
|
||||
tulles = tull_ + "es" ; --juues; saades; tulles;
|
||||
|
||||
tule_ = init tuleb ;
|
||||
|
||||
lask_ = Predef.tk 2 tulema ;
|
||||
laulev = case (last lask_) of { --sooma~soov ; laulma~laulev
|
||||
("a"|"e"|"i"|"o"|"u"|"õ"|"ä"|"ö"|"ü") => lask_ + "v" ;
|
||||
_ => lask_ + "ev" } ; --consonant stem in -ma, add e
|
||||
|
||||
--imperfect stem
|
||||
kaisi_ = case (Predef.dp 3 tuli) of {
|
||||
"sis" => lask_ + "i" ; --tõusin, tõusis
|
||||
_ + "i" => tuli ; --jõin, jõi
|
||||
_ => lask_ + "si" --käisin, käis; muutsin, muutis
|
||||
};
|
||||
|
||||
tuld_ = Predef.tk 2 tuldud ; --d/t choice for tuldi etc.
|
||||
tulgu = (init tulge) + "u" ;
|
||||
in
|
||||
{s = table {
|
||||
Inf InfDa => tulla ;
|
||||
Inf InfDes => tulles ;
|
||||
Presn Sg P1 => tule_ + "n" ;
|
||||
Presn Sg P2 => tule_ + "d" ;
|
||||
Presn Sg P3 => tuleb ;
|
||||
Presn Pl P1 => tule_ + "me" ;
|
||||
Presn Pl P2 => tule_ + "te" ;
|
||||
Presn Pl P3 => tule_ + "vad" ;
|
||||
Impf Sg P1 => kaisi_ + "n" ; --# notpresent
|
||||
Impf Sg P2 => kaisi_ + "d" ; --# notpresent
|
||||
Impf Sg P3 => tuli ; --# notpresent
|
||||
Impf Pl P1 => kaisi_ + "me" ; --# notpresent
|
||||
Impf Pl P2 => kaisi_ + "te" ; --# notpresent
|
||||
Impf Pl P3 => kaisi_ + "d" ; --# notpresent
|
||||
Condit Sg P1 => tule_ + "ksin" ; --# notpresent
|
||||
Condit Sg P2 => tule_ + "ksid" ; --# notpresent
|
||||
Condit Sg P3 => tule_ + "ks"; --# notpresent
|
||||
Condit Pl P1 => tule_ + "ksime" ; --# notpresent
|
||||
Condit Pl P2 => tule_ + "ksite" ; --# notpresent
|
||||
Condit Pl P3 => tule_ + "ksid" ; --# notpresent
|
||||
Imper Sg => tule_ ; -- tule
|
||||
Imper Pl => tulge ; -- tulge
|
||||
ImperP3 => tulgu ; -- tulgu (ta/nad)
|
||||
ImperP1Pl => tulge + "m" ; -- tulgem
|
||||
ImpNegPl => tulge ; -- ärge tulge
|
||||
PassPresn True => tullakse ;
|
||||
PassPresn False => tuld_ + "a" ; --da or ta
|
||||
PassImpf True => tuld_ + "i" ; --di or ti
|
||||
PassImpf False => tuldud ;
|
||||
Quotative Act => lask_ + "vat" ;
|
||||
Quotative Pass => tuld_ + "avat" ; --d or t
|
||||
PresPart Act => laulev ;
|
||||
PresPart Pass => tuld_ + "av" ; --d or t
|
||||
PastPart Act => tulnud ;
|
||||
PastPart Pass => tuldud ;
|
||||
Inf InfMa => tulema ;
|
||||
Inf InfMas => tulema + "s" ;
|
||||
Inf InfMast => tulema + "st" ;
|
||||
Inf InfMata => tulema + "ta" ;
|
||||
Inf InfMaks => tulema + "ks"
|
||||
} ;
|
||||
sc = NPCase Nom ;
|
||||
p = [] ;
|
||||
lock_V = <>
|
||||
} ;
|
||||
|
||||
-- For regular verbs, paradigm from 4 base forms
|
||||
-- Analoogiaseosed pöördsõna paradigmas
|
||||
-- http://www.eki.ee/books/ekk09/index.php?p=3&p1=5&id=227
|
||||
regVForms : (x1,_,_,x4 : Str) -> VForms = \vestlema,vestelda,vestleb,vesteldakse ->
|
||||
let
|
||||
vestle_ = Predef.tk 2 vestlema ;
|
||||
vesteld_ = init vestelda ;
|
||||
vestel_ = init vesteld_ ;
|
||||
lase_ = init vestleb ;
|
||||
jaet_ = Predef.tk 4 vesteldakse ;
|
||||
g = case (last vesteld_) of { --doesn't work for anda~andke
|
||||
"t" => "k" ;
|
||||
_ => "g"
|
||||
} ;
|
||||
toit_ = case (last vestle_) of {
|
||||
("t"|"d") => vesteld_ ; --toit(ma) -> toitke;
|
||||
_ => vestel_ --vestle(ma) -> vestelge
|
||||
} ;
|
||||
laski_ = case (last vestle_) of {
|
||||
("a"|"e"|"i"|"o"|"u"|"õ"|"ä"|"ö"|"ü")
|
||||
=> vestle_ ; --vestle(ma) -> vestles
|
||||
_ => vestle_ + "i" --lask(ma) -> laskis
|
||||
} ;
|
||||
in
|
||||
vForms8
|
||||
vestlema
|
||||
vestelda
|
||||
vestleb
|
||||
vesteldakse
|
||||
(toit_ + g + "e") --da: käskiva kõneviisi ainsuse 3. pööre ja mitmus;
|
||||
(laski_ + "s") --ma: kindla kõneviisi lihtmineviku pöörded;
|
||||
(toit_ + "nud") --da: isikulise tegumoe mineviku kesksõna
|
||||
(jaet_ + "ud"); --takse: ülejäänud umbisikulise tgm vormid
|
||||
|
||||
|
||||
regVerb : (_,_,_,_ : Str) -> Verb = \kinkima,kinkida,kingib,kingitakse ->
|
||||
vforms2V (regVForms kinkima kinkida kingib kingitakse) ;
|
||||
|
||||
|
||||
noun2adj : CommonNoun -> Adj = noun2adjComp True ;
|
||||
-- noun2adj : Noun -> Adj = noun2adjComp True ;
|
||||
|
||||
-- TODO: remove the unused arguments and clean up the code
|
||||
-- TODO: AAdv is current just Sg Ablat, which seems OK in most cases, although
|
||||
-- ilus -> ilusti | ilusalt?
|
||||
-- hea -> hästi
|
||||
-- parem -> paremini
|
||||
-- parim -> kõige paremini | parimalt?
|
||||
noun2adjComp : Bool -> CommonNoun -> Adj = \isPos,tuore ->
|
||||
-- noun2adjComp : Bool -> Noun -> Adj = \isPos,tuore ->
|
||||
let
|
||||
tuoreesti = Predef.tk 1 (tuore.s ! NCase Sg Gen) + "sti" ;
|
||||
tuoreemmin = Predef.tk 2 (tuore.s ! NCase Sg Gen) + "in"
|
||||
in {s = table {
|
||||
AN f => tuore.s ! f ;
|
||||
-- AAdv => if_then_Str isPos tuoreesti tuoreemmin
|
||||
AAdv => tuore.s ! NCase Sg Ablat
|
||||
} ;
|
||||
} ;
|
||||
|
||||
CommonNoun = {s : NForm => Str} ;
|
||||
|
||||
-- To form an adjective, it is usually enough to give a noun declension: the
|
||||
-- adverbial form is regular.
|
||||
|
||||
Adj : Type = {s : AForm => Str} ;
|
||||
|
||||
|
||||
-- Reflexive pronoun.
|
||||
--- Possessive could be shared with the more general $NounFin.DetCN$.
|
||||
|
||||
--oper
|
||||
--Estonian version started
|
||||
reflPron : Agr -> NP = \agr ->
|
||||
let
|
||||
ise = nForms2N (nForms6 "ise" "enda" "ennast" "endasse" "IGNORE" "IGNORE")
|
||||
in {
|
||||
s = table {
|
||||
NPAcc => "ennast" ;
|
||||
NPCase c => ise.s ! NCase Sg c
|
||||
} ;
|
||||
a = agr ;
|
||||
isPron = False -- no special acc form
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
Noun = CommonNoun ** {lock_N : {}} ;
|
||||
NForms : Type = Predef.Ints 5 => Str ;
|
||||
|
||||
nForms6 : (x1,_,_,_,_,x6 : Str) -> NForms =
|
||||
\jogi,joe,joge,joesse, -- sg nom, gen, part, ill
|
||||
jogede,jogesid -> table { -- pl gen, part,
|
||||
0 => jogi ;
|
||||
1 => joe ;
|
||||
2 => joge ;
|
||||
3 => joesse ;
|
||||
4 => jogede ;
|
||||
5 => jogesid
|
||||
} ;
|
||||
|
||||
n2nforms : CommonNoun -> NForms = \ukko -> table {
|
||||
0 => ukko.s ! NCase Sg Nom ;
|
||||
1 => ukko.s ! NCase Sg Gen ;
|
||||
2 => ukko.s ! NCase Sg Part ;
|
||||
3 => ukko.s ! NCase Sg Illat ;
|
||||
4 => ukko.s ! NCase Pl Gen ;
|
||||
5 => ukko.s ! NCase Pl Part
|
||||
} ;
|
||||
|
||||
-- Converts 6 given strings (Nom, Gen, Part, Illat, Gen, Part) into Noun
|
||||
-- http://www.eki.ee/books/ekk09/index.php?p=3&p1=5&id=226
|
||||
nForms2N : NForms -> CommonNoun = \f ->
|
||||
let
|
||||
jogi = f ! 0 ;
|
||||
joe = f ! 1 ;
|
||||
joge = f ! 2 ;
|
||||
joesse = f ! 3 ;
|
||||
jogede = f ! 4 ;
|
||||
jogesid = f ! 5 ;
|
||||
in
|
||||
{s = table {
|
||||
NCase Sg Nom => jogi ;
|
||||
NCase Sg Gen => joe ;
|
||||
NCase Sg Part => joge ;
|
||||
NCase Sg Transl => joe + "ks" ;
|
||||
NCase Sg Ess => joe + "na" ;
|
||||
NCase Sg Iness => joe + "s" ;
|
||||
NCase Sg Elat => joe + "st" ;
|
||||
NCase Sg Illat => joesse ;
|
||||
NCase Sg Adess => joe + "l" ;
|
||||
NCase Sg Ablat => joe + "lt" ;
|
||||
NCase Sg Allat => joe + "le" ;
|
||||
NCase Sg Abess => joe + "ta" ;
|
||||
NCase Sg Comit => joe + "ga" ;
|
||||
NCase Sg Termin => joe + "ni" ;
|
||||
|
||||
NCase Pl Nom => joe + "d" ;
|
||||
NCase Pl Gen => jogede ;
|
||||
NCase Pl Part => jogesid ;
|
||||
NCase Pl Transl => jogede + "ks" ;
|
||||
NCase Pl Ess => jogede + "na" ;
|
||||
NCase Pl Iness => jogede + "s" ;
|
||||
NCase Pl Elat => jogede + "st" ;
|
||||
NCase Pl Illat => jogede + "sse" ;
|
||||
NCase Pl Adess => jogede + "l" ;
|
||||
NCase Pl Ablat => jogede + "lt" ;
|
||||
NCase Pl Allat => jogede + "le" ;
|
||||
NCase Pl Abess => jogede + "ta" ;
|
||||
NCase Pl Comit => jogede + "ga" ;
|
||||
NCase Pl Termin => jogede + "ni"
|
||||
|
||||
} --;
|
||||
-- lock_N = <>
|
||||
} ;
|
||||
|
||||
oper
|
||||
rp2np : Number -> {s : Number => NPForm => Str ; a : RAgr} -> NP = \n,rp -> {
|
||||
s = rp.s ! n ;
|
||||
a = agrP3 Sg ; -- does not matter (--- at least in Slash)
|
||||
isPron = False -- has no special accusative
|
||||
} ;
|
||||
|
||||
etta_Conj : Str = "et" ;
|
||||
|
||||
heavyDet : PDet -> PDet ** {sp : Case => Str} = \d -> d ** {sp = d.s} ;
|
||||
PDet : Type = {
|
||||
s : Case => Str ;
|
||||
n : Number ;
|
||||
isNum : Bool ;
|
||||
isDef : Bool
|
||||
} ;
|
||||
|
||||
heavyQuant : PQuant -> PQuant ** {sp : Number => Case => Str} = \d ->
|
||||
d ** {sp = d.s} ;
|
||||
PQuant : Type =
|
||||
{s : Number => Case => Str ; isDef : Bool} ;
|
||||
|
||||
}
|
||||
67
lib/src/estonian/SentenceEst.gf
Normal file
67
lib/src/estonian/SentenceEst.gf
Normal file
@@ -0,0 +1,67 @@
|
||||
concrete SentenceEst of Sentence = CatEst ** open Prelude, ResEst in {
|
||||
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lin
|
||||
|
||||
PredVP np vp = mkClause (subjForm np vp.sc) np.a vp ;
|
||||
|
||||
PredSCVP sc vp = mkClause (\_ -> sc.s) (agrP3 Sg) vp ;
|
||||
|
||||
ImpVP vp = {
|
||||
s = \\pol,agr =>
|
||||
let
|
||||
verb = vp.s ! VIImper ! Simul ! pol ! agr ;
|
||||
compl = vp.s2 ! False ! pol ! agr ++ vp.ext --- False = like inf (osta auto)
|
||||
in --(ära) loe raamat(ut) läbi
|
||||
verb.fin ++ verb.inf ++ compl ++ vp.p ;
|
||||
} ;
|
||||
|
||||
-- The object case is formed at the use site of $c2$, in $Relative$ and $Question$.
|
||||
|
||||
SlashVP np vp = {
|
||||
s = \\t,a,p => (mkClause (subjForm np vp.sc) np.a vp).s ! t ! a ! p ! SDecl ;
|
||||
c2 = vp.c2
|
||||
} ;
|
||||
|
||||
AdvSlash slash adv = {
|
||||
s = \\t,a,b => slash.s ! t ! a ! b ++ adv.s ;
|
||||
c2 = slash.c2
|
||||
} ;
|
||||
|
||||
SlashPrep cl prep = {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl ;
|
||||
c2 = prep
|
||||
} ;
|
||||
|
||||
SlashVS np vs slash = {
|
||||
s = \\t,a,p =>
|
||||
(mkClause (subjForm np vs.sc) np.a
|
||||
(insertExtrapos (etta_Conj ++ slash.s)
|
||||
(predV vs))
|
||||
).s ! t ! a ! p ! SDecl ;
|
||||
c2 = slash.c2
|
||||
} ;
|
||||
|
||||
|
||||
EmbedS s = {s = etta_Conj ++ s.s} ;
|
||||
EmbedQS qs = {s = qs.s} ;
|
||||
EmbedVP vp = {s = infVP (NPCase Nom) Pos (agrP3 Sg) vp InfDa} ; --- case,pol,agr,infform
|
||||
|
||||
UseCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! SDecl} ;
|
||||
UseQCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p} ;
|
||||
UseRCl t p cl = {
|
||||
s = \\r => t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! r ;
|
||||
c = cl.c
|
||||
} ;
|
||||
UseSlash t p cl = {
|
||||
s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ;
|
||||
c2 = cl.c2
|
||||
} ;
|
||||
|
||||
AdvS a s = {s = a.s ++ s.s} ;
|
||||
ExtAdvS a s = {s = a.s ++ "," ++ s.s} ;
|
||||
|
||||
RelS s r = {s = s.s ++ "," ++ r.s ! agrP3 Sg} ; ---- mikä
|
||||
|
||||
}
|
||||
302
lib/src/estonian/StructuralEst.gf
Normal file
302
lib/src/estonian/StructuralEst.gf
Normal file
@@ -0,0 +1,302 @@
|
||||
concrete StructuralEst of Structural = CatEst **
|
||||
open MorphoEst, ParadigmsEst, (X = ConstructX), MakeStructuralEst, Prelude in {
|
||||
|
||||
flags optimize=all ; coding=utf8 ;
|
||||
|
||||
lin
|
||||
above_Prep = postGenPrep "peal" ;
|
||||
after_Prep = postGenPrep "järel" ;
|
||||
|
||||
all_Predet = {s = \\n,c =>
|
||||
let
|
||||
kaiket = caseTable n (mkN "kõik")
|
||||
in
|
||||
case npform2case n c of {
|
||||
Nom => "kõik" ;
|
||||
k => kaiket ! k
|
||||
}
|
||||
} ;
|
||||
almost_AdA, almost_AdN = ss "peaaegu" ;
|
||||
although_Subj = ss "kuigi" ;
|
||||
always_AdV = ss "alati" ;
|
||||
and_Conj = {s1 = [] ; s2 = "ja" ; n = Pl} ;
|
||||
because_Subj = ss "sellepärast" ;
|
||||
before_Prep = prePrep partitive "enne" ;
|
||||
behind_Prep = postGenPrep "taga" ;
|
||||
between_Prep = postGenPrep "vahel" ;
|
||||
both7and_DConj = sd2 "nii" "kui ka" ** {n = Pl} ;
|
||||
but_PConj = ss "aga" ;
|
||||
by8agent_Prep = postGenPrep "poolt" ;
|
||||
by8means_Prep = casePrep adessive ;
|
||||
can8know_VV = mkVV (mkV "oskama" "osata") ;
|
||||
can_VV = mkVV (mkV "võima" "võida") ;
|
||||
during_Prep = postGenPrep "ajal" ;
|
||||
either7or_DConj = sd2 "kas" "või" ** {n = Sg} ;
|
||||
everybody_NP = makeNP (mkN "igaüks") Sg ;
|
||||
every_Det = mkDet Sg (mkN "iga") ;
|
||||
everything_NP = makeNP ((mkN "kõik") ** {lock_N = <>}) Sg ;
|
||||
everywhere_Adv = ss "kõikjal" ;
|
||||
few_Det = mkDet Sg (mkN "mõni") ;
|
||||
--- first_Ord = {s = \\n,c => (mkN "ensimmäinen").s ! NCase n c} ;
|
||||
for_Prep = casePrep allative ;
|
||||
from_Prep = casePrep elative ;
|
||||
he_Pron = mkPronoun "tema" "tema" "teda" Sg P3 ;
|
||||
here_Adv = ss "siin" ;
|
||||
here7to_Adv = ss "siia" ;
|
||||
here7from_Adv = ss "siit" ;
|
||||
how_IAdv = ss "kuidas" ;
|
||||
how8much_IAdv = ss "kui palju" ;
|
||||
how8many_IDet = {
|
||||
s = \\c => "kui" ++ (mkN "mitu" "mitme" "mitut" "TODO" "TODO" "TODO").s ! NCase Sg c ;
|
||||
n = Sg ;
|
||||
isNum = False
|
||||
} ;
|
||||
if_Subj = ss "kui" ;
|
||||
in8front_Prep = postGenPrep "ees" ;
|
||||
i_Pron = mkPronoun "mina" "minu" "mind" Sg P1 ;
|
||||
in_Prep = casePrep inessive ;
|
||||
it_Pron = {
|
||||
s = \\c => pronSe.s ! npform2case Sg c ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
less_CAdv = X.mkCAdv "vähem" "kui" ;
|
||||
many_Det = mkDet Sg (mkN "mitu") ;
|
||||
more_CAdv = X.mkCAdv "rohkem" "kui" ;
|
||||
most_Predet = {s = \\n,c => (nForms2N (dSuurin "MOST")).s ! NCase n (npform2case n c)} ;
|
||||
much_Det = mkDet Sg {s = \\_ => "palju"} ;
|
||||
must_VV = mkVVf (mkV "pidama" "pidada" "peab" "peetakse" "pidage" "pidi" "pidanud" "peetud") infMa ;
|
||||
no_Utt = ss "ei" ;
|
||||
on_Prep = casePrep adessive ;
|
||||
--- one_Quant = mkDet Sg DEPREC
|
||||
only_Predet = {s = \\_,_ => "ainult"} ;
|
||||
or_Conj = {s1 = [] ; s2 = "või" ; n = Pl} ;
|
||||
otherwise_PConj = ss "muidu" ;
|
||||
part_Prep = casePrep partitive ;
|
||||
please_Voc = ss ["palun"] ; --- number
|
||||
possess_Prep = casePrep genitive ;
|
||||
quite_Adv = ss "üsna" ;
|
||||
she_Pron = mkPronoun "tema" "tema" "teda" Sg P3 ;
|
||||
so_AdA = ss "nii" ;
|
||||
somebody_NP = {
|
||||
s = \\c => jokuPron ! Sg ! npform2case Sg c ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
someSg_Det = heavyDet {
|
||||
s = jokuPron ! Sg ;
|
||||
isNum = False ; isDef = True ; n = Sg
|
||||
} ;
|
||||
somePl_Det = heavyDet {
|
||||
s = jokuPron ! Pl ;
|
||||
isNum = False ; isDef = True ;
|
||||
n = Pl
|
||||
} ;
|
||||
something_NP = {
|
||||
s = \\c => mikaInt ! Sg ! npform2case Sg c ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
somewhere_Adv = ss "kuskil" ;
|
||||
that_Quant = heavyQuant {
|
||||
s = table (MorphoEst.Number) {
|
||||
Sg => table (MorphoEst.Case) {
|
||||
c => (mkPronoun "too" "tolle" "toda" Sg P3).s ! NPCase c
|
||||
} ;
|
||||
Pl => table (MorphoEst.Case) {
|
||||
c => (mkPronoun "nood" "nonde" "noid" Sg P3).s ! NPCase c
|
||||
}
|
||||
} ;
|
||||
isNum = False ; isDef = True ;
|
||||
} ;
|
||||
that_Subj = ss "et" ;
|
||||
there_Adv = ss "seal" ;
|
||||
there7to_Adv = ss "sinna" ;
|
||||
there7from_Adv = ss "sealt" ;
|
||||
therefore_PConj = ss "sellepärast" ;
|
||||
they_Pron = mkPronoun "nemad" "nende" "neid" Pl P3 ;
|
||||
this_Quant = heavyQuant {
|
||||
s = table (MorphoEst.Number) {
|
||||
Sg => table (MorphoEst.Case) {
|
||||
c => (mkPronoun "see" "selle" "seda" Sg P3).s ! NPCase c
|
||||
} ;
|
||||
Pl => table (MorphoEst.Case) {
|
||||
c => (mkPronoun "need" "nende" "neid" Sg P3).s ! NPCase c
|
||||
}
|
||||
} ;
|
||||
isNum = False ; isDef = True ;
|
||||
} ;
|
||||
through_Prep = postGenPrep "kaudu" ;
|
||||
too_AdA = ss "liiga" ;
|
||||
to_Prep = casePrep allative ;
|
||||
under_Prep = postGenPrep "all" ;
|
||||
very_AdA = ss "väga" ;
|
||||
want_VV = mkVV (mkV "tahtma") ;
|
||||
we_Pron = mkPronoun "meie" "meie" "meid" Pl P1 ;
|
||||
whatPl_IP = {
|
||||
s = table {NPAcc => "mida" ; c => mikaInt ! Pl ! npform2case Pl c} ;
|
||||
n = Pl
|
||||
} ;
|
||||
whatSg_IP = {
|
||||
s = \\c => mikaInt ! Sg ! npform2case Sg c ;
|
||||
n = Sg
|
||||
} ;
|
||||
when_IAdv = ss "kui" ;
|
||||
when_Subj = ss "kui" ;
|
||||
where_IAdv = ss "kus" ;
|
||||
which_IQuant = { s = mikaInt } ;
|
||||
whoSg_IP = {
|
||||
s = table {NPAcc => "keda" ; c => kukaInt ! Sg ! npform2case Sg c} ;
|
||||
n = Sg
|
||||
} ;
|
||||
whoPl_IP = {
|
||||
s = table {NPAcc => "keda" ; c => kukaInt ! Pl ! npform2case Pl c} ;
|
||||
n = Pl
|
||||
} ;
|
||||
why_IAdv = ss "miks" ;
|
||||
without_Prep = prePrep partitive "ilma" ;
|
||||
with_Prep = prePrep comitative "koos" ;
|
||||
yes_Utt = ss "jah" ;
|
||||
youSg_Pron = mkPronoun "sina" "sinu" "sind" Sg P2 ;
|
||||
youPl_Pron = mkPronoun "teie" "teie" "teid" Pl P2 ;
|
||||
youPol_Pron =
|
||||
let p = mkPronoun "teie" "teie" "teid" Pl P2 in
|
||||
{s = p.s ; a = AgPol} ;
|
||||
|
||||
oper
|
||||
jokuPron : MorphoEst.Number => (MorphoEst.Case) => Str =
|
||||
let
|
||||
keegi = mkN "keegi" "kellegi" "kedagi" "kellegisse" "kellegi" "kedagi"
|
||||
in
|
||||
table {
|
||||
Sg => table {
|
||||
c => keegi.s ! NCase Sg c
|
||||
} ;
|
||||
Pl => table {
|
||||
c => keegi.s ! NCase Sg c
|
||||
}
|
||||
} ;
|
||||
|
||||
-- TODO: maybe remove
|
||||
jokinPron : MorphoEst.Number => (MorphoEst.Case) => Str =
|
||||
table {
|
||||
Sg => table {
|
||||
Nom => "miski" ;
|
||||
Iness => "milleski" ;
|
||||
Elat => "millestki" ;
|
||||
Ablat => "milleltki" ;
|
||||
Transl => "millekski" ;
|
||||
c => mikaInt ! Sg ! c + "gi"
|
||||
} ;
|
||||
Pl => table { --TODO correct these plurals
|
||||
Nom => "miski" ;
|
||||
Iness => "milleski" ;
|
||||
Elat => "millestki" ;
|
||||
Ablat => "milleltki" ;
|
||||
Transl => "millekski" ;
|
||||
c => mikaInt ! Pl ! c + "gi"
|
||||
}
|
||||
} ;
|
||||
|
||||
--TODO does this work?
|
||||
mikaInt : MorphoEst.Number => (MorphoEst.Case) => Str =
|
||||
let {
|
||||
mi = mkN "mille"
|
||||
} in
|
||||
table {
|
||||
Sg => table {
|
||||
Nom => "mis" ;
|
||||
Gen => "mille" ;
|
||||
Part => "mida" ;
|
||||
c => mi.s ! NCase Sg c
|
||||
} ;
|
||||
Pl => table {
|
||||
Nom => "mis" ;
|
||||
Gen => "mille" ;
|
||||
Part => "mida" ;
|
||||
c => mi.s ! NCase Pl c
|
||||
}
|
||||
} ;
|
||||
|
||||
kukaInt : MorphoEst.Number => (MorphoEst.Case) => Str =
|
||||
let
|
||||
kuka = mkN "kes" "kelle" "keda" "kellesse"
|
||||
"kellede" "keda" ;
|
||||
in
|
||||
table {
|
||||
Sg => table {
|
||||
c => kuka.s ! NCase Sg c
|
||||
} ;
|
||||
Pl => table {
|
||||
Nom => "kes" ;
|
||||
c => kuka.s ! NCase Pl c
|
||||
}
|
||||
} ;
|
||||
mikaanPron : MorphoEst.Number => (MorphoEst.Case) => Str = \\n,c =>
|
||||
case <n,c> of {
|
||||
<_,Nom> => "ükski" ;
|
||||
<_,Part> => "ühtegi" ;
|
||||
<_,Gen> => "ühegi" ;
|
||||
_ => mikaInt ! n ! c + "gi" ----ki
|
||||
} ;
|
||||
|
||||
kukaanPron : MorphoEst.Number => (MorphoEst.Case) => Str =
|
||||
table {
|
||||
Sg => table {
|
||||
Nom => "keegi" ;
|
||||
Part => "kedagi" ;
|
||||
c => kukaInt ! Sg ! c + "gi"
|
||||
} ;
|
||||
Pl => table {
|
||||
Nom => "ketkään" ;
|
||||
Part => "keitään" ;
|
||||
c => kukaInt ! Pl ! c + "gi"
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
oper
|
||||
makeNP : N -> MorphoEst.Number -> CatEst.NP ;
|
||||
makeNP noun num = {
|
||||
s = \\c => noun.s ! NCase num (npform2case num c) ;
|
||||
a = agrP3 num ;
|
||||
isPron = False ;
|
||||
lock_NP = <>
|
||||
} ;
|
||||
|
||||
lin
|
||||
not_Predet = {s = \\_,_ => "ei"} ;
|
||||
|
||||
no_Quant = heavyQuant {
|
||||
s = \\n,c => "mitte" ++ mikaanPron ! n ! c ;
|
||||
isNum = False ; isDef = True ;
|
||||
} ;
|
||||
|
||||
if_then_Conj = {s1 = "kui" ; s2 = "siis" ; n = Sg} ;
|
||||
nobody_NP = {
|
||||
s = \\c => "mitte" ++ kukaanPron ! Sg ! npform2case Sg c ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
nothing_NP = {
|
||||
s = \\c => "mitte" ++ mikaanPron ! Sg ! npform2case Sg c ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
at_least_AdN = ss "vähemalt" ;
|
||||
at_most_AdN = ss "kuni" ;
|
||||
|
||||
as_CAdv = X.mkCAdv "sama palju" "kui" ;
|
||||
|
||||
except_Prep = postPrep partitive "väljaarvatud" ;
|
||||
|
||||
have_V2 = mkV2 (caseV adessive vOlema) ;
|
||||
|
||||
-- Kaarel: TODO: not sure what this is...
|
||||
-- Name of the language in that language, s/suomi/eesti/ :--P
|
||||
lin language_title_Utt = ss "eesti" ;
|
||||
|
||||
}
|
||||
|
||||
42
lib/src/estonian/SymbolEst.gf
Normal file
42
lib/src/estonian/SymbolEst.gf
Normal file
@@ -0,0 +1,42 @@
|
||||
concrete SymbolEst of Symbol = CatEst ** open Prelude, NounEst, ResEst in {
|
||||
|
||||
lin
|
||||
SymbPN i = {s = \\c => i.s} ; --- c
|
||||
IntPN i = {s = \\c => i.s} ; --- c
|
||||
FloatPN i = {s = \\c => i.s} ; --- c
|
||||
NumPN i = {s = \\c => i.s!Sg!Nom } ; --- c
|
||||
|
||||
CNIntNP cn i = {
|
||||
s = \\c => cn.s ! NCase Sg (npform2case Sg c) ++ i.s ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
CNSymbNP det cn xs = let detcn = NounEst.DetCN det cn in {
|
||||
s = \\c => detcn.s ! c ++ xs.s ;
|
||||
a = detcn.a ;
|
||||
isPron = False
|
||||
} ;
|
||||
CNNumNP cn i = {
|
||||
s = \\c => cn.s ! NCase Sg (npform2case Sg c) ++ i.s ! Sg ! Nom ;
|
||||
a = agrP3 Sg ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
SymbS sy = sy ;
|
||||
|
||||
SymbNum n = {s = \\_,_ => n.s ; isNum = True ; n = Pl} ;
|
||||
SymbOrd n = {s = \\_ => n.s ++ "."} ;
|
||||
|
||||
lincat
|
||||
|
||||
Symb, [Symb] = SS ;
|
||||
|
||||
lin
|
||||
|
||||
MkSymb s = s ;
|
||||
|
||||
BaseSymb = infixSS "ja" ;
|
||||
ConsSymb = infixSS "," ;
|
||||
|
||||
}
|
||||
|
||||
136
lib/src/estonian/VerbEst.gf
Normal file
136
lib/src/estonian/VerbEst.gf
Normal file
@@ -0,0 +1,136 @@
|
||||
--1 Verb Phrases in Estonian
|
||||
|
||||
concrete VerbEst of Verb = CatEst ** open Prelude, ResEst in {
|
||||
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lin
|
||||
UseV = predV ;
|
||||
|
||||
SlashV2a v = predV v ** {c2 = v.c2} ;
|
||||
|
||||
Slash2V3 v np =
|
||||
insertObj
|
||||
(\\fin,b,_ => appCompl fin b v.c2 np) (predV v) ** {c2 = v.c3} ;
|
||||
Slash3V3 v np =
|
||||
insertObj
|
||||
(\\fin,b,_ => appCompl fin b v.c3 np) (predV v) ** {c2 = v.c2} ;
|
||||
|
||||
ComplVV v vp =
|
||||
insertObj
|
||||
(\\_,b,a => infVP v.sc b a vp v.vi)
|
||||
(predV {s = v.s ;
|
||||
p = v.p ;
|
||||
sc = case vp.sc of {
|
||||
NPCase Nom => v.sc ; -- minul tuleb kirjutada (VV 'tulema' determines the subject case)
|
||||
c => c -- minul peab auto olema (VP 'olema' determines the subject case)
|
||||
}
|
||||
}
|
||||
) ;
|
||||
|
||||
ComplVS v s = insertExtrapos (etta_Conj ++ s.s) (predV v) ;
|
||||
ComplVQ v q = insertExtrapos ( q.s) (predV v) ;
|
||||
ComplVA v ap =
|
||||
insertObj
|
||||
(\\_,b,agr =>
|
||||
let n = (complNumAgr agr) in
|
||||
ap.s ! False ! (NCase n (npform2case n v.c2.c))) --- v.cs.s ignored
|
||||
(predV v) ;
|
||||
|
||||
SlashV2S v s =
|
||||
insertExtrapos (etta_Conj ++ s.s) (predV v) ** {c2 = v.c2} ;
|
||||
SlashV2Q v q =
|
||||
insertExtrapos (q.s) (predV v) ** {c2 = v.c2} ;
|
||||
SlashV2V v vp =
|
||||
insertObj (\\_,b,a => infVP v.sc b a vp v.vi) (predV v) ** {c2 = v.c2} ;
|
||||
---- different infinitives
|
||||
SlashV2A v ap =
|
||||
insertObj
|
||||
(\\fin,b,_ =>
|
||||
ap.s ! False ! (NCase Sg (npform2case Sg v.c3.c))) ----agr to obj
|
||||
(predV v) ** {c2 = v.c2} ;
|
||||
|
||||
ComplSlash vp np = insertObjPre (\\fin,b,_ => appCompl fin b vp.c2 np) vp ;
|
||||
|
||||
UseComp comp =
|
||||
insertObj (\\_,_ => comp.s) (predV (verbOlema ** {sc = NPCase Nom})) ;
|
||||
|
||||
SlashVV v vp =
|
||||
insertObj
|
||||
(\\_,b,a => infVP v.sc b a vp v.vi)
|
||||
(predV {s = v.s ;
|
||||
p = v.p ;
|
||||
sc = case vp.sc of {
|
||||
NPCase Nom => v.sc ; -- minun täytyy pestä auto
|
||||
c => c -- minulla täytyy olla auto
|
||||
}
|
||||
}
|
||||
) ** {c2 = vp.c2} ; ---- correct ??
|
||||
|
||||
SlashV2VNP v np vp =
|
||||
insertObjPre
|
||||
(\\fin,b,a => appCompl True b v.c2 np ++ ---- fin -> stack overflow
|
||||
infVP v.sc b a vp v.vi)
|
||||
(predV v) ** {c2 = vp.c2} ;
|
||||
|
||||
AdvVP vp adv = insertAdv (\\_ => adv.s) vp ;
|
||||
|
||||
AdVVP adv vp = insertAdv (\\_ => adv.s) vp ;
|
||||
|
||||
ReflVP v = insertObjPre (\\fin,b,agr => appCompl fin b v.c2 (reflPron agr)) v ;
|
||||
|
||||
PassV2 v =
|
||||
let
|
||||
vp = predV v ;
|
||||
subjCase = case v.c2.c of { --this is probably a reason to not get rid of NPAcc; TODO check
|
||||
NPCase Gen => NPCase Nom ; --valisin koera -> koer valitakse
|
||||
_ => v.c2.c --rääkisin koerale -> koerale räägitakse
|
||||
}
|
||||
in {
|
||||
s = \\_ => vp.s ! VIPass ;
|
||||
s2 = \\_,_,_ => [] ;
|
||||
adv = \\_ => [] ;
|
||||
p = vp.p ;
|
||||
ext = vp.ext ;
|
||||
sc = subjCase -- koer valitakse ; koerale räägitakse
|
||||
} ;
|
||||
|
||||
----b UseVS, UseVQ = \v -> v ** {c2 = {s = [] ; c = NPAcc ; isPre = True}} ;
|
||||
|
||||
CompAP ap = {
|
||||
s = \\agr =>
|
||||
let
|
||||
n = complNumAgr agr ;
|
||||
in ap.s ! False ! (NCase n Nom)
|
||||
} ;
|
||||
|
||||
CompCN cn = {
|
||||
s = \\agr =>
|
||||
let
|
||||
n = complNumAgr agr ;
|
||||
in cn.s ! (NCase n Nom)
|
||||
} ;
|
||||
CompNP np = {s = \\_ => np.s ! NPCase Nom} ;
|
||||
CompAdv a = {s = \\_ => a.s} ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
--2 The object case
|
||||
--
|
||||
-- The rules involved are ComplV2 and ComplVV above.
|
||||
-- The work is done jointly in ResEst.infVP and appCompl.
|
||||
-- Cases to test: l -table (to see negated forms)
|
||||
--```
|
||||
-- minun täytyy ostaa auto
|
||||
-- PredVP (UsePron i_Pron) (ComplVV must_VV
|
||||
-- (ComplV2 buy_V2 (DetCN (DetSg (SgQuant DefArt) NoOrd) (UseN car_N))))
|
||||
-- minä tahdon ostaa auton
|
||||
-- PredVP (UsePron i_Pron) (ComplVV want_VV
|
||||
-- (ComplV2 buy_V2 (DetCN (DetSg (SgQuant DefArt) NoOrd) (UseN car_N))))
|
||||
-- minulla täytyy olla auto
|
||||
-- PredVP (UsePron i_Pron) (ComplVV must_VV
|
||||
-- (ComplV2 have_V2 (DetCN (DetSg (SgQuant DefArt) NoOrd) (UseN car_N))))
|
||||
--```
|
||||
-- Unfortunately, there is no nice way to say "I want to have a car".
|
||||
-- (Other than the paraphrases "I want a car" or "I want to own a car".)
|
||||
Reference in New Issue
Block a user