diff --git a/doc/DocExtend.hs b/doc/DocExtend.hs
index bbaecf34..cd543477 100644
--- a/doc/DocExtend.hs
+++ b/doc/DocExtend.hs
@@ -1,3 +1,8 @@
+module Main where
+
+import Data.List
+import Data.Ord (comparing)
+
main = docExtend
docExtend = do
@@ -22,13 +27,15 @@ docExtend = do
--- mapM print fundefs
-- read the functor exclusion lists for each language
- let langs = [("Eng","english"),("Dut","dutch"),("Spa","spanish")] --,("Swe","swedish")]
+ let langs = [("Eng","english"),("Dut","dutch"),("Spa","spanish"),("Swe","swedish")]
funss <- mapM getExclusions langs
- mapM_ print funss
+ --- mapM_ print funss
let langfuns = zip (map fst langs) funss
let funlangs = [(fu,[lang | (lang,fs) <- langfuns, elem fu fs]) | fu:_ <- funs]
let fundeflangs = [[fu,ty,co,de,unwords ls] | fu:ty:co:de:_ <- fundefs, (f,ls) <- funlangs, f==fu]
- mapM print fundeflangs
+ --- mapM print fundeflangs
+ writeFile "GF-RGL-Extend.html" $ printHTML $ sortBy (comparing (\z -> (last (words (z !! 1)), z!!0))) fundeflangs
+ putStrLn "wrote file GF-RGL-Extend.html"
-- exclusion format:
-- concrete ExtendEng of Extend =
@@ -42,4 +49,17 @@ getExclusions (lan,language) = do
let excls = case dropWhile (/=["["]) rs of
[] -> []
_:es -> map (filter (/=',')) $ concat $ takeWhile (/= ["]"]) es
- return excls
\ No newline at end of file
+ return excls
+
+printHTML fs = unlines $
+ "" :
+ "
" :
+ "" :
+ map prRow fs ++ [
+ "
",
+ "",
+ ""
+ ]
+ where
+ prRow ss = concat $ "" : ["| " ++ s ++ " | " | s <- ss] ++ ["
"]
+
diff --git a/src/Make.hs b/src/Make.hs
index f3e65ca4..b47f6a4f 100644
--- a/src/Make.hs
+++ b/src/Make.hs
@@ -31,6 +31,7 @@ langsCoding = [
(("afrikaans","Afr"),""),
(("amharic", "Amh"),""),
(("arabic", "Ara"),""),
+ (("basque", "Eus"),""),
(("bulgarian","Bul"),""),
(("catalan", "Cat"),"Romance"),
(("chinese", "Chi"),""),
@@ -86,13 +87,13 @@ langsIncomplete = ["Amh","Ara","Heb","Lat","Tur","Thb"]
langsAPI = langsLang `except` langsIncomplete
-- languages for which to compile Symbolic
-langsSymbolic = langsLang `except` (langsIncomplete ++ ["Afr","Ina","Jpn","Nep","Pnb","Snd", "Thb"])
+langsSymbolic = langsLang `except` (langsIncomplete ++ ["Afr","Ina","Nep","Pnb","Snd", "Thb"])
-- languages for which to compile minimal Syntax
langsMinimal = langs `only` ["Ara","Eng","Bul","Rus"]
-- languages for which to run treebank test
-langsTest = langsLang `except` ["Ara","Bul","Cat","Hin","Lav","Rus","Spa","Tha","Thb"]
+langsTest = langsLang `except` ["Ara","Bul","Cat","Eus","Hin","Lav","Rus","Spa","Tha","Thb"]
-- languages for which to run demo test
langsDemo = langsLang `except` ["Ara","Hin","Ina","Lat","Lav","Tha","Thb"]
diff --git a/src/abstract/Extend.gf b/src/abstract/Extend.gf
index 00d60b09..26da22e7 100644
--- a/src/abstract/Extend.gf
+++ b/src/abstract/Extend.gf
@@ -25,7 +25,7 @@ abstract Extend = Cat ** {
GenModNP : Num -> NP -> CN -> NP ; -- this man's car(s)
GenModIP : Num -> IP -> CN -> IP ; -- whose car(s)
- CompBareCN : CN -> Comp ; -- (est) professeur
+ CompBareCN : CN -> Comp ; -- (is) teacher
StrandQuestSlash : IP -> ClSlash -> QCl ; -- whom does John live with
StrandRelSlash : RP -> ClSlash -> RCl ; -- that he lives in
@@ -68,7 +68,7 @@ abstract Extend = Cat ** {
ComplVPI2 : VPI2 -> NP -> VPI ; -- to love and hate that person
fun
- ProDrop : Pron -> Pron ; -- unstressed subject pronoun becomes []: "(io) sono stanco"
+ ProDrop : Pron -> Pron ; -- unstressed subject pronoun becomes empty: "am tired"
ICompAP : AP -> IComp ; -- "how old"
IAdvAdv : Adv -> IAdv ; -- "how often"
@@ -192,18 +192,20 @@ abstract Extend = Cat ** {
-- Romance
DetNPFem : Det -> NP ;
- iFem_Pron : Pron ; -- je (suis vieille)
- youFem_Pron : Pron ; -- tu (es vieille)
- weFem_Pron : Pron ; -- nous (sommes vieilles)
- youPlFem_Pron : Pron ; -- vous (êtes vieilles)
- theyFem_Pron : Pron ; -- elles (sont vieilles)
- youPolFem_Pron : Pron ; -- vous (êtes vieille)
+ iFem_Pron : Pron ; -- I (Fem)
+ youFem_Pron : Pron ; -- you (Fem)
+ weFem_Pron : Pron ; -- we (Fem)
+ youPlFem_Pron : Pron ; -- you plural (Fem)
+ theyFem_Pron : Pron ; -- they (Fem)
+ youPolFem_Pron : Pron ; -- you polite (Fem)
+ youPolPl_Pron : Pron ; -- you polite plural (Masc)
+ youPolPlFem_Pron : Pron ; -- you polite plural (Fem)
-- German
UttAccNP : NP -> Utt ; -- him (accusative)
UttDatNP : NP -> Utt ; -- him (dative)
- UttAccIP : NP -> Utt ; -- whom (accusative)
- UttDatIP : NP -> Utt ; -- whom (dative)
+ UttAccIP : IP -> Utt ; -- whom (accusative)
+ UttDatIP : IP -> Utt ; -- whom (dative)
}
diff --git a/src/api/CombinatorsEus.gf b/src/api/CombinatorsEus.gf
new file mode 100644
index 00000000..c550f191
--- /dev/null
+++ b/src/api/CombinatorsEus.gf
@@ -0,0 +1,7 @@
+--# -path=.:alltenses:prelude:../basque
+
+resource CombinatorsEus = Combinators with
+ (Cat = CatEus),
+ (Structural = StructuralEus),
+ (Noun = NounEus),
+ (Constructors = ConstructorsEus) ** {} ;
diff --git a/src/api/ConstructorsEus.gf b/src/api/ConstructorsEus.gf
new file mode 100644
index 00000000..847f0fb0
--- /dev/null
+++ b/src/api/ConstructorsEus.gf
@@ -0,0 +1,3 @@
+--# -path=.:alltenses:prelude
+
+resource ConstructorsEus = Constructors with (Grammar = GrammarEus) ** open MissingEus in {} ;
diff --git a/src/api/SymbolicEus.gf b/src/api/SymbolicEus.gf
new file mode 100644
index 00000000..69885e2f
--- /dev/null
+++ b/src/api/SymbolicEus.gf
@@ -0,0 +1,5 @@
+--# -path=.:../basque:../common:../abstract:../prelude
+
+resource SymbolicEus = Symbolic with
+ (Symbol = SymbolEus),
+ (Grammar = GrammarEus) ;
diff --git a/src/api/SyntaxEus.gf b/src/api/SyntaxEus.gf
new file mode 100644
index 00000000..fb1af0a2
--- /dev/null
+++ b/src/api/SyntaxEus.gf
@@ -0,0 +1,5 @@
+--# -path=.:alltenses:prelude
+
+instance SyntaxEus of Syntax =
+ ConstructorsEus, CatEus, StructuralEus, CombinatorsEus ;
+
diff --git a/src/api/TryEus.gf b/src/api/TryEus.gf
new file mode 100644
index 00000000..0a0eec2e
--- /dev/null
+++ b/src/api/TryEus.gf
@@ -0,0 +1,3 @@
+--# -path=.:../basque:../common:../abstract:../prelude
+
+resource TryEus = SyntaxEus, LexiconEus, ParadigmsEus - [mkAdv,mkAdN,mkDet,mkQuant,mkPConj] ;
diff --git a/src/basque/AditzTrinkoak.gf b/src/basque/AditzTrinkoak.gf
new file mode 100644
index 00000000..7363973f
--- /dev/null
+++ b/src/basque/AditzTrinkoak.gf
@@ -0,0 +1,592 @@
+resource AditzTrinkoak = open Prelude, Predef, ParamEus in {
+
+-- Synthetic verbs are in this module
+
+-- I have not implemented allocutive forms.
+-- For that I'd have to keep track of up to S whether there is somewhere a familiar 2nd person
+-- (e.g. "I am afraid of you/your mother"; "You(r mother) is nice", "I gave an apple to you(r mother)"),
+-- and that affects the verb form of a main clause, regardless who is subject/object there.
+
+oper
+
+ VForms : Type = { indep : Str ; stem : Str } ;
+
+ noVForm : VForms = { indep = Prelude.nonExist ; stem = Prelude.nonExist } ;
+
+ -- Obs. this is pretty rough heuristic, use 2-argument version for good results
+ mkVForms = overload {
+ mkVForms : Str -> VForms = \du ->
+ let due : Str = case du of {
+ _ + "en" => init du ; -- zen / zen
+ _ + "gu" => du ; -- dugu / dugu+la
+ _ + "u" => du + "e" ; -- du / due+n
+ _ + "z" => du + "e" ; -- naiz / naize+n
+ _ + "un" => du + "a" ; -- dun / duna+la
+ _ + "uk" => init du + "a" ; -- duk / dua+la
+ x + "t" => x + "da" ; -- dut / duda+n
+ _ + "r" => du + "re" ; -- dator / datorre+n
+ -- _ + ("e"|"i"|"o"|"a")
+ -- => du ; -- dio / dio+n
+
+ -- _ => du + "e" }
+ _ => du }
+ in { indep = du ; stem = due } ;
+
+ mkVForms : (_,_ : Str) -> VForms = \dut,duda ->
+ { indep = dut ; stem = duda } ;
+ } ;
+
+ IntransV : Type = Tense => Agr => VForms ; -- Agr = nori or nork
+ TransV : Type = Agr => IntransV ; -- Agr = nor
+ DitransV : Type = Agr => TransV ; -- Agr = nori
+
+------------------------------------------------------------------------------
+
+ syntIntransVerb : AuxType -> IntransV = \val ->
+ case val of {
+ Da Izan => izanDa ;
+ Da Egon => egonDa ;
+ Da Joan => joanDa ;
+ Da Ibili => ibiliDa ;
+ Da Etorri => etorriDa ;
+ _ => Predef.error "Not an intransitive verb"
+ } ;
+
+ syntTransVerb : AuxType -> TransV = \val ->
+ case val of {
+ Du Ukan => ukanDu ;
+ Du Jakin => jakinDu ;
+ Du Eduki => edukiDu ;
+ Zaio => ukanZaio ;
+ _ => Predef.error "Not a transitive verb"
+ } ;
+
+------------------------------------------------------------------------------
+-- General building blocks for the forms of ukan
+-- All thanks to https://upload.wikimedia.org/wikipedia/commons/3/36/Nor_Nori_Nork_taula_osoa.png
+
+ norkUkanFirst : Agr => Str = table { -- Past, pot, cond etc.
+ Ni => "n" ; Gu => "gen" ;
+ Hi _ => "h" ;
+ Zu => "zen" ; Zuek => "zen" ;
+ Hau => "z" ; Hauek => "z" } ;
+
+ norkUkanLast : Agr => Str = table {
+ Ni => "t" ; Gu => "gu" ;
+ Hi Masc => "k" ; Hi Fem => "n" ;
+ Zu => "zu" ; Zuek => "zue" ;
+ Hau => [] ; Hauek => "te" } ;
+
+ norkUkanMid : Agr => Str = table {
+ Hi Masc => "a" ; Hi Fem => "na" ;
+ Ni => "da" ; x => norkUkanLast ! x } ;
+
+ noriUkanLast : Agr => Str = table {
+ Hau => "o" ; x => norkUkanLast ! x } ;
+
+ noriUkanMid : Agr => Str = table {
+ Hau => "o" ; Hauek => "e" ;
+ x => norkUkanMid ! x } ;
+
+ norUkanPres : Agr => Str = table {
+ Ni => "nau" ; Gu => "gaitu" ;
+ Hi _ => "hau" ;
+ Zu => "zaitu" ; Zuek => "zaituzte" ;
+ Hau => "du" ; Hauek => "ditu" } ;
+
+ norUkanNonpres : Agr => Str = table {
+ Ni => "nindu" ; Gu => "gintu" ;
+ Hi _ => "hindu" ;
+ Zu => "zintu" ; Zuek => "zintuzte" ;
+ Hau => nonExist ; Hauek => nonExist } ; -- formed separately
+
+ norUkanCond : Agr => Str = table {
+ Zuek => "zintu" ; x => norUkanNonpres ! x } ;
+
+{-
+ =============================================================================
+ Izan [NOR]
+ =============================================================================
+-}
+
+ -- common copula
+ izanDa : IntransV =
+ table {Past => table {Ni => mkVForms "nintzen" ;
+ Hi _ => mkVForms "hintzen" ;
+ Zu => mkVForms "zinen" ;
+ Hau => mkVForms "zen" ;
+ Gu => mkVForms "ginen" ;
+ Zuek => mkVForms "zineten" ;
+ Hauek => mkVForms "ziren" } ;
+
+ Cond => table {Ni => mkVForms "nintzateke" ;
+ Hi _ => mkVForms "hintzateke" ;
+ Zu => mkVForms "zinateke" ;
+ Hau => mkVForms "litzateke" ;
+ Gu => mkVForms "ginateke" ;
+ Zuek => mkVForms "zinatekete" ;
+ Hauek => mkVForms "lirateke" } ;
+ -- Present and future are identical
+ _ => table {Ni => mkVForms "naiz" ;
+ Hi _ => mkVForms "haiz" ;
+ Zu => mkVForms "zara" "zare" ;
+ Hau => mkVForms "da" "de" ;
+ Gu => mkVForms "gara" "gare" ;
+ Zuek => mkVForms "zarete" ;
+ Hauek => mkVForms "dira" "dire" }
+ } ;
+
+{-
+ =============================================================================
+ Ukan [NOR] [NORK]
+ =============================================================================
+-}
+
+ ukanDu : TransV = \\nor,tns,nork => mkVForms (
+ case tns of {
+ Past =>
+ case nor of { -- Special forms for past when nor is Hau or Hauek
+ Hau => norkPast_norHau ! nork ;
+ Hauek => norkPast_norHauek ! nork ;
+ _ => let nindu : Str = norPast ! nor ;
+ te : Str = norkPast ! nork ;
+ in nindu + te + "n" } ;
+
+ Cond =>
+ case nor of { -- Special forms for conditional when nor is Hau or Hauek
+ Hau => norkCond_norHau ! nork ;
+ Hauek => norkCond_norHauek ! nork ;
+
+ _ => let gintu : Str = norCond ! nor ;
+ z : Str = norCondZ ! nor ;
+ te : Str = norkCond ! nork ;
+ in gintu + z + "ke" + te } ;
+
+ pres => let gaitu : Str = norPres ! nor ;
+ zte : Str = norkPres ! nork ;
+ in gaitu + zte
+
+ }) where {
+
+ norkCond : Agr => Str = \\nork => case of {
+ => "te" + norkUkanLast ! y ; -- zintu z ke te t
+ <_,x> => norkUkanLast ! x } ;
+
+ norkPres : Agr => Str = \\nork => case of {
+ => "zte" ; -- If Nork is Hauek and Nor is plural,
+ => "zte" ; -- the morpheme "te" changes into "zte"
+ => "zte" ;
+ <_,x> => norkUkanLast ! x } ;
+
+ norkPast : Agr => Str = \\nork => case of {
+ => "" ;
+ <_,Hau> => "e" ;
+ => "zte" ;
+ => "zte" ;
+ => "zte" ;
+ <_,x> => norkUkanMid ! x } ;
+
+ norPres : Agr => Str = norUkanPres ;
+
+ norPast : Agr => Str = norUkanNonpres ;
+
+ norCond : Agr => Str = norUkanCond ;
+
+ norCondZ : Agr => Str = table {
+ (Gu|Zu|Zuek) => "z" ; _ => [] } ;
+
+ norkPast_norHau = table { Ni => "nuen" ; Gu => "genuen" ;
+ Hi _ => "huen" ;
+ Zu => "zenuen" ; Zuek => "zenuten" ;
+ Hau => "zuen" ; Hauek => "zuten" } ;
+
+ norkPast_norHauek = table { Ni => "nituen" ; Gu => "genituen" ;
+ Hi _ => "hituen" ;
+ Zu => "zenituen" ; Zuek => "zenituzten" ;
+ Hau => "zituen" ; Hauek => "zituzten" } ;
+
+ norkCond_norHau = table { Hi _ => "hinduke" ; Zuek => "zenukete" ;
+ Hau => "luke" ; Hauek => "lukete" ;
+ x => (tk 2 (norkPast_norHau ! x)) + "ke" } ; -- zu+en -> nu+ke
+
+ norkCond_norHauek = table { Hi _ => "hindukete" ; Zuek => "zenituzkete" ;
+ Hau => "lituzke" ; Hauek => "lituzkete" ;
+ x => (tk 2 (norkPast_norHauek ! x)) + "zke" } --nitu+en -> nitu+zke
+ } ;
+
+
+{-
+ =============================================================================
+ Ukan [NOR] [NORI]
+ =============================================================================
+-}
+
+
+ ukanZaio : TransV = table { --TODO: add all forms
+ -- Nori,Nor
+ Hau => table {
+ Pres => table {
+ Ni => mkVForms "zait" ;
+ Hi Fem => mkVForms "zain" ;
+ Hi Masc => mkVForms "zaik" ;
+ Zu => mkVForms "zaizu" ;
+ Hau => mkVForms "zaio" ;
+ Gu => mkVForms "zaigu" ;
+ Zuek => mkVForms "zaizue" ;
+ Hauek => mkVForms "zaie"
+ } ;
+ _ => \\agr => noVForm
+ } ;
+ Hauek => table {
+ Pres => table {
+ Ni => mkVForms "zaizkit" ;
+ Hi Fem => mkVForms "zaizkin" ;
+ Hi Masc => mkVForms "zaizkik" ;
+ Zu => mkVForms "zaizkizu" ;
+ Hau => mkVForms "zaizkio" ;
+ Gu => mkVForms "zaizkigu" ;
+ Zuek => mkVForms "zaizkizue" ;
+ Hauek => mkVForms "zaizkie"
+ } ;
+ _ => \\agr => noVForm
+ } ;
+ _ => table {
+ tns => table {
+ agr => noVForm
+ }
+ }
+ } where {
+ -- For Nor-Nori inflection, map from Agr to prefix morpheme in Nor position
+ norTableZaio : Agr => Str =
+ table { Ni => "na" ;
+ Hi _ => "ha" ;
+ Gu => "ga" ;
+ Zu => "za" ;
+ Zuek => "za" ;
+ _ => [] --Hau and Hauek
+ }
+ } ;
+
+
+{-
+ =============================================================================
+ Ukan [NOR] [NORI] [NORK]
+ =============================================================================
+-}
+
+ ukanDio : DitransV = -- TODO test properly /IL 2017-07
+ \\nori,nor,tns,nork => mkVForms (
+ case tns of {
+ Cond => "TODO:conditional" ;
+ Past => let zen = norkPast ! nork ;
+ izki = norPast ! getNum nor ;
+ da = noriPast ! nori ;
+ te = norkPastTe ! nork ;
+ in zen + izki + da + te + "n" ;
+
+ _ => let dizki = norPres ! getNum nor ;
+ da = noriPres ! nori ; --form of nori depends on nork
+ zue = norkPres ! nork
+ in dizki + da + zue })
+
+ where {
+ -- Map from Number to prefix morpheme in Nor position.
+ -- Specific to Nor-Nori-Nork, different forms in other auxiliaries.
+ norPres : Number => Str = table { Sg => "di" ;
+ Pl => "dizki" } ;
+ norPast : Number => Str = \\tns => drop 1 (norPres ! tns) ;
+
+ ------
+ -- Map from Agr to morpheme in Nori position.
+
+ noriPres : Agr => Str = \\nori => case of {
+ => "t" ; -- If nork is Hau, then the form ends in "t"
+ <_,x> => noriUkanMid ! x } ;
+
+ noriPast : Agr => Str = noriUkanMid ;
+
+ ------
+ -- Map from Agr to morpheme in Nork position
+ norkPres : Agr => Str = norkUkanLast ;
+
+ norkPast : Agr => Str = norkUkanFirst ;
+
+ norkPastTe : Agr => Str = table {
+ (Zuek|Hauek) => "te" ; _ => [] }
+
+ } ;
+
+{-
+ =============================================================================
+ Egon
+ =============================================================================
+-}
+ -- stative copula, like Spanish estar
+ egonDa : IntransV =
+ table { Past => table {
+ Ni => mkVForms "nengoen" ;
+ Hi _ => mkVForms "hengoen" ;
+ Zu => mkVForms "zeunden" ;
+ Hau => mkVForms "zegoen" ;
+ Gu => mkVForms "geunden" ;
+ Zuek => mkVForms "zeundeten" ;
+ Hauek => mkVForms "zeuden" } ;
+ _ => table {
+ Ni => mkVForms "nago" ;
+ Hi _ => mkVForms "hago" ;
+ Zu => mkVForms "zaude" ;
+ Hau => mkVForms "dago" ;
+ Gu => mkVForms "gaude" ;
+ Zuek => mkVForms "zaudete" ;
+ Hauek => mkVForms "daude" }
+ } ;
+
+
+{-
+ =============================================================================
+ Eduki
+ =============================================================================
+-}
+
+ edukiDu : TransV = table {
+ -- Nor,Nork
+ Ni => table {
+ Pres => table {
+ Gu => noVForm ;
+ Hauek => mkVForms "naukate" ;
+ Ni => noVForm ;
+ Zuek => mkVForms "naukazue" ;
+ Hau => mkVForms "nauka" ;
+ Hi Masc => mkVForms "naukak" ;
+ Hi Fem => mkVForms "naukan" ;
+ Zu => mkVForms "naukazu" } ;
+ tns => \\agr => ukanDu ! Ni ! tns ! agr
+
+ } ;
+ Gu => table {
+ Pres => table { -- Pres
+ Gu => noVForm ;
+ Hauek => mkVForms "gauzkate" ;
+ Ni => noVForm ;
+ Zuek => mkVForms "gauzkazue" ;
+ Hau => mkVForms "gauzka" ;
+ Hi _ => noVForm ;
+ Zu => mkVForms "gauzkazu" } ;
+ tns => \\agr => ukanDu ! Ni ! tns ! agr
+ } ;
+ Hauek => table {
+ Pres => table { -- Pres
+ Gu => mkVForms "dauzkagu" ;
+ Hauek => mkVForms "dauzkate" ;
+ Ni => mkVForms "dauzkat" ;
+ Zuek => mkVForms "dauzkazue" ;
+ Hau => mkVForms "dauzka" ;
+ Hi Masc => mkVForms "dauzkak" ;
+ Hi Fem => mkVForms "dauzkan" ;
+ Zu => mkVForms "dauzkazu" } ;
+ tns => \\agr => ukanDu ! Ni ! tns ! agr
+ } ;
+ Zuek => table {
+ Pres => table {
+ Gu => mkVForms "zauzkategu" ;
+ Hauek => mkVForms "zauzkatete" ;
+ Ni => mkVForms "zauzkatet" ;
+ Zuek => noVForm ;
+ Hau => mkVForms "zauzkate" ;
+ Hi _ => noVForm ;
+ Zu => noVForm } ;
+ tns => \\agr => ukanDu ! Ni ! tns ! agr
+ } ;
+ Hau => table {
+ Pres => table {
+ Gu => mkVForms "daukagu" ;
+ Hauek => mkVForms "daukate" ;
+ Ni => mkVForms "daukat" ;
+ Zuek => mkVForms "daukazue" ;
+ Hau => mkVForms "dauka" ;
+ Hi Masc => mkVForms "daukak" ;
+ Hi Fem => mkVForms "daukan" ;
+ Zu => mkVForms "daukazu" } ;
+ tns => \\agr => ukanDu ! Ni ! tns ! agr
+ } ;
+ Hi _ => table {
+ Pres => table {
+ Gu => mkVForms "haukagu" ;
+ Hauek => mkVForms "haukate" ;
+ Ni => mkVForms "haukat" ;
+ Zuek => noVForm ;
+ Hau => mkVForms "hauka" ;
+ Hi _ => noVForm ;
+ Zu => noVForm } ;
+ tns => \\agr => ukanDu ! Ni ! tns ! agr
+ } ;
+ Zu => table {
+ Pres => table {
+ Gu => mkVForms "zauzkagu" ;
+ Hauek => noVForm ;
+ Ni => mkVForms "zauzkat" ;
+ Zuek => noVForm ;
+ Hau => mkVForms "zauzka" ;
+ Hi _ => noVForm ;
+ Zu => noVForm } ;
+ tns => \\agr => ukanDu ! Ni ! tns ! agr
+ }
+ } ;
+
+{-
+ =============================================================================
+ Etorri
+ =============================================================================
+-}
+
+ etorriDa : IntransV =
+ \\tns,subjAgr =>
+ case of {
+ => mkVForms "nator" ;
+ => mkVForms "hator" ;
+ => mkVForms "zatoz" ;
+ => mkVForms "dator" ;
+ => mkVForms "gatoz" ;
+ => mkVForms "zatozte" ;
+ => mkVForms "datoz" ;
+ _ => izanDa ! tns ! subjAgr
+ } ;
+
+{-
+ =============================================================================
+ Joan
+ =============================================================================
+-}
+ joanDa : IntransV =
+ \\tns,subjAgr =>
+ case of {
+ => mkVForms "noa" ;
+ => mkVForms "hoa" ;
+ => mkVForms "zoaz" ;
+ => mkVForms "doa" ;
+ => mkVForms "goaz" ;
+ => mkVForms "zoazte" ;
+ => mkVForms "doaz" ;
+ => mkVForms "nindoan" ;
+ => mkVForms "hindoan" ;
+ => mkVForms "zindoazen" ;
+ => mkVForms "zihoan" ;
+ => mkVForms "gindoazen" ;
+ => mkVForms "zindoazten" ;
+ => mkVForms "zihoazen" ;
+
+ _ => izanDa ! tns ! subjAgr
+ } ;
+
+
+
+{-
+ =============================================================================
+ Ekarri
+ =============================================================================
+-}
+
+{-
+ =============================================================================
+ Ibili
+ =============================================================================
+-}
+
+
+ ibiliDa : IntransV = --TODO: check forms
+ table {
+ Past => table {
+ Ni => mkVForms "nenbilen" ;
+ Hi _ => mkVForms "henbilen" ;
+ Zu => mkVForms "zenbiltzan" ;
+ Hau => mkVForms "zebilen" ;
+ Gu => mkVForms "genbiltzan" ;
+ Zuek => mkVForms "zenbiltzaten" ;
+ Hauek => mkVForms "zebiltzan" } ;
+
+ -- Present and future are identical
+ Cond => table {
+ Ni => mkVForms "nenbilke" ;
+ Hi _ => mkVForms "henbilke" ;
+ Zu => mkVForms "zenbilzke" ;
+ Hau => mkVForms "lebilke" ;
+ Gu => mkVForms "genbiltzke" ;
+ Zuek => mkVForms "zenbiltzketen" ;
+ Hauek => mkVForms "lebilzke" } ;
+
+ Pres => table {
+ Ni => mkVForms "nabil" ;
+ Hi _ => mkVForms "habil" ;
+ Zu => mkVForms "zabiltza" ;
+ Hau => mkVForms "dabil" ;
+ Gu => mkVForms "gabiltza" ;
+ Zuek => mkVForms "zabiltzate" ;
+ Hauek => mkVForms "dabiltza" } ;
+ Fut => izanDa ! Fut
+ } ;
+
+
+{-
+ =============================================================================
+ Jakin
+ =============================================================================
+-}
+ jakinDu : TransV =
+ \\dobjAgr,tns,subjAgr =>
+ case of {
+ => mkVForms "dakit" ;
+ => mkVForms "dakizu" ;
+ => mkVForms "daki" ;
+ => mkVForms "dakigu" ;
+ => mkVForms "dakizue" ;
+ => mkVForms "dakite" ;
+
+ => mkVForms "nekien" ;
+ => mkVForms "zenekien" ;
+ => mkVForms "zekien" ;
+ => mkVForms "genekien" ;
+ => mkVForms "zenekiten" ;
+ => mkVForms "zekiten" ;
+
+ _ => ukanDu ! dobjAgr ! tns ! subjAgr
+ } ;
+
+
+
+{-
+ =============================================================================
+ Ibili
+ =============================================================================
+-}
+
+{-
+ =============================================================================
+ Eman
+ =============================================================================
+-}
+
+{-
+ =============================================================================
+ Esan
+ =============================================================================
+-}
+
+{-
+ =============================================================================
+ Ikusi
+ =============================================================================
+-}
+
+{-
+ =============================================================================
+ Erabili
+ =============================================================================
+-}
+
+{-
+ =============================================================================
+ Egin
+ =============================================================================
+-}
+
+}
\ No newline at end of file
diff --git a/src/basque/AdjectiveEus.gf b/src/basque/AdjectiveEus.gf
new file mode 100644
index 00000000..cf374e59
--- /dev/null
+++ b/src/basque/AdjectiveEus.gf
@@ -0,0 +1,71 @@
+concrete AdjectiveEus of Adjective = CatEus ** open ResEus, Prelude in {
+
+ flags optimize=all_subs ;
+
+ lin
+-- The principal ways of forming an adjectival phrase are
+-- positive, comparative, relational, reflexive-relational, and
+-- elliptic-relational.
+
+ -- : A -> AP ;
+ PositA a = a ** {
+ s = a.s ! AF Posit ;
+ typ = Bare } ;
+
+ -- : A -> NP -> AP ; -- euskara ingelesa baino errazagoa da.
+ ComparA a np = a ** {
+ s = np.s ! Abs ++ "baino" ++ a.s ! AF Compar ;
+ typ = Bare } ;
+
+ -- : A2 -> NP -> AP ; -- married to her
+ ComplA2 a2 np = a2 ** {
+ s = applyPost a2.compl np ++ a2.s ! AF Posit ;
+ typ = Bare } ;
+
+ -- : A2 -> AP ; -- married to itself
+ ReflA2 a2 = a2 ** {
+ s = applyPost a2.compl buru_NP ++ a2.s ! AF Posit ;
+ typ = Bare } ;
+
+ -- : A2 -> AP ; -- married
+ UseA2 = PositA ;
+
+ -- : A -> AP ; -- warmer
+ UseComparA a = a ** {
+ s = a.s ! AF Compar ;
+ typ = Bare } ;
+
+
+ -- : CAdv -> AP -> NP -> AP ; -- as cool as John
+ CAdvAP adv ap np = ap ** {
+ s = np.s ! Abs ++ adv.s ++ ap.s } ;
+
+-- The superlative use is covered in $Ord$.
+
+ -- : Ord -> AP ; -- warmest
+ AdjOrd ord = ord ** {
+ ph = FinalCons ; --always ends in -en
+ typ = Bare } ;
+
+-- Sentence and question complements defined for all adjectival
+-- phrases, although the semantics is only clear for some adjectives.
+
+ -- : AP -> SC -> AP ; -- good that she is here
+ SentAP ap sc = ap ; --TODO
+
+-- An adjectival phrase can be modified by an *adadjective*, such as "very".
+
+ -- : AdA -> AP -> AP ;
+ AdAP ada ap = ap ** {
+ s = ada.s ++ ap.s ;
+ typ = Bare } ;
+
+
+-- It can also be postmodified by an adverb, typically a prepositional phrase.
+
+-- : AP -> Adv -> AP ; -- warm by nature
+ AdvAP ap adv = ap ; --TODO
+
+
+
+}
diff --git a/src/basque/AdverbEus.gf b/src/basque/AdverbEus.gf
new file mode 100644
index 00000000..b2890a42
--- /dev/null
+++ b/src/basque/AdverbEus.gf
@@ -0,0 +1,43 @@
+concrete AdverbEus of Adverb = CatEus ** open ResEus, Prelude in {
+
+lin
+
+ -- : A -> Adv ;
+ PositAdvAdj adj = { s = adj.s ! AAdv } ; --TODO: check
+
+ -- : CAdv -> A -> NP -> Adv ; -- more warmly than John
+ ComparAdvAdj cadv a np = { s = np.s ! Abs ++ cadv.s ++ a.s ! AAdv } ;
+
+-- ComparAdvAdjS : CAdv -> A -> S -> Adv ; -- more warmly than he runs
+
+ -- : Prep -> NP -> Adv ;
+ PrepNP post np = { s = ResEus.applyPost post np } ;
+
+-- Adverbs can be modified by 'adadjectives', just like adjectives.
+
+ --AdAdv : AdA -> Adv -> Adv ; -- very quickly
+ AdAdv ada adv = { s = ada.s ++ adv.s } ;
+-- Like adverbs, adadjectives can be produced by adjectives.
+
+ -- : A -> AdA ; -- extremely
+ PositAdAAdj a = { s = a.s ! AF Posit ++ BIND ++ "an" } ; --TODO check
+-- Subordinate clauses can function as adverbs.
+
+ --: Subj -> S -> Adv ;
+ SubjS subj s =
+ let auxFull : Str =
+ if_then_Str subj.isPre (glue subj.s s.s.aux.indep) -- badator
+ (glue s.s.aux.stem subj.s) ; -- datorrenean
+
+ in { s = s.s.beforeAux ++ auxFull ++ s.s.afterAux } ;
+
+-- Comparison adverbs also work as numeral adverbs.
+
+ --AdnCAdv : CAdv -> AdN ; -- less (than five)
+ --AdnCAdv cadv = {s = } ;
+} ;
+
+{-
+gt PrepNP in_Prep (DetCN (DetQuant DefArt ?) (UseN ?) | l -bind
+gt PrepNP from_Prep (DetCN (DetQuant DefArt ?) (UseN ?)) | l -bind
+-}
\ No newline at end of file
diff --git a/src/basque/AllEus.gf b/src/basque/AllEus.gf
new file mode 100644
index 00000000..6abae700
--- /dev/null
+++ b/src/basque/AllEus.gf
@@ -0,0 +1,6 @@
+--# -path=.:../abstract:../common:../prelude
+
+concrete AllEus of AllEusAbs =
+ LangEus,
+ ExtraEus
+ ** {} ;
diff --git a/src/basque/AllEusAbs.gf b/src/basque/AllEusAbs.gf
new file mode 100644
index 00000000..5d199065
--- /dev/null
+++ b/src/basque/AllEusAbs.gf
@@ -0,0 +1,6 @@
+--# -path=.:../abstract:../common:prelude
+
+abstract AllEusAbs =
+ Lang,
+ ExtraEusAbs
+ ** {} ;
diff --git a/src/basque/CatEus.gf b/src/basque/CatEus.gf
new file mode 100644
index 00000000..7ef71011
--- /dev/null
+++ b/src/basque/CatEus.gf
@@ -0,0 +1,131 @@
+concrete CatEus of Cat = CommonX ** open ResEus, Prelude in {
+
+ flags optimize=all_subs ;
+
+ lincat
+
+--2 Sentences and clauses
+-- Constructed in SentenceEus, and also in IdiomEus
+
+ S = { s : ResEus.Sentence } ; --must keep words separate, because we may add Subj particles for Adv
+ QS = { s : ClType => ResEus.Sentence } ;
+ RS = { s : Agr => Str }; -- relative sentence. Tense and polarity fixed,
+ -- but agreement may depend on the CN/NP it modifies:
+ -- `gorriak diren txakurrak' vs. `gorria den txakurra'
+ -- mutil|ak| maite |du|en neska / mutil|ak| maite |ditu|en nesk|ak|
+ -- mutil|ek| maite |dute|n nesk|a| / mutil|ek| maite |ditute|n nesk|ak|
+ -- neska maite duen mutila / neskak maite dituen mutila / neska maite duten mutilak / neskak maite dituten mutilak
+
+ Cl = ResEus.Clause ;
+ ClSlash = ResEus.ClSlash ;
+ SSlash = { s : ResEus.Sentence } ; -- sentence missing NP e.g. "she has looked at"
+ Imp = { s : Str } ; -- imperative e.g. "look at this"
+
+--2 Questions and interrogatives
+
+-- Constructed in QuestionEus.
+
+ QCl = ResEus.Clause ;
+ IP = ResEus.NounPhrase ;
+ IComp = { s : Str } ; -- interrogative complement of copula e.g. "where"
+ IDet = ResEus.Determiner ; -- interrogative determiner e.g. "how many"
+ IQuant = ResEus.Quant ; -- interrogative quantifier e.g. "which"
+
+
+
+
+--2 Relative clauses and pronouns
+
+-- Constructed in RelativeEus.
+
+ RCl = ResEus.RClause ;
+ RP = { s : Str } ;
+
+
+
+--2 Verb phrases
+
+-- Constructed in VerbEus.
+
+ VP = ResEus.VerbPhrase ;
+ VPSlash = ResEus.VPSlash ;
+ Comp = ResEus.Complement ;
+
+
+--2 Adjectival phrases
+
+-- Constructed in AdjectiveEus.
+
+ AP = ResEus.AdjPhrase ;
+
+
+--2 Nouns and noun phrases
+
+-- Constructed in NounEus.
+-- Many atomic noun phrases e.g. "everybody"
+-- are constructed in StructuralEus.
+-- The determiner structure is
+-- ``` Predet (QuantSg | QuantPl Num) Ord
+-- as defined in NounEus.
+
+ CN = ResEus.CNoun ;
+ NP = ResEus.NounPhrase ;
+ Pron = ResEus.Pronoun ; --Pronouns need enough info to turn it into NP or Quant.
+ Det = ResEus.Determiner ;
+ Predet = {s : Str} ;
+ Quant = ResEus.Quant ;
+ Num = { s : Str ; n : Number ; isNum : Bool } ;
+ Card, Ord = { s : Str ; n : Number } ;
+ DAP = ResEus.Determiner ;
+
+
+--2 Numerals
+
+-- Constructed in NumeralEus.
+
+ Numeral = { s : Str ; n : Number } ;
+ Digits = { s : CardOrd => Str ; n : Number } ;
+
+
+
+--2 Structural words
+
+-- Constructed in StructuralEus.
+ Conj = { s1,s2 : Str ; nbr : Number } ; --Ni eta Inari gara/*naiz ; Fran edo Mikel da/*dira
+ Subj = { s : Str ; isPre : Bool } ; --ba+dut vs. dut+en
+ Prep = ResEus.Postposizio ;
+
+
+
+--2 Words of open classes
+
+-- These are constructed in LexiconEus and in
+-- additional lexicon modules.
+
+ V,
+ V2,
+ V3,
+ VV, -- verb-phrase-complement verb e.g. "want"
+ VS, -- sentence-complement verb e.g. "claim"
+ VQ, -- question-complement verb e.g. "wonder"
+ VA, -- adjective-complement verb e.g. "look"
+ V2V, -- verb with NP and V complement e.g. "cause"
+ V2S, -- verb with NP and S complement e.g. "tell"
+ V2Q, -- verb with NP and Q complement e.g. "ask"
+ V2A = ResEus.Verb ; -- verb with NP and AP complement e.g. "paint"
+
+ A = ResEus.Adjective ;
+ A2 = ResEus.Adjective2 ;
+
+ N = ResEus.Noun ;
+ N2 = ResEus.Noun2 ;
+ N3 = ResEus.Noun3 ;
+ PN = ResEus.PNoun ;
+
+
+linref
+ S = \s -> linS s.s ;
+ Cl = linCl ;
+ VP = linVP ;
+ CN = linCNIndef ;
+}
diff --git a/src/basque/ConjunctionEus.gf b/src/basque/ConjunctionEus.gf
new file mode 100644
index 00000000..a060aa64
--- /dev/null
+++ b/src/basque/ConjunctionEus.gf
@@ -0,0 +1,147 @@
+concrete ConjunctionEus of Conjunction =
+ CatEus ** open ResEus, Coordination, Prelude in {
+
+ flags optimize=all_subs ;
+
+ {- Conjunction for category X needs four things:
+ lincat [X]
+ lin BaseX
+ lin ConsX
+ lin ConjX
+
+ For example, if X is defined as
+
+ lincat X = {s : Number => Str ; g : Gender} ;
+
+ then [X] will split its s field into two, and retain its other fields as is:
+
+ lincat [X] = {s1,s2 : Number => Str ; g : Gender} ;
+
+ Let us look at a simple case: Adv is of type {s : Str}
+ Then [Adv] is {s1,s2 : Str}.
+ BaseAdv, ConsAdv and ConjAdv can all use functions defined in prelude/Coordination:
+
+ BaseAdv = twoSS ;
+ ConsAdv = consrSS comma ;
+ ConjAdv = conjunctSS ;
+
+ --}
+
+
+-- Adverb and other simple {s : Str} types.
+lincat
+ [Adv],[AdV],[IAdv] = {s1,s2 : Str} ;
+
+lin
+ BaseAdv, BaseAdV, BaseIAdv = twoSS ;
+ ConsAdv, ConsAdV, ConsIAdv = consrSS comma ;
+ ConjAdv, ConjAdV, ConjIAdv = conjunctDistrSS ;
+
+
+-- RS depends on agreement, otherwise exactly like previous.
+lincat
+ [RS] = {s1,s2 : Agr => Str } ;
+
+lin
+ BaseRS x y = twoTable Agr x y ;
+ ConsRS xs x = consrTable Agr comma xs x ;
+ ConjRS co xs = conjunctDistrTable Agr co xs ;
+
+-- S has three building blocks; we keep only the last one's aux open,
+-- and choose the independent form to all the rest.
+-- Produces ungrammatical results for adverbial usage of conj sentences, e.g.
+-- "when [the dog runs and you sleep], I drink beer"
+lincat
+ [S] = { s : Sentence } ** { firstSent : Str } ;
+
+lin
+ BaseS x y =
+ y ** { firstSent = linS x.s } ;
+
+ ConsS x xs =
+ xs ** { firstSent = linS x.s ++ "," ++ xs.firstSent } ;
+
+ -- Combine the finished sentences all into the beforeAux part of the S
+ ConjS co xs =
+ { s = xs.s ** {beforeAux = co.s1 ++ xs.firstSent ++ co.s2 ++ xs.s.beforeAux} } ;
+
+
+
+
+-- APs and CNs. FIXME: crude first attempt, doesn't work properly.
+-- ConjCN gives `*nesk edo neskek'
+lincat
+ [AP] = {s1,s2 : Str ; ph : Phono ; typ : APType } ;
+
+lin
+ BaseAP x y = twoSS x y ** y ; --choose all the other fields from second argument
+ ConsAP as a = consrSS comma as a ** as ;
+ ConjAP co as = conjunctDistrSS co as ** as ;
+
+lincat
+ [CN] = { s1,s2 : Agr => Str } ** CNLight ;
+
+lin
+ BaseCN = baseCN ; -- phono=FinalA words work correctly now!
+ ConsCN = consCN ;
+ ConjCN co cs = conjunctDistrTable Agr co cs ** cs ;
+
+oper
+ CNLight : Type = { heavyMod : Agr => Str ; comp : Str ; ph : Phono ; anim : Bizi } ;
+
+ -- Use linCNIndef so that words with FinalA get the -a at the end
+ baseCN : CN -> CN -> [CN] = \x,y ->
+ y ** --choose all the other fields from second argument
+ { s1 = \\agr => linCNIndef x ;
+ s2 = y.s } ;
+
+ consCN : CN -> [CN] -> [CN] = \x,xs ->
+ xs ** --choose all the other fields from the list
+ { s1 = \\agr => linCNIndef x ++ SOFT_BIND
+ ++ comma ++ xs.s1 ! agr } ;
+
+
+lincat
+ [DAP] = Determiner ** { pref2 : Str } ;
+
+lin
+ BaseDAP x y = x ** { pref2 = y.pref } ;
+ ConsDAP xs x = xs ** { pref2 = x.pref } ;
+ ConjDet conj xs = xs ** { pref = conj.s1 ++ xs.pref ++ conj.s2 ++ xs.pref2 } ;
+ -- his or some car: haren edo zenbait auto &+ a
+ -- TODO: "the or some car"
+
+
+-- Noun phrases. Should work better now.
+lincat
+ [NP] = { s1,s2 : Case => Str } ** NPLight ;
+
+lin
+ BaseNP x y = twoTable Case x y ** consNP x y ;
+ ConsNP xs x = consrTable Case comma xs x ** consNP xs x ;
+ ConjNP conj xs = conjunctNPTable conj xs ** conjNP xs conj ;
+
+oper
+
+ --NP without the s field; just to avoid copypaste and make things easier to change
+ NPLight : Type = { stem : Str ; agr : Agr ; anim : Bizi ; isDef : Bool } ;
+
+ consNP : NPLight -> NPLight -> NPLight = \x,y ->
+ x ** { agr = conjAgr x.agr (getNum y.agr) } ;
+
+ conjNP : NPLight -> Conj -> NPLight = \xs,conj ->
+ xs ** { agr = conjAgr xs.agr conj.nbr } ;
+
+ -- Like conjunctTable from prelude/Coordination.gf,
+ -- but forces the first argument into absolutive.
+ conjunctNPTable : Conj -> ListTable Case -> {s : Case => Str} = \co,xs ->
+ { s = table { Erg => co.s1 ++ xs.s1 ! Erg ++ co.s2 ++ xs.s2 ! Erg ;
+ cas => co.s1 ++ xs.s1 ! Abs ++ co.s2 ++ xs.s2 ! cas } } ;
+
+ conjAgr : Agr -> Number -> Agr = \a,n ->
+ case n of { Pl => plAgr a ; _ => a } ;
+
+ conjNbr : Number -> Number -> Number = \n,m ->
+ case n of { Pl => Pl ; _ => m } ;
+
+}
\ No newline at end of file
diff --git a/src/basque/ConstructionEus.gf b/src/basque/ConstructionEus.gf
new file mode 100644
index 00000000..4fc5d819
--- /dev/null
+++ b/src/basque/ConstructionEus.gf
@@ -0,0 +1,119 @@
+concrete ConstructionEus of Construction = CatEus ** open ParadigmsEus in {
+
+lincat
+ Timeunit = N ;
+ Weekday = N ;
+ Monthday = NP ;
+ Month = N ;
+ Year = NP ;
+{-
+lin
+
+ timeunitAdv n time =
+ let n_card : Card = n ;
+ n_hours_NP : NP = mkNP n_card time ;
+ in SyntaxEus.mkAdv for_Prep n_hours_NP | mkAdv (n_hours_NP.s ! R.npNom) ;
+
+ weekdayPunctualAdv w = ; -- on Sunday
+ weekdayHabitualAdv w = ; -- on Sundays
+ weekdayNextAdv w = -- next Sunday
+ weekdayLastAdv w = -- last Sunday
+
+ monthAdv m = mkAdv in_Prep (mkNP m) ;
+ yearAdv y = mkAdv in_Prep y ;
+ dayMonthAdv d m = ; -- on 17 May
+ monthYearAdv m y = ; -- in May 2012
+ dayMonthYearAdv d m y = ; -- on 17 May 2013
+
+ intYear = symb ;
+ intMonthday = symb ;
+
+lincat Language = N ;
+
+lin InLanguage l = mkAdv ???_Prep (mkNP l) ;
+
+lin
+ weekdayN w = w ;
+ monthN m = m ;
+
+ weekdayPN w = mkPN w ;
+ monthPN m = mkPN m ;
+
+ languageCN l = mkCN l ;
+ languageNP l = mkNP l ;
+
+
+oper mkLanguage : Str -> N = \s -> mkN s ;
+
+----------------------------------------------
+---- lexicon of special names
+
+lin second_Timeunit = mkN "second" ;
+lin minute_Timeunit = mkN "minute" ;
+lin hour_Timeunit = mkN "hour" ;
+lin day_Timeunit = mkN "day" ;
+lin week_Timeunit = mkN "week" ;
+lin month_Timeunit = mkN "month" ;
+lin year_Timeunit = mkN "year" ;
+
+lin monday_Weekday = mkN "Monday" ;
+lin tuesday_Weekday = mkN "Tuesday" ;
+lin wednesday_Weekday = mkN "Wednesday" ;
+lin thursday_Weekday = mkN "Thursday" ;
+lin friday_Weekday = mkN "Friday" ;
+lin saturday_Weekday = mkN "Saturday" ;
+lin sunday_Weekday = mkN "Sunday" ;
+
+lin january_Month = mkN "January" ;
+lin february_Month = mkN "February" ;
+lin march_Month = mkN "March" ;
+lin april_Month = mkN "April" ;
+lin may_Month = mkN "May" ;
+lin june_Month = mkN "June" ;
+lin july_Month = mkN "July" ;
+lin august_Month = mkN "August" ;
+lin september_Month = mkN "September" ;
+lin october_Month = mkN "October" ;
+lin november_Month = mkN "November" ;
+lin december_Month = mkN "December" ;
+
+lin afrikaans_Language = mkLanguage "Afrikaans" ;
+lin amharic_Language = mkLanguage "Amharic" ;
+lin arabic_Language = mkLanguage "Arabic" ;
+lin bulgarian_Language = mkLanguage "Bulgarian" ;
+lin catalan_Language = mkLanguage "Catalan" ;
+lin chinese_Language = mkLanguage "Chinese" ;
+lin danish_Language = mkLanguage "Danish" ;
+lin dutch_Language = mkLanguage "Dutch" ;
+lin english_Language = mkLanguage "Euslish" ;
+lin estonian_Language = mkLanguage "Estonian" ;
+lin finnish_Language = mkLanguage "Finnish" ;
+lin french_Language = mkLanguage "French" ;
+lin german_Language = mkLanguage "German" ;
+lin greek_Language = mkLanguage "Greek" ;
+lin hebrew_Language = mkLanguage "Hebrew" ;
+lin hindi_Language = mkLanguage "Hindi" ;
+lin japanese_Language = mkLanguage "Japanese" ;
+lin italian_Language = mkLanguage "Italian" ;
+lin latin_Language = mkLanguage "Latin" ;
+lin latvian_Language = mkLanguage "Latvian" ;
+lin maltese_Language = mkLanguage "Maltese" ;
+lin nepali_Language = mkLanguage "Nepali" ;
+lin norwegian_Language = mkLanguage "Norwegian" ;
+lin persian_Language = mkLanguage "Persian" ;
+lin polish_Language = mkLanguage "Polish" ;
+lin punjabi_Language = mkLanguage "Punjabi" ;
+lin romanian_Language = mkLanguage "Romanian" ;
+lin russian_Language = mkLanguage "Russian" ;
+lin sindhi_Language = mkLanguage "Sindhi" ;
+lin spanish_Language = mkLanguage "Spanish" ;
+lin swahili_Language = mkLanguage "Swahili" ;
+lin swedish_Language = mkLanguage "Swedish" ;
+lin thai_Language = mkLanguage "Thai" ;
+lin turkish_Language = mkLanguage "Turkish" ;
+lin urdu_Language = mkLanguage "Urdu" ;
+
+—}
+}
+-}
+}
diff --git a/src/basque/ExtraEus.gf b/src/basque/ExtraEus.gf
new file mode 100644
index 00000000..231ebfd6
--- /dev/null
+++ b/src/basque/ExtraEus.gf
@@ -0,0 +1,35 @@
+concrete ExtraEus of ExtraEusAbs = CatEus ** open ResEus, AdjectiveEus, Prelude, ParadigmsEus in {
+
+flags coding = utf8 ;
+
+lincat
+
+ Attr = { s : Str } ;
+
+
+oper
+
+ mkAttr : Str -> Attr = \s -> lin Attr { s = s } ;
+
+--lin
+
+-- ko_Attr = mkAttr "ko" ;
+
+{-
+ Tokiorako bidaia bat 'a journey to Tokyo' [Tokyo-to-ko journey one]
+
+-}
+
+-- AdnP : Adv -> Attr -> AP ; -- Bilbo ra ko
+
+-- AdnP adv attr = {
+-- s = adv.s ++ BIND ++ attr.s ;
+-- stem = adv.s ++ BIND ++ attr.s ;
+-- ph = FinalVow ;
+-- typ = Ko
+-- } ;
+
+
+
+
+} ;
diff --git a/src/basque/ExtraEusAbs.gf b/src/basque/ExtraEusAbs.gf
new file mode 100644
index 00000000..05c97fa1
--- /dev/null
+++ b/src/basque/ExtraEusAbs.gf
@@ -0,0 +1,19 @@
+abstract ExtraEusAbs = Extra ** {
+
+cat
+
+ Attr ; -- morpheme to turn an phrase into an adnominal/attributive
+fun
+
+ ko_Attr : Attr ;
+
+ -- AdnP = Adnominal phrase
+
+ AdnP : Adv -> Attr -> AP ;
+
+-- ProDrop : Pron -> Pron ;
+
+-- or to drop pronouns by default and have explicit pronouns in Extra?
+-- ExplicitPron : Clause -> Clause ;
+
+} ;
diff --git a/src/basque/GrammarEus.gf b/src/basque/GrammarEus.gf
new file mode 100644
index 00000000..f17f4370
--- /dev/null
+++ b/src/basque/GrammarEus.gf
@@ -0,0 +1,20 @@
+concrete GrammarEus of Grammar =
+ NounEus,
+ VerbEus,
+ AdjectiveEus,
+ AdverbEus,
+ NumeralEus,
+ SentenceEus,
+ QuestionEus,
+ RelativeEus,
+ ConjunctionEus,
+ PhraseEus,
+ TextX,
+ StructuralEus,
+ IdiomEus,
+ TenseX
+ ** {
+
+flags startcat = Phr ; unlexer = text ; lexer = text ;
+
+} ;
diff --git a/src/basque/IdiomEus.gf b/src/basque/IdiomEus.gf
new file mode 100644
index 00000000..f9cac2da
--- /dev/null
+++ b/src/basque/IdiomEus.gf
@@ -0,0 +1,41 @@
+
+--1 Idiom: Idiomatic Expressions
+
+concrete IdiomEus of Idiom = CatEus ** open Prelude, ResEus in {
+
+-- This module defines constructions that are formed in fixed ways,
+-- often different even in closely related languages.
+
+ lin
+{-
+ ImpersCl : VP -> Cl ; -- it is hot
+ GenericCl : VP -> Cl ; -- one sleeps
+
+ CleftNP : NP -> RS -> Cl ; -- it is I who did it
+ CleftAdv : Adv -> S -> Cl ; -- it is here she slept
+
+ ExistNP : NP -> Cl ; -- there is a house
+ ExistIP : IP -> QCl ; -- which houses are there
+
+-- 7/12/2012 generalizations of these
+
+ ExistNPAdv : NP -> Adv -> Cl ; -- there is a house in Paris
+ ExistIPAdv : IP -> Adv -> QCl ; -- which houses are there in Paris
+-}
+ -- : VP -> VP ; -- garbitzen ari ziren
+ ProgrVP vp = vp ** { prc = \\tns => vp.prc ! Pres ++ "ari" } ;
+
+ -- : VP -> Utt ; -- let's go
+ ImpPl1 vp = { s = linVPPrc vp } ;
+{-
+
+ ImpP3 : NP -> VP -> Utt ; -- let John walk
+
+-- 3/12/2013 non-reflexive uses of "self"
+
+ SelfAdvVP : VP -> VP ; -- is at home himself
+ SelfAdVVP : VP -> VP ; -- is himself at home
+ SelfNP : NP -> NP ; -- the president himself (is at home)
+-}
+
+}
diff --git a/src/basque/LangEus.gf b/src/basque/LangEus.gf
new file mode 100644
index 00000000..e0c69f69
--- /dev/null
+++ b/src/basque/LangEus.gf
@@ -0,0 +1,8 @@
+concrete LangEus of Lang =
+ GrammarEus,
+ LexiconEus,
+ ConstructionEus
+
+ ** {
+
+} ;
\ No newline at end of file
diff --git a/src/basque/LexiconEus.gf b/src/basque/LexiconEus.gf
new file mode 100644
index 00000000..ba534ea2
--- /dev/null
+++ b/src/basque/LexiconEus.gf
@@ -0,0 +1,436 @@
+concrete LexiconEus of Lexicon = CatEus **
+ open ParadigmsEus, Prelude, (R=ResEus) in {
+
+----
+-- A
+
+lin add_V3 = mkV3 "gehitu" ; -- | mkV3 "erantsi" | mkV3 "gaineratu" ; --Apertium
+lin airplane_N = mkN "hegazkin" ;
+--lin alas_Interj = mkInterj "" ;
+lin already_Adv = mkAdv "dagoeneko" ; --Google translate
+lin animal_N = mkN "animalia" ;
+lin answer_V2S = mkV2S "erantzun" ;
+lin apartment_N = mkN "pisu" ; -- | mkN "apartamentu" ; --Apertium
+lin apple_N = mkN "sagar" ;
+lin art_N = mkN "arte" ;
+--lin ashes_N = mkN
+lin ask_V2Q = mkV2Q "galdetu" ;
+
+----
+-- B
+
+lin baby_N = mkN "haur" ; -- | mkN "ume" | mkN "kreatura" ; --Apertium
+lin back_N = mkN "bizkar" ;
+lin bad_A = mkA "txar" ;
+lin bank_N = mkN "banku" ; --| mkN "erribera" | mkN "ertz" ; --Apertium
+lin bark_N = mkN "azal" ; --Apertium
+lin beautiful_A = mkA "polit" ;
+lin become_VA = mkVA "bihurtu" ;
+lin beer_N = mkN "garagardo" ;
+lin beg_V2V = mkV2V "eskatu" ;
+lin belly_N = mkN "urdail" ; --| mkN "sabel" ; --Apertium
+lin big_A = mkA "handi" ;
+lin bike_N = mkN "bizikleta" ;
+lin bird_N = mkN "txori" ; -- | mkN "hegazti" ; --Apertium
+lin bite_V2 = mkV2 "ausiki" ; -- mkV2 (mkV "kosk" egin_V) --Apertium
+lin black_A = mkA "beltz" ;
+lin blood_N = mkN "odol" ;
+lin blow_V = mkV "putz" egin_V ;
+lin blue_A = mkA "urdin" ;
+lin boat_N = mkN "itsasontzi" ;
+lin bone_N = mkN "hezur" ; --Apertium
+lin boot_N = mkN "bota" ; --Apertium
+lin boss_N = mkN "nagusi" ; --Apertium
+lin book_N = mkN "liburu" ;
+lin boy_N = mkN "mutil" ;
+lin bread_N = mkN "ogi" ; --Apertium
+lin break_V2 = mkV2 "izorratu" ; --Apertium
+lin breast_N = mkN "bular" ; --Apertium
+lin breathe_V = mkV "arnastu" ; --Apertium
+lin broad_A = mkA "zabal" ; --Apertium
+lin brother_N2 = mkN2 "anaia" ;
+lin brown_A = mkA "marroi" ; --Apertium
+lin burn_V = mkV "erre" ; -- | mkV "kiskali" ; --Apertium
+lin butter_N = mkN "gurin" ; --Apertium
+lin buy_V2 = mkV2 "erosi" ;
+
+----
+-- C
+
+lin camera_N = mkN "kamera" ; -- | mkN "ganbera" ; --Apertium
+lin cap_N = mkN "txapel" ; -- | mkN "tapoi" ; --Apertium
+lin car_N = mkN "auto" ; --| mkN "automobil" ; --Apertium
+lin carpet_N = mkN "alfonbra" ; --Apertium
+lin cat_N = mkN "katu" ;
+lin ceiling_N = mkN "sabai" ; --Apertium
+lin chair_N = mkN "aulki" ; --Apertium
+lin cheese_N = mkN "gazta" ; --Apertium
+lin child_N = mkN "ume" ; --| mkN "umetxo" ; --Apertium
+lin church_N = mkN "eliza" ; --Apertium
+lin city_N = mkN "hiri" ; --Apertium
+lin clean_A = mkA "garbi" ; --Apertium
+lin clever_A = mkA "azkar" ; --Apertium
+lin close_V2 = mkV2 "gerturatu" ; -- | mkV2 "itxi" | mkV2 "zarratu" ; --Apertium
+lin cloud_N = mkN "hodei" ; --Apertium
+lin coat_N = mkN "beroki" ; -- | mkN "kapa" ; --Apertium
+lin cold_A = mkA "hotz" ;
+lin come_V = etorri_V ;
+lin computer_N = mkN "ordenagailu" ; --| mkN "ordenatzaile" ; --Apertium
+lin correct_A = mkA "zuzen" ; --Apertium
+lin count_V2 = mkV2 "kontatu" ; -- | mkV2 "zenbatu" ; --Apertium
+lin country_N = mkN "herri" ; --Apertium
+lin cousin_N = mkN "lehengusu" ; --Apertium
+lin cow_N = mkN "behi" ; --Apertium
+lin cut_V2 = mkV2 "ebaki" ; -- | mkV2 "moztu" ; --Apertium
+
+----
+-- D
+
+lin day_N = mkN "egun" ; --Apertium
+lin die_V = izanV "hil" ; -- | mkV "zendu" ; --Apertium
+lin dig_V = mkV "zulatu" ; --Apertium
+lin dirty_A = mkA "likits" ; --| mkA "zikin" ; --Apertium
+-- lin distance_N3 = mkN3 (mkN "distantzia") fromP toP ; --Apertium
+lin do_V2 = lin V2 egin_V ;
+lin doctor_N = mkN "mediku" ; --| mkN "doktore" ; --Apertium
+lin dog_N = mkN "txakur" ;
+lin door_N = mkN "ate" ;
+lin drink_V2 = mkV2 "edan" ;
+lin dry_A = mkA "lehor" ; --Apertium
+lin dull_A = mkA "aspergarri" ; --Apertium
+lin dust_N = mkN "hauts" ; --Apertium
+
+----
+-- E
+
+lin ear_N = mkN "belarri" ; --Apertium
+lin earth_N = mkN "lur" ; --Apertium
+lin eat_V2 = mkV2 "jan" ; -- | mkV2 "bazkaldu" ; --Apertium
+lin egg_N = mkN "arrautza" ; --Apertium
+lin empty_A = mkA "huts" ; --| mkA "bakarti" ; --Apertium
+lin enemy_N = mkN "etsai" ; --| mkN "arerio" ; --Apertium
+lin eye_N = mkN "begi" ;
+
+----
+-- F
+
+lin factory_N = mkN "fabrika" ; --| mkN "lantegi" ; --Apertium
+lin fall_V = mkV "amildu" ; -- | mkV "erori" ; --Apertium
+lin far_Adv = mkAdv "urrun" ;
+lin fat_N = mkN "gantz" ; --| mkN "koipe" ; --Apertium
+lin father_N2 = mkN2 "aita" ; --genitive
+lin fear_V2 = ukanV "beldur" ; -- beldur nauzu `you are afraid of me'
+lin fear_VS = izanV "beldur" ; -- beldur naiz [ez datorrela] `I'm afraid s/he won't come'
+lin feather_N = mkN "luma" ; --Apertium
+lin fight_V2 = mkV2 "borrokatu" ; --Apertium
+lin find_V2 = mkV2 "aurkitu" ; -- | mkV2 "topatu" ; --Apertium
+lin fingernail_N = mkN "azazkal" ; --Apertium
+lin fire_N = mkN "su" ; --Apertium
+lin fish_N = mkN "arrain" ; --Apertium
+lin float_V = mkV "flotatu" ; --Apertium
+lin floor_N = mkN "lurzoru" ; -- | mkN "solairu" ; --Apertium
+lin flow_V = mkV "jariatu" ; --Apertium
+lin flower_N = mkN "lore" ; --Apertium
+lin fly_V = mkV "hegan" egin_V ; -- | mkV "pilotatu" ; --Apertium
+lin fog_N = mkN "laino" ; --Apertium
+lin foot_N = mkN "oin" ; --Apertium
+lin forest_N = mkN "baso" ; --Apertium
+lin forget_V2 = mkV2 "ahaztu" ; --Apertium
+lin freeze_V = mkV "izoztu" ; --Apertium
+lin fridge_N = mkN "elurtegi" ; --Apertium
+lin friend_N = mkN "lagun" ; --| mkN "adiskide" ; --Apertium
+lin fruit_N = mkN "fruta" ; --Apertium
+lin full_A = mkA "bete" ; --Apertium
+--lin fun_AV
+
+----
+-- G
+
+lin garden_N = mkN "lorategi" ; --Apertium
+lin girl_N = mkN "neska" ;
+lin give_V3 = mkV3 "eman" ; --Apertium
+lin glove_N = mkN "eskularru" | mkN "eskularru" ; --Apertium
+lin go_V = joan_V ;
+lin gold_N = mkN "urre" ; --Apertium
+lin good_A = mkA "ongi" (mkA "on") ; -- Irregular adverb form
+lin grammar_N = mkN "gramatika" ; --Apertium
+lin grass_N = mkN "belar" ; --Apertium
+lin green_A = mkA "berde" ; --Apertium
+
+----
+-- H
+
+lin hair_N = mkN "ile" ; -- | mkN "adats" ; --Apertium
+lin hand_N = mkN "esku" ; --Apertium
+lin harbour_N = mkN "portu" ; --| mkN "kai" | mkN "mendate" ; --Apertium
+lin hat_N = mkN "kapela" ; --Apertium
+lin hate_V2 = mkV2 "gorrotatu" ; --Apertium
+lin head_N = mkN "buru" ; --Apertium
+lin hear_V2 = mkV2 "entzun" ; --Apertium
+lin heart_N = mkN "bihotz" ; --Apertium
+lin heavy_A = mkA "astun" ; --Apertium
+lin hill_N = mkN "muino" ; --Apertium
+lin hit_V2 = mkV2 "jo" ; --Apertium
+lin hold_V2 = mkV2 "eutsi" ; --Apertium
+lin hope_VS = lin VS (egonV "zain") ; --Apertium
+lin horn_N = mkN "adar" ; --Apertium
+lin horse_N = mkN "zaldi" ; --Apertium
+lin hot_A = mkA "bero" ; --Apertium
+lin house_N = mkN "etxe" ; --Apertium
+lin hunt_V2 = mkV2 "ehizatu" ;
+lin husband_N = mkN "senar" ; --Apertium
+
+----
+-- I
+
+lin ice_N = mkN "izotz" ; --Apertium ; --Apertium
+lin industry_N = mkN "industria" ; --Apertium
+lin iron_N = mkN "burdina" ; -- | mkN "plantxa" ; --Apertium
+
+--------
+-- J - K
+
+lin jump_V = mkV "jauzi" egin_V ; --Apertium
+lin kill_V2 = mkV2 "hil" ; --Apertium
+lin king_N = mkN "errege" ; --Apertium
+lin knee_N = mkN "belaun" ; --Apertium
+lin know_V2 = lin V2 jakin_V2 ; -- synthetic verb
+lin know_VQ = lin VQ jakin_V2 ; -- synthetic verb
+
+lin know_VS = ukanV "uste" ;
+
+
+----
+-- L
+
+lin lake_N = mkN "aintzira" ; --Apertium
+lin lamp_N = mkN "lanpara" ; --Apertium
+lin language_N = mkN "hizkuntza" ; --Apertium
+lin laugh_V = mkV "barre" egin_V ; --Apertium
+lin leaf_N = mkN "orri" ; -- | mkN "hosto" ; --Apertium
+lin learn_V2 = mkV2 "ikasi" ; --Apertium
+lin leather_N = mkN "larru" ; --Apertium
+lin leave_V2 = mkV2 "utzi" ; --| mkV2 "laga" ; --Apertium
+lin leg_N = mkN "hanka" ; --Apertium
+-- lin lie_V = mkV2 "gezur8erran" ; --Apertium
+-- lin lie_V = mkV2 "gezurra8esan" ; --Apertium
+--lin like_V2 = mkV2 "gustatu" ; --Apertium -- NOR-NORI
+-- lin like_V2 = mkV2 "atsegin_izan" ; --Apertium
+-- lin like_V2 = mkV2 "atsegin8izan" ; --Apertium
+-- lin like_V2 = mkV2 "gogoko8izan" ; --Apertium
+lin listen_V2 = mkV2 "entzun" ; --Apertium
+lin live_V = izanV "bizi" ;
+lin liver_N = mkN "gibel" ; --Apertium
+lin long_A = mkA "luze" ; --Apertium
+lin lose_V2 = mkV2 "galdu" ; --Apertium
+lin louse_N = mkN "zorri" ; --Apertium
+lin love_N = mkN "maitasun" ; -- | mkN "amodio" ; --Apertium
+lin love_V2 = ukanV "maite" ;
+lin man_N = mkN "gizon" animate ; --Apertium
+lin meat_N = mkN "haragi" ; -- | mkN "mami" ; --Apertium
+lin milk_N = mkN "esne" ; --Apertium
+lin moon_N = mkN "ilargi" ; --Apertium
+lin mother_N2 = mkN2 "ama" ;
+lin mountain_N = mkN "mendi" ; --Apertium
+lin mouth_N = mkN "aho" ; --Apertium
+lin music_N = mkN "musika" ; --Apertium
+
+----
+-- N
+
+lin name_N = mkN "izen" ; --Apertium
+lin narrow_A = mkA "estu" ; --Apertium
+lin near_A = mkA "hurbil" ; --Apertium
+lin neck_N = mkN "lepo" ; --Apertium
+lin new_A = mkA "berri" ; --Apertium
+lin newspaper_N = mkN "egunkari" ; -- | mkN "kazeta" ; --Apertium
+lin night_N = mkN "gau" ; --Apertium
+lin nose_N = mkN "sudur" ; --Apertium
+lin now_Adv = mkAdv "orain" ;
+lin number_N = mkN "zenbaki" ; --Apertium
+
+--------
+-- O - P
+
+
+lin oil_N = mkN "olio" ; --Apertium
+lin old_A = mkA "zahar" ; --Apertium
+lin open_V2 = mkV2 "ireki" ; -- | mkV2 "zabaldu" ; --Apertium
+lin paint_V2A = mkV2A "margotu" ; -- | mkV2A "pintatu" ; --Apertium
+lin paper_N = mkN "paper" ; --Apertium
+lin paris_PN = mkPN "Paris" ;
+lin peace_N = mkN "bake" ; -- | mkN "sosegu" ; --Apertium
+lin pen_N = mkN "boligrafo" ; --Apertium
+lin person_N = mkN "pertsona" ; --| mkN "gizakume" | mkN "jende" ; --Apertium
+lin planet_N = mkN "planeta" ; --Apertium
+lin plastic_N = mkN "plastiko" ; --Apertium
+lin play_V = mkV "jokatu" ; -- | mkV "jolastu" ; --Apertium
+lin policeman_N = mkN "ertzain" ; --Apertium
+lin priest_N = mkN "apaiz" ; -- | mkN "artzain" ; --Apertium -- FIXME: split
+lin pull_V2 = mkV2 "tenkatu" ; -- | mkV2 "tiratu" ; --Apertium
+lin push_V2 = mkV2 "bultzatu" ; -- | mkV2 "estutu" ; --Apertium
+lin put_V2 = mkV2 "ezarri" ; -- | mkV2 "jarri" ; --Apertium
+
+--------
+-- Q - R
+
+lin queen_N = mkN "erregina" ; --Apertium
+lin question_N = mkN "galdera" ; --Apertium
+lin radio_N = mkN "erradio" ; --| mkN "irrati" ; --Apertium
+lin rain_N = mkN "euri" ; --Apertium
+lin rain_V0 = mkV "euria ari" (mkV "edun") ; --Apertium
+lin read_V2 = mkV2 "irakurri" ; --Apertium
+lin ready_A = mkA "prest" ; --Apertium
+lin reason_N = mkN "arrazoi" ; --| mkN "motibo" | mkN "zergati" ; --Apertium
+lin red_A = mkA "gorri" ; --Apertium
+lin religion_N = mkN "erlijio" ; --Apertium
+lin restaurant_N = mkN "janetxe" ; --| mkN "jatetxe" ; --Apertium
+lin river_N = mkN "ibai" ; --Apertium
+lin road_N = mkN "kale" ; --| mkN "errepide" ; --Apertium
+lin rock_N = mkN "harri" ; --| mkN "arroka" ; --Apertium
+lin roof_N = mkN "teilatu" ; --| mkN "sabai" ; --Apertium
+lin root_N = mkN "erro" ; --Apertium
+lin rope_N = mkN "korda" ; --| mkN "soka" ; --Apertium
+lin rotten_A = mkA "ustel" ; --Apertium
+lin round_A = mkA "biribil" ; --Apertium
+lin rub_V2 = mkV2 "igurtzi" ; --Apertium
+lin rubber_N = mkN "goma" ; --Apertium
+lin rule_N = mkN "arautegi" ; --| mkN "erregela" ; --Apertium
+lin run_V = mkV "korritu" ; --Apertium
+
+----
+-- S
+
+lin salt_N = mkN "gatz" ; --Apertium
+lin sand_N = mkN "harea" ; --Apertium
+lin say_VS = mkVS "esan" ; --Apertium
+lin school_N = mkN "eskola" ; --| mkN "ikastola" ; --Apertium
+lin science_N = mkN "zientzia" ; --Apertium
+lin scratch_V2 = mkV2 "urratu" ; --Apertium
+lin sea_N = mkN "itsaso" ;
+lin see_V2 = mkV2 "ikusi" ;
+lin seed_N = mkN "hazi" ; --Apertium
+lin seek_V2 = mkV2 "bilatu" ; --Apertium
+lin sell_V3 = mkV3 "saldu" ; --Apertium
+lin send_V3 = mkV3 "bidali" ; --| mkV3 "igorri" ; --Apertium
+lin sew_V = mkV "josi" ; --Apertium
+lin sharp_A = mkA "zorrotz" ; -- | mkA "sarkor" | mkA "zoli" ; --Apertium
+lin sheep_N = mkN "ardi" ; --Apertium
+lin ship_N = mkN "ontzi" ; --| mkN "itsasontzi" ; --Apertium
+lin shirt_N = mkN "alkandora" ; --Apertium
+lin shoe_N = mkN "zapata" ; --Apertium
+lin shop_N = mkN "denda" ; --| mkN "saltoki" ; --Apertium
+lin short_A = mkA "apal" ; --| mkA "baxu" | mkA "labur" | mkA "motz" ; --Apertium
+lin silver_N = mkN "zilar" ; --Apertium
+lin sing_V = mkV "kantatu" ; --Apertium
+lin sister_N = mkN "aizpa" ; --| mkN "arreba" ; --Apertium -- FIXME: Depends on gender of 'possessor'
+lin sit_V = mkV "eseri" ; --| mkV "jarri" ; --Apertium
+lin skin_N = mkN "larru" ; --Apertium
+lin sky_N = mkN "zeru" ; --Apertium
+lin sleep_V = mkV "lo" egin_V ;
+lin small_A = mkA "txiki" ; --| mkA "apur" | mkA "xume" ; --Apertium
+lin smell_V = izanV "usain" ; --Apertium
+lin smoke_N = mkN "ke" ; --Apertium
+lin smooth_A = mkA "leun" ; --| mkA "liso" ; --Apertium
+lin snake_N = mkN "suge" ; --Apertium
+lin snow_N = mkN "elur" ; --Apertium
+lin sock_N = mkN "galtzetin" ; --Apertium
+lin song_N = mkN "abesti" ; --| mkN "kanta" | mkN "kantu" ; --Apertium
+lin speak_V2 = lin V2 (mkV "hitz" egin_V) ; --Apertium
+lin spit_V = mkV "txistua bota" ; --Apertium
+lin split_V2 = mkV2 "pitzatu" ; --| mkV2 "zatitu" ; --Apertium
+lin squeeze_V2 = mkV2 "estutu" ; --Apertium
+lin stab_V2 = mkV2 "sastatu" ; --Apertium
+lin stand_V = mkV "egon" ; --| mkV "eutsi" | mkV "jarri" ; --Apertium
+lin star_N = mkN "izar" ; --Apertium
+lin steel_N = mkN "altzairu" ; --Apertium
+lin stick_N = mkN "palo" ; --Apertium
+lin stone_N = mkN "harri" ; --| mkN "hezur" ; --Apertium
+lin stop_V = mkV "gelditu" ; --| mkV "geratu" | mkV "atxilotu" | mkV "geldiarazi" ; --Apertium
+lin stove_N = mkN "berogailu" ; --| mkN "sukalde" ; --Apertium
+lin straight_A = mkA "zuzen" ; --Apertium
+lin student_N = mkN "ikasle" ; --Apertium
+lin stupid_A = mkA "ergel" ; -- | mkA "tonto" ; --Apertium
+lin suck_V2 = mkV2 "edoski" ; --| mkV2 "xurgatu" | mkV2 "zupatu" ; --Apertium
+lin sun_N = mkN "eguzki" ; --Apertium
+lin swell_V = mkV "handitu" ; --Apertium
+lin swim_V = mkV "igeri" egin_V ; --Apertium
+
+----
+-- T
+
+
+lin table_N = mkN "mahai" ; --| mkN "taula" ; --Apertium
+lin tail_N = mkN "buztan" ; --| mkN "kola" ; --Apertium
+lin talk_V3 = mkV3 "mintzatu" ; --Apertium
+lin teach_V2 = mkV2 "erakutsi" ; --| mkV2 "irakatsi" ; --Apertium
+lin teacher_N = mkN "irakasle" ; --Apertium
+lin television_N = mkN "telebista" ; --Apertium
+lin thick_A = mkA "lodi" ; --Apertium
+lin thin_A = mkA "argal" ; -- | mkA "mehe" ; --Apertium
+lin think_V = mkV "iritzi" ; --| mkV "pentsatu" ; --Apertium
+lin throw_V2 = mkV2 "aurtiki" ; -- | mkV2 "jaurti" | mkV2 "tiratu" ; --Apertium
+lin tie_V2 = mkV2 "lotu" ; --Apertium
+lin today_Adv = mkAdv "gaur" ;
+lin tongue_N = mkN "mihi" ; --| mkN "mizto" ; --Apertium
+lin tooth_N = mkN "hortz" ; --Apertium
+lin train_N = mkN "tren" ; --Apertium
+lin travel_V = mkV "bidaiatu" ; --Apertium
+lin tree_N = mkN "zuhaitz" ; --Apertium
+lin turn_V = mkV "biratu" ; --| mkV "jiratu" ; --Apertium
+
+--------
+-- U - V
+
+lin ugly_A = mkA "itsusi" ; --Apertium
+lin uncertain_A = mkA "gezur" ; --Apertium
+lin understand_V2 = mkV2 "aditu" ; --| mkV2 "ulertu" ; --Apertium
+lin university_N = mkN "unibertsitate" ; --Apertium
+lin village_N = mkN "herrixka" ; --Apertium
+lin vomit_V = mkV2 "oka" egin_V ; --Apertium
+
+--------
+-- W - Y
+
+lin wait_V2 = mkV2 "itxaron" ; --| mkV2 "zain egon" ; --Apertium
+lin walk_V = ibili_V ; --Apertium
+lin war_N = mkN "gerra" ; --Apertium
+lin warm_A = mkA "bero" ; --Apertium
+lin wash_V2 = mkV2 "garbitu" ; --Apertium
+lin watch_V2 = mkV2 "begiratu" ; --Apertium
+lin water_N = mkN "ura" ; --Definite form is ura, not urra ('hazelnut')
+lin wet_A = mkA "busti" ; --Apertium
+lin white_A = mkA "zuri" ; --| mkA "txuri" ; --Apertium
+lin wide_A = mkA "zabal" ; --Apertium
+lin wife_N = mkN "emazte" ; --Apertium
+lin win_V2 = mkV2 "garaitu" ; --| mkV2 "irabazi" ; --Apertium
+lin wind_N = mkN "haize" ; --Apertium
+lin window_N = mkN "leiho" ;
+lin wine_N = mkN "ardo" ; --Apertium
+lin wing_N = mkN "hegal" ; --Apertium
+lin wipe_V2 = mkV2 "garbitu" ; --Apertium
+lin woman_N = mkN "emakume" animate ;
+lin wonder_VQ = mkVQ "galdetu" ; -- galdetu = ask
+lin wood_N = mkN "zur" ; --| mkN "baso" ; --Apertium -- leña, bosque
+lin worm_N = mkN "har" ; --| mkN "zizare" ; --Apertium
+lin write_V2 = mkV2 "idatzi" ; --Apertium
+lin year_N = mkN "urte" ; --| mkN "urtebete" ; --Apertium
+lin yellow_A = mkA "hori" ; --Apertium
+lin young_A = mkA "gazte" ; --Apertium
+
+
+
+
+oper
+
+ egin_V : V = mkV "egin" ;
+
+ -- Some synthetic verbs
+ etorri_V : R.Verb = R.syntVerbDa "etorri" R.Etorri ;
+
+ ibili_V : R.Verb = R.syntVerbDa "ibili" R.Ibili ;
+
+ jakin_V2 : R.Verb = R.syntVerbDu "jakin" R.Jakin ;
+
+ joan_V : R.Verb = R.syntVerbDa "joan" R.Joan ;
+}
\ No newline at end of file
diff --git a/src/basque/MissingEus.gf b/src/basque/MissingEus.gf
new file mode 100644
index 00000000..93e670fc
--- /dev/null
+++ b/src/basque/MissingEus.gf
@@ -0,0 +1,24 @@
+resource MissingEus = open GrammarEus, Prelude in {
+
+-- temporary definitions to enable the compilation of RGL API
+oper AddAdvQVP : QVP -> IAdv -> QVP = notYet "AddAdvQVP" ;
+oper AdnCAdv : CAdv -> AdN = notYet "AdnCAdv" ;
+oper AdvQVP : VP -> IAdv -> QVP = notYet "AdvQVP" ;
+oper CleftAdv : Adv -> S -> Cl = notYet "CleftAdv" ;
+oper CleftNP : NP -> RS -> Cl = notYet "CleftNP" ;
+oper ComparAdvAdjS : CAdv -> A -> S -> Adv = notYet "ComparAdvAdjS" ;
+oper ComplSlashIP : VPSlash -> IP -> QVP = notYet "ComplSlashIP" ;
+oper ExistIP : IP -> QCl = notYet "ExistIP" ;
+oper ExistIPAdv : IP -> Adv -> QCl = notYet "ExistIPAdv" ;
+oper ExistNP : NP -> Cl = notYet "ExistNP" ;
+oper ExistNPAdv : NP -> Adv -> Cl= notYet "ExistNPAdv" ;
+oper GenericCl : VP -> Cl = notYet "GenericCl" ;
+oper ImpP3 : NP -> VP -> Utt = notYet "ImpP3" ;
+oper ImpersCl : VP -> Cl = notYet "ImpersCl" ;
+oper QuestQVP : IP -> QVP -> QCl = notYet "QuestQVP" ;
+oper SelfAdVVP : VP -> VP = notYet "SelfAdVVP" ;
+oper SelfAdvVP : VP -> VP = notYet "SelfAdvVP" ;
+oper SelfNP : NP -> NP = notYet "SelfNP" ;
+oper SlashPrep : Cl -> Prep -> ClSlash = notYet "SlashPrep" ;
+oper SlashVS : NP -> VS -> SSlash -> ClSlash = notYet "SlashVS" ;
+}
diff --git a/src/basque/NounEus.gf b/src/basque/NounEus.gf
new file mode 100644
index 00000000..2606cbba
--- /dev/null
+++ b/src/basque/NounEus.gf
@@ -0,0 +1,263 @@
+concrete NounEus of Noun = CatEus ** open ResEus, Prelude in {
+
+ flags optimize=all_subs ;
+
+ lin
+
+--2 Noun phrases
+
+-- The three main types of noun phrases are
+-- - common nouns with determiners
+-- - proper names
+-- - pronouns
+
+ -- : Det -> CN -> NP
+ DetCN det cn =
+ let ag : Agr = case det.nbr of {
+ Sg => Hau ;
+ Pl => Hauek
+ } ;
+ s : Case => Str =
+ \\c => cn.heavyMod ! ag -- e.g. rel clause, adverb
+ ++ det.pref -- nire
+ ++ cn.s ! ag -- baso handi
+ ++ det.s ! c ! cn.ph -- bat, &+a
+ ++ cn.comp ; -- ardo gorri
+ in { s = s ;
+ stem = s ! Abs ; -- This really shouldn't become relevant:
+ agr = ag ; -- stem is only used in ApposCN, which makes sense
+ anim = cn.anim ; -- with NPs formed out of PNs or Symbs.
+ isDef = det.isDef
+ } ;
+
+ -- : PN -> NP ;
+ UsePN pn = { s = \\c => pn.s ++ artIndef ! c ! pn.ph;
+ stem = pn.s ;
+ agr = Hau ;
+ anim = pn.anim ;
+ isDef = True } ; --in Extra : add UsePNIndef to allow "hemen ez dago Olatzik"
+
+ -- : Pron -> NP ;
+ UsePron pron = lin NP pron ;
+
+
+ -- : Predet -> NP -> NP ; -- only the man
+ PredetNP predet np = np ** { s = \\cas => predet.s ++ np.s ! cas } ; --TODO: test
+
+
+-- A noun phrase can also be postmodified by the past participle of a
+-- verb, by an adverb, or by a relative clause
+
+
+ -- : NP -> V2 -> NP ; -- the man seen / ikusi gizona (sounds weird but so does English)
+ PPartNP np v2 = np ** { s = \\c => v2.prc ! Past ++ np.s ! c } ;
+
+ -- : NP -> Adv -> NP ; -- Paris today ; boys, such as ..
+ AdvNP,ExtAdvNP = \np,adv -> np ** { s = \\c => adv.s ++ np.s ! c } ;
+
+
+ -- : NP -> RS -> NP ; -- Paris, which is here
+ RelNP np rs = np ** { s = \\c => rs.s ! np.agr ++ np.s ! c } ;
+
+-- Determiners can form noun phrases directly.
+
+ -- : Det -> NP ; -- nirea ?
+ DetNP det =
+ let f : Case => Str =
+ \\c => if_then_Str det.indep
+ (det.pref ++ det.s ! c ! FinalCons)
+ nonExist ; -- To prevent forms that start with BIND
+ in { s = f ;
+ stem = f ! Abs ;
+ agr = case det.nbr of {Sg => Hau ; Pl => Hauek } ;
+ anim = Inan ;
+ isDef = det.isDef } ;
+
+ -- MassNP : CN -> NP ;
+ MassNP cn =
+ let s : Case => Str =
+ \\c => cn.heavyMod ! Hau -- e.g. rel clause, adverb
+ ++ cn.s ! Hau -- baso handi
+ ++ artIndef ! c ! cn.ph -- no -a in Abs
+ ++ cn.comp ; -- ardo gorri
+ in { s = s ;
+ stem = s ! Abs ;
+ agr = Hau ;
+ anim = Inan ;
+ isDef = False } ;
+
+
+--2 Determiners
+
+-- The determiner has a fine-grained structure, in which a 'nucleus'
+-- quantifier and an optional numeral can be discerned.
+
+ -- : Quant -> Num -> Det ;
+ DetQuant quant num = quant **
+ { s = \\c,ph => case of { --numeral 1 ("bat") goes after NP!
+ => num.s ++ quant.s ! num.n ! c ! FinalCons ;
+ _ => quant.s ! num.n ! c ! ph
+ } ;
+ nbr = num.n ;
+ pref = case num.n of {
+ Sg => quant.pref ;
+ Pl => quant.pref ++ num.s
+ } ;
+ isDef = orB quant.isDef num.isNum } ;
+
+ -- : Quant -> Num -> Ord -> Det ; -- these five best
+ DetQuantOrd quant num ord =
+ let theseFive = DetQuant quant num
+ in theseFive ** { s = \\c,ph => theseFive.s ! c ! ph ++ ord.s } ; --TODO: dummy implementation
+
+-- Whether the resulting determiner is singular or plural depends on the
+-- cardinal.
+
+-- All parts of the determiner can be empty, except $Quant$, which is
+-- the "kernel" of a determiner. It is, however, the $Num$ that determines
+-- the inherent number.
+
+ NumSg = { s = [] ; n = Sg ; isNum = False } ;
+ NumPl = { s = [] ; n = Pl ; isNum = False } ;
+
+ -- : Card -> Num ;
+ NumCard card = (card ** { isNum = True }) ;
+
+ -- : Digits -> Card ;
+ NumDigits dig = { s = dig.s ! NCard ; n = dig.n } ;
+
+ -- : Numeral -> Card ;
+ NumNumeral num = num ;
+
+ -- : AdN -> Card -> Card ;
+ AdNum adn card = card ** { s = adn.s ++ card.s } ;
+
+ -- : Digits -> Ord ;
+ OrdDigits digs = digs ** { s = digs.s ! NOrd } ;
+
+ -- : Numeral -> Ord ;
+ OrdNumeral num = num ;
+
+ -- : A -> Ord ;
+ OrdSuperl a = { s = a.s ! AF Superl ; n = Sg } ; -- why force Sg?
+
+-- One can combine a numeral and a superlative.
+
+ -- : Numeral -> A -> Ord ; -- third largest
+ OrdNumeralSuperl num a = num ** { s = num.s ++ a.s ! AF Superl } ; --TODO: is the word order correct?
+
+ -- : Quant
+ DefArt = { s = artDef ;
+ indep = False ;
+ pref = [] ;
+ isDef = True } ;
+ -- : Quant
+ IndefArt = { s = artDef ;
+ indep = False ;
+ pref = [] ;
+ isDef = False } ; --has suffix, but turns into partitive in negative!
+
+ -- : Pron -> Quant
+ PossPron pron = { s = artDef ;
+ indep = True ;
+ pref = pron.s ! Gen ;
+ isDef = True } ;
+
+--2 Common nouns
+
+ -- : N -> CN
+ -- : N2 -> CN ;
+ UseN,UseN2 = ResEus.useN ;
+
+
+ -- : N2 -> NP -> CN ; -- mother of the king
+ ComplN2 n2 np =
+ let compl = applyPost n2.compl1 np ;
+ in useN n2 ** { s = \\agr => compl ++ n2.s } ;
+
+ -- : N3 -> NP -> N2 ; -- distance from this city (to Paris)
+ ComplN3 n3 np =
+ let compl = applyPost n3.compl2 np ;
+ in n3 ** {s = compl ++ n3.s } ;
+
+ -- : N3 -> N2 ; -- distance (from this city)
+ Use2N3 n3 = lin N2 n3 ** { compl1 = n3.compl2 } ;
+
+ -- : N3 -> N2 ; -- distance (to Paris)
+ Use3N3 n3 = lin N2 n3 ;
+
+ -- : AP -> CN -> CN
+ AdjCN ap cn =
+ let a : Str = artIndef ! Abs ! cn.ph ; --`a' for FinalA, [] for other
+ result : {s : Agr => Str ; ph : Phono} =
+ case ap.typ of {
+ Ko => { s = \\agr => ap.s ++ cn.s ! agr ;
+ ph = cn.ph } ;
+ Bare => { s = \\agr => cn.s ! agr ++ a ++ ap.s ;
+ ph = ap.ph }
+ } ;
+ in cn ** { s = result.s ;
+ ph = result.ph } ;
+
+ -- : CN -> RS -> CN ;
+ RelCN cn rs = cn ** { heavyMod = \\agr => cn.heavyMod ! agr ++ rs.s ! agr } ;
+
+
+ -- : CN -> Adv -> CN ;
+ AdvCN cn adv = cn ** { heavyMod = \\agr => cn.heavyMod ! agr ++ adv.s } ;
+
+-- Nouns can also be modified by embedded sentences and questions.
+-- For some nouns this makes little sense, but we leave this for applications
+-- to decide. Sentential complements are defined in VerbEus.
+
+ -- : CN -> SC -> CN ; -- question where she sleeps
+ SentCN cn sc = cn ** { heavyMod = \\agr => cn.heavyMod ! agr ++ sc.s } ;
+
+
+--2 Apposition
+
+-- This is certainly overgenerating.
+
+ -- : CN -> NP -> CN ; -- city Paris (, numbers x and y)
+ ApposCN cn np = cn ** { s = \\agr => np.stem ++ cn.s ! agr } ;
+
+
+--2 Possessive and partitive constructs
+
+ -- : PossNP : CN -> NP -> CN ; -- (mutilaren / taberna honetako) garagardo
+ PossNP cn np =
+ let npPoss = applyPost (case np.anim of {
+ Anim => mkPost [] Gen False ;
+ Inan => mkPost "ko" LocStem True
+ }) np ;
+ in cn ** { s = \\agr => npPoss ++ cn.s ! agr } ;
+
+ -- : CN -> NP -> CN ; -- glass of wine / baso bat ardo beltz
+ -- two kilos of red apples / bi kilo sagar gorri
+ PartNP cn np =
+ let baso = cn ;
+ sagarGorri = np.stem
+ in baso ** { comp = sagarGorri } ;
+
+
+
+-- This is different from the partitive, as shown by many languages.
+
+ -- : Det -> NP -> NP ; -- gutarik zenbait
+ CountNP det np = np **
+ { s = \\c => elative np
+ ++ det.pref
+ ++ det.s ! c ! FinalCons } ; -- Nonsense for DefArt or IndefArt
+
+--3 Conjoinable determiners and ones with adjectives
+
+ -- : DAP -> AP -> DAP ; -- the large (one)
+ AdjDAP dap ap = dap ** { s = \\cas,ph => ap.s ++ dap.s ! cas ! ph } ;
+
+ -- : Det -> DAP ; -- this (or that)
+ DetDAP det = det ;
+
+oper
+ elative : NP -> Str = \np -> glue (np.s ! LocStem) "rik" ;
+
+}
\ No newline at end of file
diff --git a/src/basque/NumeralEus.gf b/src/basque/NumeralEus.gf
new file mode 100644
index 00000000..8d2430a0
--- /dev/null
+++ b/src/basque/NumeralEus.gf
@@ -0,0 +1,116 @@
+concrete NumeralEus of Numeral = CatEus [Numeral,Digits] ** open Prelude, ResEus, ParamX in {
+
+oper LinDigit : Type = { s : DForm => Str ;
+ n : Number ;
+ even20 : Even20 } ;
+
+oper mk20Ten : Str -> Str -> Str -> Str -> LinDigit = \tri,t,fiche,h ->
+ { s = table { Unit => tri ;
+ Teen => t ;
+ Twenty => fiche ;
+ Hund => h + "ehun"} ;
+ even20 = Ten ;
+ n = Pl } ;
+
+oper mkeven20 : Str -> Str -> Str -> Str -> LinDigit = \se,t,trifichid,h ->
+ { s = table { Unit => se ;
+ Teen => t ;
+ Twenty => trifichid ;
+ Hund => h + "ehun" } ;
+ even20 = Even ;
+ n = Pl } ;
+
+param Even20 = Ten | Even ;
+param DForm = Unit | Teen | Twenty | Hund ;
+
+--lincat Numeral = {s : Str} ;
+lincat Digit = LinDigit ;
+lincat Sub10 = LinDigit ;
+lincat Sub100 = {s : Str ; n : Number } ;
+lincat Sub1000 = {s : Str ; n : Number ; isHundred : Bool } ;
+lincat Sub1000000 = {s : Str ; n : Number } ;
+
+
+----------------------------------------------------------------------------
+
+
+-- num : Sub1000000 -> Numeral ;
+lin num x0 = lin Numeral x0 ;
+
+lin n2 = mkeven20 "bi" "hamabi" "hogei" "berr" ;
+lin n3 = mk20Ten "hiru" "hamahiru"{-"hamahirur"-} "hogei" "hirur";
+lin n4 = mkeven20 "lau" "hamalau"{-"hamalaur"-} "berrogei" "laur";
+lin n5 = mk20Ten "bost" "hamabost"{-"hamabortz"-} "berrogei" "bost";
+lin n6 = mkeven20 "sei" "hamasei" "hirurogei" "seir" ;
+lin n7 = mk20Ten "zazpi" "hamazazpi" "hirurogei" "zazpi" ;
+lin n8 = mkeven20 "zortzi" "hemezortzi" "laurogei" "zortzi" ;
+lin n9 = mk20Ten "bederatzi" "hemeretzi" "laurogei" "bederatzi" ;
+
+lin pot01 =
+ {s = table {Unit => "bat" ; Hund => "ehun" ; _ => []} ; even20 = Ten ; n = Sg };
+lin pot0 d = d ;
+lin pot110 = {s = "hamar" ; n = Pl} ;
+lin pot111 = {s = variants {"hamaika" ; "hameka"} ; n = Pl} ;
+lin pot1to19 d = {s = d.s ! Teen ; n = Pl} ;
+lin pot0as1 n = {s = n.s ! Unit ; n = n.n} ;
+lin pot1 d =
+ {s = case d.even20 of {
+ Even => d.s ! Twenty ;
+ Ten => glue (d.s ! Twenty) "tahamar" } ;
+ n = Pl} ;
+lin pot1plus d e =
+ {s = case d.even20 of {
+ Even => d.s ! Twenty ++ "ta" ++ e.s ! Unit ;
+ Ten => d.s ! Twenty ++ "ta" ++ e.s ! Teen } ;
+ n = Pl} ;
+
+lin pot1as2 n = n ** { isHundred = False } ;
+lin pot2 d = {s = d.s ! Hund ; n = Pl ; isHundred = True } ;
+lin pot2plus d e =
+ { s = d.s ! Hund ++ "ta" ++ e.s ;
+ n = Pl ;
+ isHundred = True } ;
+lin pot2as3 n = n ;
+lin pot3 n =
+ {s = table {Sg => [] ; Pl => n.s } ! n.n ++ "mila" ;
+ n = n.n } ;
+
+
+lin pot3plus n m =
+ let ta = if_then_Str m.isHundred [] "ta" ; --no `ta' between 1000 and 100
+ in
+ { s = table {Sg => [] ; Pl => n.s } ! n.n ++ "mila" ++ ta ++ m.s ;
+ n = n.n } ;
+
+----------------------------------------------------------------------------
+
+lincat Dig = TDigit ;
+
+oper
+ TDigit : Type = { s : CardOrd => Str ; n : Number } ;
+ mkDig : Str -> TDigit = \c -> mk2Dig c Pl ;
+
+ mk2Dig : Str -> Number -> TDigit = \c,num ->
+ { s = table { NCard => c ;
+ NOrd => c + "garren" } ;--TODO: make it more noun-like?
+ n = num } ;
+
+
+
+lin D_0 = mkDig "0" ;
+lin D_1 = mk2Dig "1" Sg ;
+lin D_2 = mkDig "2" ;
+lin D_3 = mkDig "3" ;
+lin D_4 = mkDig "4" ;
+lin D_5 = mkDig "5" ;
+lin D_6 = mkDig "6" ;
+lin D_7 = mkDig "7" ;
+lin D_8 = mkDig "8" ;
+lin D_9 = mkDig "9" ;
+
+ -- : Dig -> Digits ;
+lin IDig dig = dig ;
+ -- : Dig -> Digits -> Digits ;
+lin IIDig dig digs = digs ** {s = \\co => glue (dig.s ! co) (digs.s ! co) } ;
+
+}
diff --git a/src/basque/ParadigmsEus.gf b/src/basque/ParadigmsEus.gf
new file mode 100644
index 00000000..537786f4
--- /dev/null
+++ b/src/basque/ParadigmsEus.gf
@@ -0,0 +1,177 @@
+resource ParadigmsEus = open CatEus, ResEus, Prelude in {
+
+oper
+
+--2 Parameters
+--
+-- To abstract over number, valency and (some) case names,
+-- we define the following identifiers. The application programmer
+-- should always use these constants instead of the constructors
+-- defined in $ResEus$.
+ Number : Type ;
+ sg : Number ;
+ pl : Number ;
+
+ -- Only restricted to izan and ukan, no other synthetic verbs.
+ -- If you need to add a new synthetic verb, see syntVerbNor and syntVerbNork in ResEus.
+ AuxType : Type ;
+ da : AuxType ;
+ du : AuxType ;
+ zaio : AuxType ;
+ dio : AuxType ;
+
+ Case : Type ;
+ absolutive : Case ;
+ ergative : Case ;
+ dative : Case ;
+ genitive : Case ;
+ partitive : Case ;
+ inessive : Case ;
+ instrumental : Case ; -- Instrumental :
+ sociative : Case ; -- Sociative/comitative : txakurrarekin `with the dog'
+
+ Animacy : Type ;
+ animate : Animacy ;
+ inanim : Animacy ;
+
+--2 Nouns
+
+ mkN = overload {
+ mkN : Str -> N = \s -> lin N (mkNoun s) ;
+ mkN : Str -> Bizi -> N = \s,bizi -> lin N (mkNoun s ** { anim = bizi }) ;
+ } ;
+
+ mkPN : Str -> PN = \s -> lin PN (mkPNoun s) ;
+
+ mkN2 = overload {
+ mkN2 : Str -> N2 = \s -> lin N2 (mkNoun2 s genitive) ;
+ mkN2 : Str -> Case -> N2 = \s,cas -> lin N2 (mkNoun2 s cas) ;
+ } ;
+
+--2 Adjectives
+
+ mkA = overload {
+ mkA : Str -> A = \s -> lin A (regAdj s) ;
+ mkA : Str -> A -> A = \s,a -> irregAdvAdj s a
+ } ;
+
+-- mkA2 : Str -> A2 = \s -> lin A2 (mkAdj s) ;
+
+
+
+--2 Verbs
+
+ mkV = overload {
+
+ mkV : Str -> V = \s -> lin V (mkVerbDa s) ; --
+
+ mkV : Str -> V -> V = \lo,egin ->
+ lin V (egin ** { prc = \\t => lo ++ egin.prc ! t }) ;
+
+ } ;
+
+ -- For verbs with non-inflecting participle, see izanV, egonV and ukanV.
+
+ mkV2 = overload {
+ mkV2 : Str -> V2 = \s -> lin V2 (mkVerbDu s) ;
+
+ mkV2 : Str -> AuxType -> V2 = \s,val -> lin V2 (mkVerbDa s ** { val = val }) ;
+
+ mkV2 : Str -> V -> V2 = \lo,egin ->
+ lin V2 (egin ** { prc = \\t => lo ++ egin.prc ! t ;
+ val = Du Ukan }) ;
+
+ } ;
+
+ mkVA : Str -> VA = \s -> lin VA (mkVerbDa s) ; -- Nor
+
+ mkV2A : Str -> V2A = \s -> lin V2A (mkVerbDu s) ; -- Nor-nork
+ mkVQ : Str -> VQ = \s -> lin VQ (mkVerbDu s) ; -- Nor-nork
+ mkVS : Str -> VS = \s -> lin VS (mkVerbDu s) ; -- Nor-nork
+
+
+ mkV2V : Str -> V2V = \s -> lin V2V (mkVerbDio s) ; -- ??? TODO check valency
+ mkV2S : Str -> V2S = \s -> lin V2S (mkVerbDio s) ; -- Nor-nori-nork: (mutilari) (neska datorrela) erantzun diot
+ mkV2Q : Str -> V2Q = \s -> lin V2Q (mkVerbDio s) ; -- Nor-nori-nork: (mutilari) (neska datorren) galdetu diot
+ mkV3 : Str -> V3 = \s -> lin V3 (mkVerbDio s) ; -- Nor-nori-nork: (mutilari) (garagardoa) edan diot
+
+
+ -----
+ -- Verbs with non-inflecting participle
+ -- These are just Verb, use izanV or egonV for intransitive and ukanV for transitive.
+
+ izanV : Str -> Verb = \bizi ->
+ mkVerbDa bizi ** { prc = \\_ => bizi } ; -- Non-inflecting participle, auxtype is Da (nor): e.g. "bizi naiz", "beldur naiz"
+
+ egonV : Str -> Verb = \zain ->
+ mkVerbDaEgon zain ** { prc = \\_ => zain } ; -- Non-inflecting participle, auxtype is Da (nor), but with egon: e.g. "zain nago"
+
+
+ ukanV : Str -> Verb = \maite ->
+ mkVerbDu maite ** { prc = \\_ => maite } ; -- Non-inflecting participle, auxtype is Du (nor-nork): e.g, "maite zaitut"
+
+
+--2 Structural categories
+
+ mkPrep = overload {
+ mkPrep : Str -> Prep = \s ->
+ lin Prep (mkPost s genitive False) ; -- Default postposition: complement case genitive, not affixed; e.g. "nire atzean"
+
+ mkPrep : Str -> (complCase : Case) -> Prep = \s,compl ->
+ lin Prep (mkPost s compl False) ; -- Specify complement case; not affixed
+
+ mkPrep : Str -> (complCase : Case) -> (affixed : Bool) -> Prep = \s,compl,konf ->
+ lin Prep (mkPost s compl konf) ; -- Specify complement case and whether it is affixed
+ } ;
+
+ affixPrep : Str -> Case -> Prep = \str,cas ->
+ mkPrep str cas True ; -- Specify case, affix postposition to chosen case; e.g. neskaren+tzat `for the girl'
+
+
+ locPrep : Str -> Prep = \str ->
+ affixPrep str ResEus.LocStem ; -- Locative postpositions/cases attach to the same stem: mutile+tik, mutile+ra. Inessive is split into its own case, because of its behaviour with nouns ending in A.
+
+
+ mkConj : (_,_ : Str) -> Number -> Conj = \s1,s2,num -> lin Conj { s1 = s1 ; s2 = s2 ; nbr = num } ;
+ mkSubj : Str -> Bool -> Subj = \s,b -> lin Subj { s = s ; isPre = b } ;
+
+ mkAdv : Str -> Adv = \s -> lin Adv {s = s} ;
+
+ mkAdV : Str -> AdV = \s -> lin AdV {s = s} ;
+
+ mkAdA : Str -> AdA = \s -> lin AdA {s = s} ;
+
+
+--.
+-------------------------------------------------------------------------------
+-- The definitions should not bother the user of the API. So they are
+-- hidden from the document.
+
+ Number = ResEus.Number ;
+ sg = Sg ;
+ pl = Pl ;
+
+ AuxType = ResEus.AuxType ;
+ da = Da Izan ;
+ du = Du Ukan ;
+ zaio = Zaio ;
+ dio = Dio ;
+
+ Case = ResEus.Case ;
+ absolutive = Abs ;
+ ergative = Erg ;
+ dative = Dat ;
+ genitive = Gen ;
+ partitive = Par ;
+ inessive = Ine ;
+ instrumental = Ins ;
+ sociative = Soc ;
+
+ Animacy = ResEus.Bizi ;
+ animate = Anim ;
+ inanim = Inan ;
+
+--------------------------------------------------------------------------------
+
+}
+
diff --git a/src/basque/ParamEus.gf b/src/basque/ParamEus.gf
new file mode 100644
index 00000000..62ecf76f
--- /dev/null
+++ b/src/basque/ParamEus.gf
@@ -0,0 +1,101 @@
+resource ParamEus = ParamX ** open Prelude in {
+
+
+param
+
+ ClType = Stat | Indir | Qst ;
+
+
+ -- Every verb has some fully inflecting part:
+ -- if the whole verb is one of these synthetic verbs, then there won't be a participle
+ -- (or it's only in some tenses/persons/something).
+ -- AditzTrinkoak has all the inflection tables fully spelt out,
+ -- and here we just make nice neat set of parameters that go into the verbs.
+ SyntVerb1 = Izan | Egon | Ibili | Etorri | Joan ;
+ SyntVerb2 = Ukan | Jakin | Eduki ; --TODO others
+
+
+ AuxType = Da SyntVerb1
+ | Du SyntVerb2
+ | Zaio | Dio ; --always Ukan ?
+
+
+
+{-
+ Type of adjectival phrase, e.g.
+
+ kale txiki+a [APType = Bare]
+ itsaso+ra+ko kale+a [APType = Ko]
+-}
+ APType = Ko | Bare ;
+
+ AForm = AF Degree | AAdv ;
+
+ Bizi = Inan | Anim ;
+
+ Case = Abs | Erg | Dat | Par -- Core argument cases
+ | Gen | Soc | Ins | Ine -- Irregular stems
+ | LocStem ; -- LocStem is inessive without -an; many other cases use same stem!
+
+
+-- Degree = Posit | Compar | Superl | Excess ;
+ CardOrd = NCard | NOrd ;
+
+ Gender = Masc | Fem ;
+
+ Agr = Ni | Hi Gender | Zu | Hau | Gu | Zuek | Hauek ;
+
+ Phono = FinalA | FinalR | FinalCons | FinalVow ;
+
+
+oper
+ -- Opers to manipulate params.
+
+ sgAgr : Agr -> Agr = \agr ->
+ case agr of { Gu => Ni ;
+ Zuek => Zu ;
+ Hauek => Hau ;
+ agr => agr } ;
+
+ plAgr : Agr -> Agr = \agr ->
+ case agr of { Ni => Gu ;
+ Zu => Zuek ;
+ Hi _ => Zuek ;
+ Hau => Hauek ;
+ agr => agr } ;
+
+ getNum : Agr -> Number = \np ->
+ case np of {
+ (Ni|Hi _|Zu|Hau) => Sg ;
+ (Gu|Zuek|Hauek) => Pl
+ } ;
+
+ getPers : Agr -> Person = \np ->
+ case np of {
+ (Ni|Gu) => P1 ;
+ (Hi _ |Zu|Zuek) => P2 ;
+ (Hau|Hauek) => P3
+ } ;
+
+ subjCase : AuxType -> Case = \val ->
+ case val of {
+ Da _ => Abs ;
+ Zaio => Dat ;
+ _ => Erg } ;
+
+
+ isSynthetic : AuxType -> Bool = \val ->
+ case val of {
+ Da Izan => False ;
+ Du Ukan => False ;
+ Zaio => False ;
+ Dio => False ;
+ _ => True } ;
+
+ defaultAux : AuxType -> AuxType = \val ->
+ case val of {
+ Da _ => Da Izan ;
+ Du _ => Du Ukan ;
+ x => x } ;
+
+}
\ No newline at end of file
diff --git a/src/basque/PhraseEus.gf b/src/basque/PhraseEus.gf
new file mode 100644
index 00000000..506074bd
--- /dev/null
+++ b/src/basque/PhraseEus.gf
@@ -0,0 +1,32 @@
+concrete PhraseEus of Phrase = CatEus ** open Prelude, ResEus in {
+
+ lin
+ PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
+
+ UttS s = { s = s.s.beforeAux ++ s.s.aux.indep ++ s.s.afterAux } ;
+ UttQS qs = { s = let s = qs.s ! Qst
+ in s.beforeAux ++ s.aux.indep ++ s.afterAux } ;
+
+ UttImpSg pol imp =
+ let ez = case pol.p of { Pos => [] ; Neg => "ez" }
+ in { s = ez ++ imp.s } ;
+ UttImpPl = UttImpSg ;
+ UttImpPol = UttImpSg ;
+
+ UttIP ip = { s = ip.s ! Abs} ;
+ UttIAdv iadv = iadv ;
+ UttNP np = { s = np.s ! Abs} ;
+ UttVP vp = { s = linVP vp } ;
+ UttAdv adv = adv ;
+ UttCN n = {s = n.s ! Hau ++ artDef ! Sg ! Abs ! n.ph } ;
+ UttCard n = n ;
+ UttAP ap = ap ;
+ UttInterj i = i ;
+
+ NoPConj = {s = []} ;
+ PConjConj conj = { s = conj.s1 ++ conj.s2 } ;
+
+ NoVoc = {s = []} ;
+ VocNP np = { s = "," ++ np.s ! Abs } ;
+
+}
\ No newline at end of file
diff --git a/src/basque/QuestionEus.gf b/src/basque/QuestionEus.gf
new file mode 100644
index 00000000..76c3dfb0
--- /dev/null
+++ b/src/basque/QuestionEus.gf
@@ -0,0 +1,81 @@
+concrete QuestionEus of Question = CatEus ** open ResEus, (VE=VerbEus), (NE=NounEus), (AE=AdverbEus) in {
+
+-- A question can be formed from a clause ('yes-no question') or
+-- with an interrogative.
+
+ lin
+ -- : Cl -> QCl ;
+ QuestCl cl = cl ; --Cl and QCl are both ResEus.Clause :
+ -- { s : Tense => Anteriority => Polarity => Sentence } ;
+
+ -- : IP -> VP -> QCl ;
+ QuestVP = qclFromVP ;
+
+ -- : IP -> ClSlash -> QCl ; -- whom does John love / mutilak nor maite du
+ QuestSlash = clFromSlash ;
+
+ -- : IAdv -> Cl -> QCl ; -- why does John walk
+ -- nola (how), zerbait (how much), noiz (when), non (where), zergatik (why)
+ QuestIAdv iadv cl =
+ { s = \\t,a,p,c =>
+ let sent = cl.s ! t ! a ! p ! Indir ; -- no "al" with a wh-word!
+ in { beforeAux = iadv.s ++ sent.beforeAux ;
+ aux = sent.aux ;
+ afterAux = sent.afterAux }
+ } ;
+
+ -- : IComp -> NP -> QCl ; -- John non da ; TODO maybe other word order, non da John?
+ QuestIComp icomp np = qclFromVP np (insertComp icomp.s (VE.copulaVP Izan)) ;
+
+-- Interrogative pronouns can be formed with interrogative
+-- determiners, with or without a noun.
+
+ -- : IDet -> CN -> IP ; -- which five songs
+ IdetCN = NE.DetCN ;
+
+ -- : IDet -> IP ; -- which five
+ IdetIP = NE.DetNP ;
+
+-- They can be modified with adverbs.
+ -- : IP -> Adv -> IP ; -- who in Paris
+ AdvIP = NE.AdvNP ;
+
+-- Interrogative quantifiers have number forms and can take number modifiers.
+
+ -- : IQuant -> Num -> IDet ; -- which (five)
+ IdetQuant = NE.DetQuant ;
+
+-- Interrogative adverbs can be formed prepositionally.
+ -- : Prep -> IP -> IAdv ; -- with whom
+ PrepIP = AE.PrepNP ;
+
+-- They can be modified with other adverbs.
+
+ -- : IAdv -> Adv -> IAdv ; -- where in Paris
+ AdvIAdv = AE.AdAdv ;
+
+-- Interrogative complements to copulas can be both adverbs and
+-- pronouns.
+
+ -- : IAdv -> IComp ;
+ CompIAdv iadv = iadv ; -- where (is it)
+
+ -- : IP -> IComp ;
+ CompIP ip = { s = ip.s ! Abs } ; -- who (is it)
+
+{-
+-- More $IP$, $IDet$, and $IAdv$ are defined in $Structural$.
+
+-- Wh questions with two or more question words require a new, special category.
+
+ cat
+ QVP ; -- buy what where
+ fun
+ ComplSlashIP : VPSlash -> IP -> QVP ; -- buys what
+ AdvQVP : VP -> IAdv -> QVP ; -- lives where
+ AddAdvQVP : QVP -> IAdv -> QVP ; -- buys what where
+
+ QuestQVP : IP -> QVP -> QCl ; -- who buys what where
+-}
+
+}
\ No newline at end of file
diff --git a/src/basque/RelativeEus.gf b/src/basque/RelativeEus.gf
new file mode 100644
index 00000000..ba0b72d3
--- /dev/null
+++ b/src/basque/RelativeEus.gf
@@ -0,0 +1,62 @@
+concrete RelativeEus of Relative = CatEus ** open ResEus, Prelude, (NE=NounEus), (SE=StructuralEus) in {
+
+
+lin
+ -- : Cl -> RCl ; -- such that John loves her ????
+ RelCl cl = { -- TODO: this is likely horribly wrong!
+ s = \\t,a,pol,agr =>
+ let sent = cl.s ! t ! a ! pol ! Stat ;
+ in sent.beforeAux ++ sent.aux.indep ++ sent.afterAux } ;
+
+ -- : RP -> VP -> RCl ;
+ RelVP rp vp = ResEus.rclFromVP rp.s vp ;
+
+ -- : RP -> ClSlash -> RCl ; -- whom John loves
+ RelSlash rp cls = ResEus.rclFromSlash rp.s cls ;
+
+
+ -- : RP ;
+ IdRP = { s = BIND ++ "n" } ;
+
+ -- : Prep -> NP -> RP -> RP ; -- the mother of whom
+ FunRP prep np rp = { s = applyPost prep whom ++ np.s ! Abs }
+ where { num = case np.agr of {
+ Hau => NE.NumSg ;
+ _ => NE.NumPl } ;
+ whom = NE.DetNP (NE.DetQuant SE.which_IQuant num) } ;
+
+{-
+12:18:16 < inariksit> or "the dog, to whom I sing"
+12:18:25 < inariksit> or "the dog, with whom I walk"
+12:18:55 < spectei> "the mother of whom?" = "la madre de quien?" = "noren ama?"
+12:19:37 < olatz> txakurra, zeinari abesten diodan. Would be the tranlsation, but....
+12:20:35 < inariksit> it's just like "the dog who loves beer" = "garagardoa maite duten txakurra", but now with a preposition; "the dog to whom the owner sings"
+12:21:04 < olatz> spectei, yes! and "zeinen ama?" too
+12:21:39 < olatz> jabeak abesten dion txakurra
+
+12:22:36 < olatz> those are very complicated sentences!!
+12:22:37 < olatz> hahah
+12:23:02 < olatz> "the dog, to whom I sing" -> abesten diodan txakurra
+12:24:11 < inariksit> aah yeah, you have to change the copula too
+
+12:27:23 < olatz> the dog, with whom I walk -> txakurra, zeinarekin ibiltzen naizen (this is absolutely not natural for basque :-S)
+12:29:27 < olatz> I walk with you -> zurekin ibiltzen naiz
+12:29:40 < olatz> I walk with the dog -> Txakurrarekin ibiltzen naiz
+12:30:40 < olatz> so..... walk with -> -kin ibili. but..... the dog,.... must be absolutive
+12:32:18 < spectei> yeah, you are missing a kind of word
+12:32:36 < spectei> that kind of word is a pro-NP that stands in place of the thing that the relative is modifying
+12:32:46 < olatz> txakurra, zeinarekin ibiltzen naizen
+12:32:53 < spectei> like HARGLE-kin ibiltzen naizen txakurra
+12:32:53 < begiak> bargle!
+12:33:02 < inariksit> so this kind of clause wouldn't come before the txakurra?
+12:33:41 < inariksit> like (nik) maite duten txakurra or (nik) abesten diodan txakurra
+12:34:18 < olatz> yes.... zeinarekin....
+12:35:54 < spectei> olatz, so "zeinarekin ibiltzen naizen txakurra" would be syntactically well formed?
+12:38:18 < olatz> I would say... txakurra, zeinarekin ibiltzen naizen
+12:39:20 < spectei> ok
+12:39:28 < olatz> I'm not a linguist so I'm not sure about the syntactic correctness of the one above, but I would correct it if one my
+ students writes it.
+
+-}
+
+}
\ No newline at end of file
diff --git a/src/basque/ResEus.gf b/src/basque/ResEus.gf
new file mode 100644
index 00000000..5dc60db1
--- /dev/null
+++ b/src/basque/ResEus.gf
@@ -0,0 +1,618 @@
+resource ResEus = ParamEus ** open TenseX, AditzTrinkoak, Prelude in {
+
+flags optimize=all ;
+coding=utf8 ;
+
+
+--------------------------------------------------------------------
+-- Articles
+oper
+
+ artDef : Number => Case => Phono => Str =
+ let artASg = table {Abs => finalR "a" ; --itsaso+a ; txakur+ra
+ Erg => finalR "ak" ;
+ Dat => finalR "ari" ;
+ Gen => finalR "aren" ;
+ Soc => finalR "arekin" ;
+ Ins => finalR "az" ;
+
+ Par => table {FinalA => BIND ++ "arik" ; --nesk+arik
+ FinalCons => BIND ++ "ik" ; --mutil+ik
+ _ => BIND ++ "rik" } ; --txakur+rik, itsaso+rik
+
+ Ine => table {FinalCons => BIND ++ "ean" ; --mutil+ean
+ FinalR => BIND ++ "rean" ; --txakur+rean
+ _ => BIND ++ "an" } ;--itsaso+an, nesk+an
+
+ LocStem => table {FinalCons => BIND ++ "e" ; --mutile+tik
+ FinalR => BIND ++ "re" ; --txakurre+tik
+ FinalA => BIND ++ "a" ; --neska+tik
+ _ => [] } --itsaso+tik
+ };
+ in table {Sg => artASg ;
+ Pl => table {Abs => finalR "ak" ;
+ Erg => finalR "ek" ;
+ Dat => finalR "ei" ;
+ Gen => finalR "en" ;
+ Soc => finalR "ekin" ;
+ Ins => finalR "ez" ;
+ Ine => finalR "etan" ;
+ LocStem => finalR "eta" ; --txakur+ret+atik
+ Par => artASg ! Par --invariant number in partitive
+ }
+ } ;
+
+ artIndef : Case => Phono => Str =
+ \\cas,pho => case of {
+ => artDef ! Sg ! Abs ! FinalA ;
+ => [] ;
+ => artDef ! Pl ! c ! ph } ;
+
+
+ finalR : Str -> (Phono => Str) = \ak ->
+ let rak : Str = "r" + ak ;
+ in table {FinalR => BIND ++ rak ;
+ _ => BIND ++ ak } ;
+
+
+
+--------------------------------------------------------------------
+-- Det, Quant
+
+ Determiner : Type = BaseDet **
+ { s : Case => Phono => Str ; -- hauek
+ nbr : Number } ;
+
+ indefDet : Str -> Number -> Determiner = \zenbait,num ->
+ { s = artIndef ;
+ indep = True ;
+ nbr = num ;
+ pref = zenbait ;
+ isDef = False } ;
+
+ defDet : Str -> Number -> Determiner = \s,n ->
+ indefDet s n ** { isDef = True } ;
+
+ Quant : Type = BaseDet ** { s : Number => Case => Phono => Str } ;
+
+ BaseDet : Type = { indep : Bool ;
+ pref : Str ; -- nire
+ isDef : Bool } ;
+
+ quantHau : Number => Case => Phono => Str =
+ \\num,cas,ph =>
+ let a = case ph of { FinalA => BIND ++ "a" ; _ => [] } ;
+ in case of {
+ => a ++ "hau" ;
+ => a ++ "honek" ;
+ => a ++ "honi" ;
+ => a ++ "honen" ;
+ => a ++ "honekin" ;
+ => a ++ "honetaz" ;
+ => a ++ "honetan" ;
+ => a ++ "honeta" ;
+ => a ++ "hauek" ;
+ => a ++ "hauek" ;
+ => a ++ "hauei" ;
+ => a ++ "hauen" ;
+ => a ++ "hauekin" ;
+ => a ++ "hauetaz" ;
+ => a ++ "hauetan" ;
+ => a ++ "haueta" ;
+ <_,Par> => artIndef ! Par ! ph ++ "hau" --TODO: check how to handle partitive
+ } ;
+
+ quantHori : Number => Case => Phono => Str =
+ \\num,cas,ph =>
+ let a = case ph of { FinalA => BIND ++ "a" ; _ => [] } ;
+ in case of {
+ => a ++ "hori" ;
+ => a ++ "horrek" ;
+ => a ++ "horri" ;
+ => a ++ "horren" ;
+ => a ++ "horrekin" ;
+ => a ++ "horretaz" ;
+ => a ++ "horretan" ;
+ => a ++ "horreta" ;
+ => a ++ "horiek" ;
+ => a ++ "horiek" ;
+ => a ++ "horiei" ;
+ => a ++ "horien" ;
+ => a ++ "horiekin" ;
+ => a ++ "horietaz" ;
+ => a ++ "horietan" ;
+ => a ++ "horieta" ;
+ <_,Par> => artIndef ! Par ! ph ++ "hori"
+ } ;
+
+--------------------------------------------------------------------
+-- Nouns and NPs
+
+ Noun : Type = { s : Str ; --for nouns ending in -a, we chop off the -a, and add it in the article + cases.
+ ph : Phono ;
+ anim : Bizi } ;
+
+ Noun2 : Type = Noun ** { compl1 : Postposizio } ; -- "mother of X": genitive?
+ Noun3 : Type = Noun2 ** { compl2 : Postposizio } ; -- "mother of X": genitive?
+
+ PNoun : Type = Noun ** { nbr : Number } ;
+
+ mkNoun : Str -> Noun = \s ->
+ let stem : Str = case last s of {
+ "a" => init s ;
+ _ => s } ;
+ phono : Phono = case last s of {
+ "a" => FinalA ;
+ "r" => FinalR ;
+ ("e"|"i"|"o"|"u") => FinalVow ;
+ _ => FinalCons }
+ in { s = stem ; ph = phono ; anim=Inan } ;
+
+ mkNoun2 : Str -> Case -> Noun2 = \s,cas -> mkNoun s ** { compl1 = mkPost [] cas False } ;
+
+ mkPNoun : Str -> PNoun = \s -> mkNoun s ** {nbr = Sg ; anim=Anim} ;
+
+
+
+ CNoun : Type = { s : Agr => Str ; -- When we combine CN with RS, we introduce Agr distinction
+ comp : Str ; -- For PartNP; "s = baso | bat | comp = ardo gorri"
+ ph : Phono ;
+ anim : Bizi ;
+ heavyMod : Agr => Str } ; -- Relative clause or adverbial
+ -- If it's "heavy", numbers and possessives come after.
+ -- "Light" modifiers attach directly to the s.
+
+ linCNIndef : CNoun -> Str = linCN False ;
+ linCNDef : CNoun -> Str = linCN True ;
+
+ linCN : Bool -> CNoun -> Str = \isDef,cn ->
+ let art = if_then_else (Case => Phono => Str) isDef (artDef ! Sg) artIndef ;
+ in cn.heavyMod ! Hau -- e.g. rel clause, adverb
+ ++ cn.s ! Hau -- baso handi
+ ++ art ! Abs ! cn.ph -- &+a / bat / -
+ ++ cn.comp ; -- ardo gorri
+
+
+
+ useN : Noun -> CNoun = \n -> n ** { s = \\_ => n.s ;
+ comp = [] ;
+ heavyMod = \\_ => [] } ;
+
+ Complement : Type = { s : Agr => Str ;
+ copula : SyntVerb1 } ;
+
+
+ NounPhrase : Type = { s : Case => Str ;
+ stem : Str ; -- without article, used in ApposCN
+ agr : Agr ;
+ anim : Bizi ;
+ isDef : Bool } ;
+
+-- NounPhrase is a record
+-- a record is a thing with fields
+-- fields can be any type
+-- exempelvis, NounPhrase is a record with two fields
+-- the two fields are .s. and .agr.
+-- the field .s. is a table from Case => Str ... e.g. it has two columns, first column is Case and second column is Str
+-- last column is return type, all other columns are arguments
+-- exempelvis:
+--- { Abs => "hargle"; Erg => "bargle" }
+-- the field .agr. is of type Agr.
+
+ buru_NP : NounPhrase = { s = \\_ => "buru" ;
+ stem = "buru" ;
+ agr = Hau ;
+ anim = Anim ;
+ isDef = True } ;
+
+--------------------------------------------------------------------
+-- Postpositions
+
+ Postposizio : Type = { s : Str ;
+ complCase : Case ; -- dirurik gabe : Par
+ -- hormaren kontra : Gen
+ affixed : Bool } ;
+
+ mkPost : Str -> Case -> Bool -> Postposizio = \ko,loc,b ->
+ { s = ko ; complCase = loc ; affixed = b } ;
+
+ noPost : Postposizio = mkPost [] Abs False ;
+
+ glueIf : Bool -> (_,_ : Str) -> Str = \affixed,a,b ->
+ if_then_Str affixed (glue a b) (a ++ b) ;
+
+ applyPost : Postposizio -> NounPhrase -> Str = \post,np ->
+ glueIf post.affixed (np.s ! post.complCase) post.s ;
+
+--------------------------------------------------------------------
+-- Pronoun
+
+ Pronoun : Type = NounPhrase ;
+
+ persPron : (x1,_,_,_,x5 : Str) -> Agr -> Pronoun = \nor,nori,nork,nore,zertaz,a->
+ { s = table { Erg => nork ;
+ Abs => nor ;
+ Dat => nori ;
+ Par => nonExist ;
+ Gen => nore ;
+ Soc => nore + "kin" ;
+ Ins => zertaz ;
+ Ine => init zertaz + "n" ;
+ LocStem => init zertaz
+ } ;
+ stem = nor ;
+ agr = a ;
+ anim = Anim ;
+ isDef = True } ;
+
+ inanPron : (x1,_,_,_,x5 : Str) -> Agr -> Pronoun = \zer,zeri,zerk,zere,zertaz,a ->
+ persPron zer zeri zerk zere zertaz a ** { anim = Inan } ;
+
+
+--------------------------------------------------------------------
+-- Adjective and AP
+
+ Adjective : Type = {s : AForm => Str ; ph : Phono} ;
+
+ Adjective2 : Type = Adjective ** { compl : Postposizio } ;
+
+ AdjPhrase : Type = {s : Str ; ph : Phono ; typ : APType} ;
+
+ regAdj : Str -> Adjective = \s ->
+ let stem : Str = case last s of {
+ "a" => init s ;
+ _ => s } ;
+ phono : Phono = case last s of {
+ "a" => FinalA ;
+ "r" => FinalR ;
+ ("e"|"i"|"o"|"u") => FinalVow ;
+ _ => FinalCons }
+ in { s = table { AF Posit => stem ;
+ AF Compar => stem + "ago" ;
+ AF Superl => stem + "en" ;
+ AAdv => stem + "ki" } ;
+ -- Excess => stem + "egi" } ;
+ ph = phono } ;
+ irregAdvAdj : Str -> Adjective -> Adjective = \adv,a ->
+ a ** { s = table { AAdv => adv ;
+ x => a.s ! x } } ;
+
+--------------------------------------------------------------------
+-- Verbs
+
+
+oper
+
+ Verb : Type = { prc : Tense => Str ;
+ nstem : Str ; -- Nominal stem : ibiltze
+ val : AuxType --TODO change name of the field
+ } ;
+
+ mkVerbDa : Str -> Verb = \s -> { val = Da Izan ;
+ nstem = mkNStem s ;
+ prc = mkPrc s } ;
+
+ mkVerbDaEgon : Str -> Verb = \s -> { val = Da Egon ;
+ nstem = mkNStem s ;
+ prc = mkPrc s } ;
+
+ mkVerbDu : Str -> Verb = \s -> { val = Du Ukan ;
+ nstem = mkNStem s ;
+ prc = mkPrc s } ;
+
+ mkVerbDio : Str -> Verb = \s -> { val = Dio ;
+ nstem = mkNStem s ;
+ prc = mkPrc s } ;
+
+ -- Synthetic verbs
+ syntVerbDa : Str -> SyntVerb1 -> Verb = \sEtorri,pEtorri ->
+ mkVerbDa sEtorri ** { val = Da pEtorri } ;
+
+ syntVerbDu : Str -> SyntVerb2 -> Verb = \sJakin,pJakin ->
+ mkVerbDu sJakin ** { val = Du pJakin } ;
+
+ mkNStem : Str -> Str = \ikusi ->
+ let ikus : Str = case ikusi of {
+ _ + ("du"|"tu") => init (init ikusi) ; -- ager+tu
+ _ + ("p"|"t"|"k"
+ |"b"|"d"|"g")
+ + "i" => ikusi ; -- jaiki
+ _ + "ri" => init (init ikusi) ; -- etor+ri
+ _ + "i" => init ikusi ; -- ibil+i
+ _ + "l" => ikusi ; -- hil
+ _ + "n" => ikusi ; --init ikusi ; -- jan
+ _ => init ikusi } ;
+ in case ikus of { x + "n" => x + "te" ;
+ x + "ts" => x + "ste" ;
+ _ + ("s"|"z") => ikus + "te" ;
+ _ => ikus + "tze" } ;
+
+ mkPrc : Str -> (ResEus.Tense => Str) = \ikusi ->
+ let ikuste = mkNStem ikusi ;
+ ikusiko : Str = case last ikusi of {
+ "n" => ikusi + "go" ;
+ _ => ikusi + "ko" } ;
+ in table { Pres => ikuste + "n" ;
+ Fut => ikusiko ;
+ _ => ikusi } ;
+
+
+--------------------------------------------------------------------
+-- VP and VPSlash
+
+ DObj : Type = Polarity => Str ;
+
+ VerbPhrase : Type =
+ Verb ** { dobj : { s : DObj ;
+ agr : Agr ;
+ isDef : Bool } ; --Indefinite direct object turns into Partitive with negative polarity.
+ iobj : { s : Str ;
+ agr : Agr } ;
+ comp : Agr => Str ; -- Comps depend on Agr; AuxType is always Nor.
+ adv : Str } ;
+
+
+ VPSlash : Type = --VPSlashPrep may specify a postposition to use (for adv slot)
+ VerbPhrase ** { post : Postposizio ;
+ missing : MissingArg } ;
+
+
+param
+ MissingArg = MissingAdv | MissingDObj | MissingIObj ;
+
+oper
+ --to be used in linref, PhraseEus ... anything where a VP is turned into string!
+ linVP : VerbPhrase -> Str = linVPTense Pres Pres ;
+
+ linVPTense : Tense -> Tense -> VerbPhrase -> Str =
+ \tnsPrc,tnsAux,vp ->
+ let prc = case vp.val of {
+ Da Izan => vp.nstem ;
+ Da Egon => vp.nstem ;
+ _ => vp.prc ! tnsPrc } ;
+ in
+ vp.adv
+ ++ vp.iobj.s ++ vp.dobj.s ! Pos ++ vp.comp ! Hau --all the compls!
+ ++ prc
+ ++ (chooseAux vp ! tnsAux ! Hau).indep ;
+
+ -- Used in ComplVV : does not include aux!
+ linVPPrc : VerbPhrase -> Str = \vp -> --TODO make it less of a hack.
+ vp.adv
+ ++ vp.iobj.s ++ vp.dobj.s ! Pos ++ vp.comp ! Hau --all the compls!
+ ++ vp.prc ! Past ; --If we choose Past, then it will work with Jakin ...
+
+
+ -----
+ -- Create VP or VPSlash from various Verbs
+
+ useV : Verb -> VerbPhrase = \v ->
+ v ** { dobj = { agr = Hau ; -- This will be used for *all* V* becoming VP!
+ -- e.g. VQ, VS, ... will use a Du copula, but
+ -- the sentence complement will be stored in comp field.
+ -- This is because of V2Q, V2S versions you need both!
+ --
+ -- In the VQ, VS... version, dObj agreement is always Hau. (No exceptions?)
+ -- So this function, while looking dangerous, should do the Right Thing.
+ s = \\agr => [] ;
+ isDef = True } ; --so that we don't choose singular agreement with negative polarity
+ iobj = { s = [] ;
+ agr = Hau } ;
+ adv = [] ;
+ comp = \\agr => [] } ;
+
+ slashV : MissingArg -> Verb -> VPSlash = \missingArg,vstar -> useV vstar **
+ { post = noPost ;
+ missing = missingArg } ;
+
+ slashDObj : Verb -> VPSlash = slashV MissingDObj ; --works for V2, V2V, V2S, V2Q, V2A.
+
+ slashIObj : Verb -> VPSlash = slashV MissingIObj ; --only Slash3V3
+
+ -----
+ -- Modify existing VPs
+
+ insertAdv : SS -> VerbPhrase -> VerbPhrase = \a,vp ->
+ vp ** { adv = vp.adv ++ a.s } ;
+
+
+ insertComp = overload {
+
+ insertComp : (Agr => Str) -> VerbPhrase -> VerbPhrase = \c,vp ->
+ vp ** { comp = \\agr => vp.comp ! agr ++ c ! agr } ;
+
+ insertComp : Str -> VerbPhrase -> VerbPhrase = \cStr,vp ->
+ vp ** { comp = \\agr => vp.comp ! agr ++ cStr } ;
+ } ;
+
+ -----
+ -- Complete VPSlash into VP
+
+ complSlash : VPSlash -> NounPhrase -> VerbPhrase = \vps,np ->
+ case vps.missing of {
+ MissingAdv => vps ** { adv = applyPost vps.post np } ;
+ MissingIObj => vps ** { iobj = np ** { s = np.s ! Dat }} ;
+ MissingDObj => vps ** { dobj = np ** { s = mkDObj np }}
+ } ;
+
+ mkDObj : NounPhrase -> DObj = \np ->
+ table { Pos => np.s ! Abs ;
+ Neg => np.s ! negCase }
+ where { negCase = if_then_else Case np.isDef Abs Par } ;
+
+--------------------------------------------------------------------
+-- Clause and sentence
+
+ Sentence : Type = { beforeAux : Str ;
+ aux : VForms ; -- Need to keep this open for SubjS
+ afterAux : Str } ;
+
+ -- to be used for linref, PhraseEus, etc.
+ linS : Sentence -> Str = \sent ->
+ sent.beforeAux ++ sent.aux.indep ++ sent.afterAux ;
+
+ linSSub : Sentence -> Str -> Str = \sent,subj ->
+ sent.beforeAux ++ glue sent.aux.stem subj ++ sent.afterAux ;
+
+ Clause : Type = { s : Tense => Anteriority => Polarity => ClType => Sentence } ;
+
+ linCl : Clause -> Str = \clause ->
+ linS (clause.s ! Pres ! Simul ! Pos ! Stat) ;
+
+-- ez al duzu katu beltza ikusi? / ez al duzu katu beltzik ikusi? (MassNP)
+-- ez dut katu beltza ikusi / ez dut katu beltzik ikusi (MassNP)
+-- ibiltzen al zara ; garagardoa edaten al duzu? ; nor dabil?
+-- mutilari garagardoa ematen al diozu?
+-- txakurrari abesten al diozu?
+
+
+ qclFromVP = mkClause True ;
+ clFromVP = mkClause False ;
+
+ clFromSlash : NounPhrase -> ClSlash -> Clause = \o,cls ->
+ let obj = o ** { s = mkDObj o } ;
+ vp = cls ** { dobj = obj } ; --Insert the object's agr into the cls's dobj!
+ subj = buru_NP ** cls.subj ; -- Just a dummy NP, we won't use more than is in cls.subj
+ in mkClause True subj vp ;
+
+ mkClause : (isIP : Bool) -> NounPhrase -> VerbPhrase -> Clause = \isIP,subj,vp ->
+ { s = \\t,a,pol =>
+ let verb = case isSynthetic vp.val of {
+ True => verbformSynthetic t a vp ;
+ False => verbformPeriphrastic t a vp
+ } ;
+ sc : Case = subjCase vp.val ;
+ in wordOrder isIP
+ { pol = pol ;
+ adv = vp.adv ;
+ subj = subj.s ! sc ;
+ compl = vp.iobj.s -- mutilari
+ ++ vp.dobj.s ! pol -- garagardoa / garagardorik
+ ++ vp.comp ! subj.agr ; -- etorriko dela / nor den / handi(ak) / ...
+ prc = verb.prc ;
+ aux = verb.aux ! subj.agr }
+ } ;
+
+ verbformPeriphrastic : Tense -> Anteriority -> VerbPhrase -> {aux : Agr => VForms ; prc : Str} = \t,a,vp ->
+ let adl : IntransV = chooseAux vp ;
+ in case of {
+ => {aux = adl ! Pres ; prc = vp.prc ! Pres} ; --noa / lo egiten da
+ => {aux = adl ! Pres ; prc = vp.prc ! Past} ; --joan da / lo egin da
+ => {aux = adl ! Past ; prc = vp.prc ! Pres} ; --nindoan / lo egiten zen
+ => {aux = adl ! Past ; prc = vp.prc ! Past} ; --joan nintzen / ...
+ => {aux = adl ! Pres ; prc = vp.prc ! Fut} ; --joango da
+ => {aux = adl ! Pres ; prc = vp.prc ! Fut} ; --joango nintzen
+ => {aux = adl ! Cond ; prc = vp.prc ! Fut} ; --joango nintzateke
+ => {aux = adl ! Cond ; prc = vp.prc ! Past} } ;--joan nintzateke
+
+ --TODO: write a fallback for synthetic verbs without all forms
+ verbformSynthetic : Tense -> Anteriority -> VerbPhrase -> {aux : Agr => VForms ; prc : Str} = \t,a,vp ->
+ let adt : IntransV = chooseAux vp ;
+ in case of {
+ => {aux = adt ! Pres ; prc = []} ; --noa
+ => {aux = adt ! Past ; prc = []} ; --nindoan
+ _ => verbformPeriphrastic t a (vp ** {val = defaultAux vp.val}) } ;
+
+
+
+ chooseAux : VerbPhrase -> IntransV = chooseAuxPol Pos ;
+
+ --TODO: add other synthetic transitive verbs
+ chooseAuxPol : Polarity -> VerbPhrase -> IntransV = \pol,vp ->
+ case vp.val of {
+ Da x => AditzTrinkoak.syntIntransVerb (Da x) ;
+
+ Zaio => AditzTrinkoak.ukanZaio ! vp.iobj.agr ; --are there other Zaio (nor-nori) verbs?
+
+ Du x =>
+ let aux = AditzTrinkoak.syntTransVerb (Du x)
+ in case of {
+ => aux ! sgAgr vp.dobj.agr;
+ _ => aux ! vp.dobj.agr } ;
+
+ Dio =>
+ case of {
+ => AditzTrinkoak.ukanDio ! vp.iobj.agr ! sgAgr vp.dobj.agr ;
+ _ => AditzTrinkoak.ukanDio ! vp.iobj.agr ! vp.dobj.agr} } ;
+
+
+ wordOrder : (isIP : Bool) -> SentenceLight -> (ClType => Sentence) = \isIP,s ->
+ \\ct =>
+ let al = case ct of { Qst => if_then_Str isIP [] "al" ;
+ _ => [] } ;
+ in case s.pol of {
+ Pos => { beforeAux = s.adv ++ s.subj ++ s.compl ++ s.prc ++ al ;
+ aux = s.aux ;
+ afterAux = [] } ;
+ Neg => { beforeAux = s.adv ++ s.subj ++ "ez" ++ al ;
+ aux = s.aux ;
+ afterAux = s.compl ++ s.prc }
+ } ;
+
+ --just an internal type, to give as an argument to wordOrder
+ SentenceLight : Type = { pol : Polarity ;
+ adv : Str ; --heavyAdv and lightAdv?
+ subj : Str ;
+ compl : Str ;
+ prc : Str ;
+ aux : VForms } ;
+
+
+------------------------------------------------
+-- ClSlash: has verb and subject, missing object
+ ClSlash : Type = VerbPhrase ** { subj : {s : Case => Str ; agr : Agr } } ;
+
+
+ mkClSlash : NounPhrase -> VPSlash -> ClSlash = \np,vps ->
+ let sc : Case = subjCase vps.val ;
+ in vps ** { subj = np };
+
+------------------------------------------------
+-- Relative clause
+-- We need to keep agreement, because a RS may be attached to a CN or NP,
+-- and we need to produce correct agreement:
+-- `gorria den txakurra' vs. `gorriak diren txakurrak'
+
+ RClause : Type = {s : Tense => Anteriority => Polarity => Agr => Str } ;
+
+ rclFromVP : Str -> VerbPhrase -> RClause = \en,vp ->
+ mkRCl en (vp ** { subj = { s = \\_ => [] ; agr = Hau } ; -- Subj agr will change later
+ objFixed = True }) ;
+
+ rclFromSlash : Str -> ClSlash -> RClause = \en,cls ->
+ mkRCl en (cls ** { objFixed = False }) ;
+
+
+ mkRCl : Str -> (ClSlash ** {objFixed : Bool}) -> RClause = \en,cls ->
+ { s = \\t,a,pol,agr =>
+ let ez = case pol of { Neg => "ez" ; _ => [] } ;
+ objAgr : Agr = case cls.objFixed of {
+ True => cls.dobj.agr ;
+ False => agr } ;
+ subjAgr : Agr = case cls.objFixed of {
+ True => agr ;
+ False => cls.subj.agr } ;
+ sc : Case = subjCase cls.val ;
+
+ -- We make sure that the agr param in RS affects the right argument
+ cls' = cls ** { dobj = cls.dobj ** { agr = objAgr } ;
+ subj = cls.subj ** { agr = subjAgr } } ;
+
+ verb = case isSynthetic cls.val of {
+ True => verbformSynthetic t a cls' ;
+ False => verbformPeriphrastic t a cls' } ;
+ in cls'.adv
+ --- One of the following ---
+ ++ cls'.iobj.s -- mutilari (If coming from ClSlash,
+ ++ cls'.dobj.s ! pol -- garagardoa these are empty)
+ ++ cls'.comp ! agr
+
+ ++ cls'.subj.s ! sc -- mutilak (If coming from VP, this is empty)
+
+ --- Common to VP and ClSlash ---
+ ++ verb.prc -- maite
+ ++ ez -- (ez)
+ ++ (verb.aux ! subjAgr).stem -- d(it)u
+ ++ en -- en
+ } ;
+}
\ No newline at end of file
diff --git a/src/basque/SentenceEus.gf b/src/basque/SentenceEus.gf
new file mode 100644
index 00000000..8501afc5
--- /dev/null
+++ b/src/basque/SentenceEus.gf
@@ -0,0 +1,95 @@
+concrete SentenceEus of Sentence = CatEus ** open TenseX, ResEus, AditzTrinkoak, (AE=AdverbEus), Prelude in {
+
+flags optimize=all_subs ;
+
+lin
+
+--2 Clauses
+
+ -- : NP -> VP -> Cl
+ PredVP = clFromVP ;
+
+ -- : SC -> VP -> Cl ; -- that she goes is good
+ PredSCVP sc vp =
+ let subjSC = invarNP sc.s
+ in clFromVP subjSC vp ;
+
+--2 Clauses missing object noun phrases
+ -- : NP -> VPSlash -> ClSlash ;
+ SlashVP = mkClSlash ;
+
+ -- : ClSlash -> Adv -> ClSlash ; -- (whom) he sees today
+ AdvSlash cls adv = cls ** insertAdv adv cls ;
+
+-- SlashPrep : Cl -> Prep -> ClSlash ; -- (with whom) he walks
+
+ -- : NP -> VS -> SSlash -> ClSlash ; -- (whom) she says that he loves
+-- SlashVS np vs ss = {} ;
+
+
+ -- : Temp -> Pol -> ClSlash -> SSlash ; -- (that) she had not seen
+ UseSlash t p cls =
+ let emptyObj = invarNP [] ; --TODO: object agr is Hau, might this cause problems later?
+ cl = clFromSlash emptyObj cls
+ in UseCl t p cl ;
+
+--2 Imperatives
+ -- : VP -> Imp ;
+ ImpVP vp = { s = linVPPrc vp } ; --TODO: check negation
+
+--2 Embedded sentences
+
+
+ -- : S -> SC ;
+ EmbedS s = { s = linSSub s.s "la" } ; -- datorrela
+
+ -- : QS -> SC ;
+ EmbedQS qs = { s = linSSub (qs.s ! Indir) "la" } ; --???
+
+ -- : VP -> SC ; -- ikusi
+ EmbedVP vp = { s = linVPPrc vp } ;
+
+--2 Sentences
+
+
+ -- : Temp -> Pol -> Cl -> S ;
+ UseCl temp pol cl = { s = cl.s ! temp.t ! temp.a ! pol.p ! Stat } ;
+
+ -- : Temp -> Pol -> RCl -> RS ;
+ UseRCl temp pol cl = { s = cl.s ! temp.t ! temp.a ! pol.p } ;
+
+ -- : Temp -> Pol -> QCl -> QS ;
+ UseQCl temp pol qcl = { s = qcl.s ! temp.t ! temp.a ! pol.p } ;
+
+-- An adverb can be added to the beginning of a sentence, either with comma ("externally")
+-- or without:
+
+ -- : Adv -> S -> S ; -- then I will go home
+ AdvS adv = insertBeforeAux adv.s ;
+
+ -- : Adv -> S -> S ; -- next week, I will go home
+ ExtAdvS adv = insertBeforeAux (adv.s ++ SOFT_BIND ++ ",") ;
+
+-- There's an SubjS already in AdverbEus -- should this be deprecated?
+ -- : S -> Subj -> S -> S ;
+ SSubjS s1 subj s2 = AdvS (AE.SubjS subj s2) s1 ;
+
+
+-- A sentence can be modified by a relative clause referring to its contents.
+
+ -- : S -> RS -> S ; -- she sleeps, which is good
+ RelS sent rs = insertBeforeAux (rs.s ! Hau ++ SOFT_BIND ++ ",") sent ;
+
+oper
+ insertBeforeAux : Str -> { s : Sentence } -> { s : Sentence } = \str,sent ->
+ let newS = sent.s ** { beforeAux = str ++ sent.s.beforeAux } ;
+ in { s = newS };
+
+ invarNP : Str -> NounPhrase = \str ->
+ { s = \\c => str ;
+ stem = str ;
+ agr = Hau ;
+ anim = Inan ;
+ isDef = True } ;
+
+}
\ No newline at end of file
diff --git a/src/basque/StructuralEus.gf b/src/basque/StructuralEus.gf
new file mode 100644
index 00000000..c10bffcd
--- /dev/null
+++ b/src/basque/StructuralEus.gf
@@ -0,0 +1,179 @@
+concrete StructuralEus of Structural = CatEus **
+ open Prelude, (R=ResEus), (N=NounEus), ParadigmsEus in {
+
+
+
+-------
+-- Ad*
+
+lin almost_AdA = mkAdA "ia" ;
+lin almost_AdN = ss "ia" ;
+lin at_least_AdN = ss "gutxienez" ;
+lin at_most_AdN = ss "gehienez" ;
+lin so_AdA = ss "hain" ;
+lin too_AdA = ss "gehiegi" ;
+lin very_AdA = mkAdA "oso" ;
+
+lin as_CAdv = { s = "bezain" ; p = [] } ;
+lin less_CAdv = { s = "gutxiago" ; p = [] } ;
+lin more_CAdv = { s = "gehiago" ; p = [] } ;
+
+lin how_IAdv = ss "nola" ;
+lin how8much_IAdv = ss "zerbait" ;
+lin when_IAdv = ss "noiz" ;
+lin where_IAdv = ss "non" ;
+lin why_IAdv = ss "zergatik" ;
+
+lin always_AdV = ss "beti" ;
+
+lin everywhere_Adv = ss "nonahi" ;
+lin here7from_Adv = ss "hemendik" ;
+lin here7to_Adv = ss "hona" ;
+lin here_Adv = ss "hemen" ;
+lin quite_Adv = ss "nahiko" ;
+lin somewhere_Adv = ss "nonbait" ;
+lin there7from_Adv = ss "hortik" ;
+lin there7to_Adv = ss "horra" ;
+lin there_Adv = ss "hor" ;
+
+
+-------
+-- Conj
+
+lin and_Conj = mkConj [] "eta" pl ;
+lin or_Conj = mkConj [] "edo" sg ;
+lin if_then_Conj = mkConj [] "orduan" sg ; --TODO: is there even a way to say this? "if boys then girls"
+lin both7and_DConj = mkConj "bai" "eta" pl ;
+lin either7or_DConj = mkConj "bai" "edo" pl ;
+
+lin but_PConj = ss "baina" ;
+lin otherwise_PConj = ss "bestela" ;
+--lin therefore_PConj
+
+
+-----------------
+-- *Det and Quant
+
+lin how8many_IDet = R.indefDet "zenbat" pl ;
+
+--TODO: fix predets in NounEus, figure out whether Predet should inflect
+lin all_Predet = { s = "guzti" } ;
+lin not_Predet = { s = "ez" } ;
+lin only_Predet = { s = "bakarrik" } ;
+lin most_Predet = { s = "gehien" } ;
+
+lin every_Det = R.defDet [] sg ** -- egun+ero "every day" --TODO: urtero *urte+ero
+ { s = \\c,_ => SOFT_BIND ++ "ero"
+ ++ R.artDef ! R.Sg ! c ! R.FinalVow } ;
+lin few_Det = R.indefDet "gutxi" pl ;
+lin many_Det = R.indefDet "asko" pl ;
+lin much_Det = R.indefDet "asko" sg ;
+lin somePl_Det = R.indefDet "zenbait" pl ;
+lin someSg_Det = R.indefDet "zenbait" sg ;
+
+lin no_Quant = R.indefDet "ez" sg ** { s = R.artDef } ; --TODO: this is just the word for "no"; not even sure if it's possible to have no_Quant
+
+lin that_Quant = R.defDet [] sg ** { s = R.quantHori } ;
+lin this_Quant = R.defDet [] sg ** { s = R.quantHau } ;
+lin which_IQuant = R.defDet "zein" sg ** { s = R.artDef } ;
+
+
+-----
+-- NP
+
+lin everybody_NP = defNP "dena" N.NumPl ;
+lin everything_NP = defNP "dena" N.NumSg ;
+lin nobody_NP = defNP "ez inor" N.NumSg ; --TODO: negation should be in the verb; "ez da inor"
+lin nothing_NP = defNP "ezer" N.NumSg ;
+--lin somebody_NP =
+--lin something_NP =
+
+oper
+ defNP : Str -> Num -> NP = \dena,num ->
+ N.DetCN (N.DetQuant N.DefArt num)
+ (N.UseN (R.mkNoun dena)) ;
+-------
+-- Prep
+
+lin above_Prep = mkPrep "gainean" ;
+lin after_Prep = mkPrep "ondoan" ;
+lin before_Prep = mkPrep "gabe" absolutive ;
+lin behind_Prep = mkPrep "atzean" ;
+lin between_Prep = mkPrep "artean" ; --`bitartean' for time
+lin by8agent_Prep = mkPrep [] ergative ; -- choose just case, no separate postposition
+lin by8means_Prep = mkPrep [] instrumental ;
+lin during_Prep = mkPrep [] inessive ; --- ???
+lin except_Prep = mkPrep "gain" sociative ;
+lin for_Prep = affixPrep "tzat" genitive ;
+lin from_Prep = locPrep "tik" ; --- ?
+lin in8front_Prep = mkPrep "aurrean" ;
+lin in_Prep = mkPrep [] inessive ;
+lin on_Prep = mkPrep "gainean" ;
+lin part_Prep = mkPrep [] partitive ;
+lin possess_Prep = mkPrep [] ; --Genitive. TODO add locative genitive in extra
+lin through_Prep = mkPrep "barrena" inessive ; -- ?
+lin to_Prep = mkPrep [] dative ; --"I gave it to Fran", not "I went to school"
+lin under_Prep = mkPrep "azpian" ;
+lin with_Prep = mkPrep [] sociative ;
+lin without_Prep = mkPrep "gabe" partitive ; --absolutive ;
+
+
+-------
+-- Pron
+
+-- Pronouns are closed class, no constructor in ParadigmsEus.
+
+lin i_Pron = R.persPron "ni" "niri" "nik" "nire" "nitaz" R.Ni ;
+lin we_Pron = R.persPron "gu" "guri" "guk" "gure" "gutaz" R.Gu ;
+lin youSg_Pron = R.persPron "zu" "zuri" "zuk" "zure" "zutaz" R.Zu ; -- in Extra: hi/hire
+lin youPl_Pron = R.persPron "zuek" "zuei" "zuen" "zuen" "zuetaz" R.Zuek ;
+lin youPol_Pron = R.persPron "zu" "zuri" "zuk" "zure" "zutaz" R.Zu ;
+lin he_Pron = R.persPron "hura" "hari" "hark" "haren" "hartaz" R.Hau ;
+lin she_Pron = R.persPron "hura" "hari" "hark" "haren" "hartaz" R.Hau ;
+lin it_Pron = R.persPron "hau" "honi" "honek" "bere" "honetaz" R.Hau ;
+lin they_Pron = R.persPron "hauek" "hauei" "hauek" "beren" "hauetaz" R.Hauek ; -- in Extra: other forms
+
+lin whatPl_IP = R.inanPron "zertzuk" "zertzuei" "zertzuek" "zertzuen" "zertzuetaz" R.Hauek ;
+lin whatSg_IP = R.inanPron "zer" "zeri" "zerk" "zeren" "zertaz" R.Hau ;
+lin whoPl_IP = R.persPron "nortzuk" "nortzuei" "nortzuek" "nortzuen" "nortzuetaz" R.Hauek ;
+lin whoSg_IP = R.persPron "nor" "nori" "nork" "noren" "zertaz" R.Hau ;
+
+
+
+
+-------
+-- Subj
+
+lin although_Subj = mkSubj "en arren" False ; -- askotan ez dirudien arren
+lin because_Subj = mkSubj "lako" False ;
+lin if_Subj = mkSubj "ba" True ;
+lin that_Subj = mkSubj "n" False ;
+lin when_Subj = mkSubj "nean" False ;
+
+
+
+------
+-- Utt
+
+lin language_title_Utt = ss "euskara" ;
+lin no_Utt = ss "ez" ; --?
+lin yes_Utt = ss "bai" ;
+
+
+-------
+-- Verb
+
+lin have_V2 = R.syntVerbDu "eduki" R.Eduki ;
+
+lin can8know_VV = ukanV "ahal" ; -- can (capacity)
+lin can_VV = ukanV "ahal" ; -- can (possibility)
+lin must_VV = ukanV "behar" ;
+lin want_VV = ukanV "nahi" ;
+
+
+------
+-- Voc
+
+lin please_Voc = ss "mesedez" ;
+
+}
diff --git a/src/basque/SymbolEus.gf b/src/basque/SymbolEus.gf
new file mode 100644
index 00000000..afa90821
--- /dev/null
+++ b/src/basque/SymbolEus.gf
@@ -0,0 +1,51 @@
+--# -path=.:../abstract:../common:../prelude
+
+concrete SymbolEus of Symbol = CatEus ** open Prelude, ParadigmsEus, ResEus, (NE=NounEus) in {
+
+lin
+
+ -- : Symb -> PN ; -- x
+ SymbPN i = mkPNoun i.s ;
+
+ -- : Int -> PN ; -- 27
+ IntPN i = mkPNoun i.s ;
+
+ -- : Float -> PN ; -- 3.14159
+ FloatPN i = mkPNoun i.s ;
+
+ -- : Card -> PN ; -- twelve [as proper name]
+ NumPN i = mkPNoun i.s ;
+
+-- CNIntNP cn i = {} ;
+
+ -- : Det -> CN -> [Symb] -> NP ; -- (the) (2) numbers x and y
+ CNSymbNP det cn xs =
+ let cnSymb = cn ** { comp = cn.comp ++ xs.s }
+ in NE.DetCN det cnSymb ;
+
+ -- : CN -> Card -> NP ; -- level five ; level 5
+ CNNumNP cn i = NE.MassNP (cn ** { comp = cn.comp ++ i.s }) ;
+
+ -- : Symb -> S ;
+ SymbS sy = {s = { beforeAux = sy.s ;
+ aux = {indep = "da" ; stem = "de" } ;
+ afterAux = [] } } ;
+ -- : Symb -> Card ;
+ SymbNum sy = { s = sy.s ; n = Pl } ;
+
+ -- : Symb -> Ord ;
+ SymbOrd sy = { s = sy.s ++ BIND ++ "garren" ; n = Pl } ;
+
+lincat
+
+ Symb, [Symb] = SS ;
+
+lin
+ MkSymb s = s ;
+
+ BaseSymb = infixSS "eta" ;
+ ConsSymb = infixSS "," ;
+
+
+
+}
diff --git a/src/basque/VerbEus.gf b/src/basque/VerbEus.gf
new file mode 100644
index 00000000..fe06ee46
--- /dev/null
+++ b/src/basque/VerbEus.gf
@@ -0,0 +1,168 @@
+concrete VerbEus of Verb = CatEus ** open ResEus, AditzTrinkoak, Prelude in {
+
+
+lin
+
+-----
+-- VP
+
+ UseV = ResEus.useV ;
+
+ -- : VV -> VP -> VP ; -- [lo egin/neska ikusi/jakin] nahi/ahal/behar dut
+ ComplVV vv vp =
+ let vcomp : Str = linVPPrc vp ;
+ in ResEus.insertComp vcomp (useV vv) ;
+
+
+ -- : VS -> S -> VP ; -- uste dut [neska etorriko dela]
+ -- The subordinator suffix -la is hardcoded in ComplVS
+ -- In Extra: ComplVS that takes the S with other suffixes (-en,-tzera)
+ ComplVS vs s =
+ let scomp : Str = linSSub s.s "la" ;
+ in ResEus.insertComp scomp (useV vs) ;
+
+ -- : VQ -> QS -> VP ; -- ez dakit [nor den]
+ ComplVQ vq qs =
+ let qi : Sentence = qs.s ! Indir ; -- choose the version without al
+ qcomp : Str = linSSub qi "n" ;
+ in ResEus.insertComp qcomp (useV vq) ;
+
+ -- : VA -> AP -> VP ; -- they become red
+ ComplVA va ap = ResEus.insertComp (CompAP ap).s (useV va) ;
+
+
+--------
+-- Slash
+
+ -- : V2 -> VPSlash
+ SlashV2a = ResEus.slashDObj ;
+
+
+ -- : V3 -> NP -> VPSlash ; -- give it (to her)
+ Slash2V3 v3 npNori = slashDObj v3 **
+ { iobj = { s = npNori.s ! Dat ;
+ agr = npNori.agr }
+ } ;
+
+ -- : V3 -> NP -> VPSlash ; -- give (it) to her
+ Slash3V3 v3 npNor = slashIObj v3 **
+ { dobj = npNor ** { s = mkDObj npNor }
+ } ;
+
+
+ -- : V2V -> VP -> VPSlash ; -- beg (her) to go
+ SlashV2V v2v vp = slashDObj v2v ** -- TODO: something wrong in this function!
+ { comp = \\agr => linVPPrc vp } ; --How about agreement with tense of the main clause???
+
+
+ -- : V2S -> S -> VPSlash ; -- answer (to him) that it is good
+ SlashV2S v2s s = slashDObj v2s **
+ { comp = \\agr => linSSub s.s "la" } ;
+
+ -- : V2Q -> QS -> VPSlash ; -- ask (him) who came
+ SlashV2Q v2q qs = slashDObj v2q **
+ { comp = \\agr => linSSub (qs.s ! Indir) "la" } ;
+
+ -- : V2A -> AP -> VPSlash ; -- paint (it) red
+ SlashV2A v2a ap = slashDObj v2a **
+ { comp = (CompAP ap).s } ;
+
+
+ -- : VPSlash -> NP -> VP
+ ComplSlash vps np = ResEus.complSlash vps np ;
+
+
+ -- : VV -> VPSlash -> VPSlash ; -- [___ ikusi] nahi/ahal/behar dut
+ -- Just like ComplVV except missing subject!
+ SlashVV vv vps = ComplVV vv vps ** { missing = vps.missing ;
+ post = vps.post } ;
+
+ -- : V2V -> NP -> VPSlash -> VPSlash ; -- beg me to buy
+ SlashV2VNP v2v np vps =
+ ComplVV v2v vps **
+ { missing = vps.missing ;
+ post = vps.post ;
+ iobj = np ** { s = np.s ! Dat } } ;
+
+--2 Other ways of forming verb phrases
+
+-- Verb phrases can also be constructed reflexively and from
+-- copula-preceded complements.
+
+ -- : VPSlash -> VP ;
+ ReflVP vps = complSlash vps buru_NP ; ------ TODO
+
+ -- : Comp -> VP ;
+ UseComp comp = insertComp comp.s (copulaVP comp.copula) ;
+
+
+ -- : V2 -> VP ; -- be loved
+ PassV2 v2 =
+ let kantatuak : Agr => Str = table {
+ (Gu|Zuek|Hauek) => v2.prc ! Past ++ BIND ++ "ak" ;
+ _ => v2.prc ! Past } ;
+ in insertComp kantatuak (copulaVP Izan) ; --TODO: we lose the nstem, but maybe that's okay?
+
+ -- : VP -> Adv -> VP ; -- sleep here
+ AdvVP vp adv = ResEus.insertAdv adv vp ;
+
+ -- : VP -> Adv -> VP ; -- sleep , even though ...
+ ExtAdvVP vp adv = ResEus.insertAdv (postfixSS (SOFT_BIND ++ ",") adv) vp ;
+
+ -- : AdV -> VP -> VP ; -- always sleep
+ AdVVP adv vp = ResEus.insertAdv adv vp ;
+
+ -- : VPSlash -> Adv -> VPSlash ; -- use (it) here
+ AdvVPSlash vps adv = vps ** { adv = vps.adv ++ adv.s } ;
+
+ -- : AdV -> VPSlash -> VPSlash ; -- always use (it)
+ AdVVPSlash adv vps = vps ** { adv = adv.s ++ vps.adv } ;
+
+ -- : VP -> Prep -> VPSlash ; -- live in (it)
+ VPSlashPrep vp prep = vp **
+ { post = prep ;
+ missing = MissingAdv } ;
+
+
+lin
+
+--2 Complements to copula
+
+-- Adjectival phrases, noun phrases, and adverbs can be used.
+
+ -- the house is big = etxea handia da
+ -- the houses are big = etxeak handiak dira
+ -- I am [a house that sleeps here] = ni [hemen lo egiten den etxea] naiz
+ -- we are [houses that sleep here] = gu [hemen lo egiten diren etxeak] gara
+
+ -- Complement : Type = {s : Agr => Str ; copula : SyntVerb1 } ;
+
+ -- : AP -> Comp ;
+ CompAP ap = { s = \\agr => ap.s ++ artDef ! getNum agr ! Abs ! ap.ph ;
+ copula = Izan };
+
+ -- : CN -> Comp ;
+ CompCN cn = { s = \\agr => cn.s ! agr ++ artDef ! getNum agr ! Abs ! cn.ph ;
+ copula = Izan } ;
+
+ -- NP -> Comp ;
+ CompNP np = { s = \\agr => np.s ! Abs ; copula = Izan } ;
+
+ -- : Adv -> Comp ;
+ CompAdv adv = { s = \\agr => adv.s ; copula = Egon } ;
+
+
+ -- : VP -- Copula alone; intransitive and Izan by default
+ UseCopula = copulaVP Izan ;
+
+
+oper
+
+ copulaVP : SyntVerb1 -> VerbPhrase = \izan ->
+ ResEus.useV { prc = \\tns => [] ;
+ nstem = case izan of { Izan => "izate" ; _ => "egote" } ; --TODO is this correct?
+ val = Da izan } ;
+}
+
+
+
diff --git a/src/chinese/ParadigmsChi.gf b/src/chinese/ParadigmsChi.gf
index 58e0ff6c..562cd38d 100644
--- a/src/chinese/ParadigmsChi.gf
+++ b/src/chinese/ParadigmsChi.gf
@@ -143,6 +143,9 @@ oper
= \s,t -> lin Adv {s = word (s + t) ; advType = getAdvType s} ; ----
mkAdv : Str -> AdvType -> Adv
= \s,at -> lin Adv {s = word s ; advType = at} ;
+ mkAdv : Adv -> AdvType -> Adv -- To fix the AdvType in an Adv produced by SyntaxChi.mkAdv
+ = \adv,at -> adv ** {advType = at} ;
+
} ;
AdvType : Type
diff --git a/src/common/ExtendFunctor.gf b/src/common/ExtendFunctor.gf
index 5145acd7..a758cc7f 100644
--- a/src/common/ExtendFunctor.gf
+++ b/src/common/ExtendFunctor.gf
@@ -19,7 +19,7 @@ lin
GenRP = variants {} ; -- Num -> CN -> RP ; -- whose car
GenModNP num np cn = DetCN (DetQuant DefArt num) (AdvCN cn (PrepNP possess_Prep np)) ; -- this man's car(s) ; DEFAULT the car of this man
GenModIP = variants {} ; -- Num -> IP -> CN -> IP ; -- whose car(s)
- CompBareCN cn = CompCN cn ; -- (est) professeur ; DEFAULT is a teacher
+ CompBareCN cn = CompCN cn ; -- (is) teacher ; DEFAULT is a teacher
StrandQuestSlash = QuestSlash ; -- whom does John live with ; DEFAULT with whom does John live
StrandRelSlash = RelSlash ; -- that he lives in ; DEFAULT in which he lives
EmptyRelSlash = RelSlash IdRP ; -- he lives in ; DEFAULT in which he lives
@@ -35,7 +35,7 @@ lin
MkVPI2 = variants {} ; -- : Ant -> Pol -> VPSlash -> VPI2 ; -- to have loved
ConjVPI2 = variants {} ; -- : Conj -> [VPI2] -> VPI2 ; -- to love and have hated
ComplVPI2 = variants {} ; -- : VPI2 -> NP -> VPI ; -- to love and hate that person
- ProDrop pro = pro ; -- am tired ; DEFAULT I am tired
+ ProDrop pro = pro ; -- am tired ; DEFAULT I am tired (no pro drop)
ICompAP = variants {} ; -- AP -> IComp ; -- "how old"
IAdvAdv = variants {} ; -- Adv -> IAdv ; -- "how often"
CompIQuant iquant = CompIP (IdetIP (IdetQuant iquant NumSg)) ; -- which (is it) [agreement to NP] ; DEFAULT which [no agreement]
@@ -90,12 +90,14 @@ lin
DetNPFem = DetNP ;
- iFem_Pron = i_Pron ;
- youFem_Pron = youSg_Pron ;
- weFem_Pron = we_Pron ;
- youPlFem_Pron = youPl_Pron ;
- theyFem_Pron = they_Pron ;
- youPolFem_Pron = youPol_Pron ;
+ iFem_Pron = i_Pron ; -- DEFAULT I (masc)
+ youFem_Pron = youSg_Pron ; -- DEFAULT you (masc)
+ weFem_Pron = we_Pron ; -- DEFAULT we (masc)
+ youPlFem_Pron = youPl_Pron ; -- DEFAULT you plural (masc)
+ theyFem_Pron = they_Pron ; -- DEFAULT they (masc)
+ youPolFem_Pron = youPol_Pron ; -- DEFAULT you polite (masc)
+ youPolPl_Pron = youPl_Pron ; -- DEFAULT you plural (masc)
+ youPolPlFem_Pron = youPl_Pron ; -- DEFAULT you plural (masc)
UttAccNP = UttNP ; -- him (accusative) ; DEFAULT he
UttDatNP np = UttAccNP (lin NP np) ; -- him(dative) ; DEFAULT he
UttAccIP = UttIP ; -- whom (accusative) ; DEFAULT who
diff --git a/src/spanish/AllSpa.gf b/src/spanish/AllSpa.gf
index 7bef719f..8ac77b39 100644
--- a/src/spanish/AllSpa.gf
+++ b/src/spanish/AllSpa.gf
@@ -3,5 +3,6 @@
concrete AllSpa of AllSpaAbs =
LangSpa,
IrregSpa,
- ExtraSpa
+ ExtendSpa
+---- ExtraSpa
** {} ;
diff --git a/src/spanish/AllSpaAbs.gf b/src/spanish/AllSpaAbs.gf
index f1e21176..97642e3c 100644
--- a/src/spanish/AllSpaAbs.gf
+++ b/src/spanish/AllSpaAbs.gf
@@ -1,5 +1,6 @@
abstract AllSpaAbs =
Lang,
IrregSpaAbs,
- ExtraSpaAbs
+ Extend
+---- ExtraSpaAbs
** {} ;
diff --git a/src/spanish/ExtendSpa.gf b/src/spanish/ExtendSpa.gf
index e29fc880..ab45a33d 100644
--- a/src/spanish/ExtendSpa.gf
+++ b/src/spanish/ExtendSpa.gf
@@ -1,16 +1,70 @@
--# -path=alltenses:../common:../abstract
concrete ExtendSpa of Extend =
- CatSpa ** ExtendFunctor
--- - [] -- put the names of your own definitions here
+ CatSpa ** ExtendFunctor -
+ [
+ iFem_Pron, youFem_Pron, weFem_Pron, youPlFem_Pron, theyFem_Pron, youPolFem_Pron, youPolPl_Pron, youPolPlFem_Pron,
+ ProDrop
+ ] -- put the names of your own definitions here
with
(Grammar = GrammarSpa) **
open
GrammarSpa,
ResSpa,
+ MorphoSpa,
Coordination,
Prelude,
ParadigmsSpa in {
-- put your own definitions here
-
+
+ lin
+ iFem_Pron = mkPronoun
+ "yo" "me" "me" "mí"
+ "mi" "mi" "mis" "mis"
+ Fem Sg P1 ;
+ theyFem_Pron = mkPronoun
+ "ellas" "las" "les" "ellas"
+ "su" "su" "sus" "sus"
+ Fem Pl P3 ;
+
+ weFem_Pron = mkPronoun
+ "nosotras" "nos" "nos" "nosotras"
+ "nuestro" "nuestra" "nuestros" "nuestras"
+ Fem Pl P1 ;
+
+ youFem_Pron = mkPronoun
+ "tú" "te" "te" "ti"
+ "tu" "tu" "tus" "tus"
+ Fem Sg P2 ;
+ youPlFem_Pron = mkPronoun
+ "vosotras" "os" "os" "vosotras"
+ "vuestro" "vuestra" "vuestros" "vuestras"
+ Fem Pl P2 ;
+ youPolFem_Pron = mkPronoun
+ "usted" "la" "le" "usted"
+ "su" "su" "sus" "sus"
+ Fem Sg P3 ;
+
+ youPolPl_Pron = mkPronoun
+ "ustedes" "los" "les" "usted"
+ "su" "su" "sus" "sus"
+ Masc Pl P3 ;
+ youPolPlFem_Pron = mkPronoun
+ "ustedes" "las" "les" "usted"
+ "su" "su" "sus" "sus"
+ Fem Pl P3 ;
+
+ ProDrop p = {
+ s = table {
+ Nom => let pn = p.s ! Nom in {c1 = pn.c1 ; c2 = pn.c2 ; comp = [] ; ton = pn.ton} ;
+ c => p.s ! c
+ } ;
+ a = p.a ;
+ poss = p.poss ;
+ hasClit = p.hasClit ;
+ isPol = p.isPol ;
+ isNeg = False
+ } ;
+
+
}
\ No newline at end of file
diff --git a/src/swedish/AllSwe.gf b/src/swedish/AllSwe.gf
index 66318a84..b618260b 100644
--- a/src/swedish/AllSwe.gf
+++ b/src/swedish/AllSwe.gf
@@ -3,5 +3,6 @@
concrete AllSwe of AllSweAbs =
LangSwe - [PassV2],
IrregSwe,
- ExtraSwe
+---- ExtraSwe
+ ExtendSwe
** {} ;
diff --git a/src/swedish/AllSweAbs.gf b/src/swedish/AllSweAbs.gf
index 7fd59eb4..2673b180 100644
--- a/src/swedish/AllSweAbs.gf
+++ b/src/swedish/AllSweAbs.gf
@@ -1,5 +1,6 @@
abstract AllSweAbs =
Lang - [PassV2] ,
IrregSweAbs,
- ExtraSweAbs
+---- ExtraSweAbs
+ Extend
** {} ;
diff --git a/src/swedish/ExtendSwe.gf b/src/swedish/ExtendSwe.gf
new file mode 100644
index 00000000..2ae788b7
--- /dev/null
+++ b/src/swedish/ExtendSwe.gf
@@ -0,0 +1,148 @@
+--# -path=.:../scandinavian:../abstract:../common:prelude
+concrete ExtendSwe of Extend = CatSwe **
+ ExtendFunctor -
+ [
+ GenNP, ComplBareVS, CompBareCN,
+ StrandRelSlash, EmptyRelSlash, StrandQuestSlash,
+ MkVPI, BaseVPI, ConsVPI, ConjVPI, ComplVPIVV,
+ MkVPS, BaseVPS, ConsVPS, ConjVPS, PredVPS,
+ ICompAP,
+ RNP, RNPList, ReflRNP, ReflPron, ReflPoss, PredetRNP, ConjRNP,
+ Base_rr_RNP, Base_nr_RNP, Base_rn_RNP, Cons_rr_RNP, Cons_nr_RNP
+ ]
+ with (Grammar = GrammarSwe)
+ **
+ open CommonScand, ResSwe, ParamX, VerbSwe, Prelude, DiffSwe, StructuralSwe, MorphoSwe,
+ NounSwe, Coordination, AdjectiveSwe, SentenceSwe, AdverbSwe, RelativeSwe, (P = ParadigmsSwe) in {
+
+ flags coding=utf8 ;
+
+ lin
+ GenNP np = {
+ s,sp = \\n,_,_,g => np.s ! NPPoss (gennum (ngen2gen g) n) Nom ;
+ det = DDef Indef
+ } ;
+
+
+ ComplBareVS v s = insertObj (\\_ => s.s ! Sub) (predV v) ;
+
+ CompBareCN cn = {s = \\a => case a.n of {
+ Sg => cn.s ! Sg ! DIndef ! Nom ;
+ Pl => cn.s ! Pl ! DIndef ! Nom
+ }
+ } ;
+
+ StrandRelSlash rp slash = {
+ s = \\t,a,p,ag,_ =>
+ rp.s ! ag.g ! ag.n ! RNom ++ slash.s ! t ! a ! p ! Sub ++ slash.n3 ! ag ++ slash.c2.s ;
+ c = NPAcc
+ } ;
+ EmptyRelSlash slash = {
+ s = \\t,a,p,ag,_ =>
+ slash.s ! t ! a ! p ! Sub ++ slash.c2.s ;
+ c = NPAcc
+ } ;
+
+ StrandQuestSlash ip slash = {
+ s = \\t,a,p =>
+ let
+ cls = slash.s ! t ! a ! p ;
+ who = ip.s ! accusative ;
+ agr = agrP3 ip.g ip.n ;
+ in table {
+ QDir => who ++ cls ! Inv ++ slash.n3 ! agr ++ slash.c2.s ;
+ QIndir => who ++ cls ! Sub ++ slash.n3 ! agr ++ slash.c2.s
+ }
+ } ;
+
+
+ lincat
+ VPI = {s : VPIForm => Agr => Str} ;
+ [VPI] = {s1,s2 : VPIForm => Agr => Str} ;
+
+ lin
+ BaseVPI = twoTable2 VPIForm Agr ;
+ ConsVPI = consrTable2 VPIForm Agr comma ;
+
+ MkVPI vp = {
+ s = \\v,a => infVP vp a ---- no sup
+ } ;
+ ConjVPI = conjunctDistrTable2 VPIForm Agr ;
+ ComplVPIVV vv vpi = insertObj (\\a => vv.c2.s ++ vpi.s ! VPIInf ! a) (predV vv) ;
+
+ lincat
+ VPS = {s : Order => Agr => Str} ;
+ [VPS] = {s1,s2 : Order => Agr => Str} ;
+
+ lin
+ BaseVPS = twoTable2 Order Agr ;
+ ConsVPS = consrTable2 Order Agr comma ;
+
+ PredVPS np vpi =
+ let
+ subj = np.s ! nominative ;
+ agr = np.a ;
+ in {
+ s = \\o =>
+ let verb = vpi.s ! o ! agr
+ in case o of {
+ Main => subj ++ verb ;
+ Inv => verb ++ subj ; ---- älskar henne och sover jag
+ Sub => subj ++ verb
+ }
+ } ;
+
+ MkVPS t p vp = {
+ s = \\o,a =>
+ let
+ verb = vp.s ! Act ! VPFinite t.t t.a ;
+ neg = verb.a1 ! p.p ! a ;
+ compl = vp.n2 ! a ++ vp.a2 ++ vp.ext ;
+ pron = vp.n1 ! a
+ in t.s ++ p.s ++ case o of {
+ Main => verb.fin ++ neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl ;
+ Inv => verb.fin ++ neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl ; ----
+ Sub => neg.p1 ++ neg.p2 ++ verb.fin ++ verb.inf ++ pron ++ compl
+ }
+ } ;
+
+ ConjVPS = conjunctDistrTable2 Order Agr ;
+
+ ICompAP ap = {s = \\a => hur_IAdv.s ++ ap.s ! a} ;
+
+
+
+ lincat
+ RNP = {s : Agr => Str ; isPron : Bool} ; ---- inherent Agr needed: han färgar sitt hår vitt. But also depends on subject
+ RNPList = {s1,s2 : Agr => Str} ;
+
+ lin
+ ReflRNP vps rnp =
+ insertObjPron
+ (andB (notB vps.c2.hasPrep) rnp.isPron)
+ rnp.s
+ (insertObj (\\a => vps.c2.s ++ vps.n3 ! a) vps) ;
+
+ ReflPron = {s = \\a => reflPron a ; isPron = True} ; ---- agr ??
+ ReflPoss num cn = {
+ s = \\a => possPron a.n a.p num.n (ngen2gen cn.g) ++ num.s ! cn.g ++ cn.s ! num.n ! DDef Indef ! Nom ;
+ isPron = False
+ } ;
+ PredetRNP predet rnp = {
+ s = \\a => predet.s ! Utr ! Pl ++ predet.p ++ rnp.s ! a ; ---- agr needed here as well
+---- s = \\a => predet.s ! np.a.g ! np.a.n ++ predet.p ++ np.s ! a ;
+---- a = case pred.a of {PAg n => agrP3 np.a.g n ; _ => np.a} ;
+ isPron = False
+ } ;
+
+ ConjRNP conj rpns = conjunctDistrTable Agr conj rpns ** {isPron = False} ;
+
+ Base_rr_RNP x y = twoTable Agr x y ;
+ Base_nr_RNP x y = twoTable Agr {s = \\a => x.s ! NPAcc} y ;
+ Base_rn_RNP x y = twoTable Agr x {s = \\a => y.s ! NPAcc} ;
+ Cons_rr_RNP x xs = consrTable Agr comma x xs ;
+ Cons_nr_RNP x xs = consrTable Agr comma {s = \\a => x.s ! NPAcc} xs ;
+
+
+}
+