Faroese grammar

This commit is contained in:
Krasimir Angelov
2026-05-31 17:29:17 +02:00
parent 0201d62777
commit 0a03e037f4
20 changed files with 920 additions and 63 deletions

View File

@@ -4,4 +4,29 @@ lin
ComparA a np = { ComparA a np = {
s = \\g,n,c => "meir" ++ a.s ! g ! n ! c ++ "enn" ++ np.s ! Nom s = \\g,n,c => "meir" ++ a.s ! g ! n ! c ++ "enn" ++ np.s ! Nom
} ; } ;
ComplA2 a np = {
s = \\g,n,c => a.s ! g ! n ! c ++ a.c2.s ++ np.s ! a.c2.c
} ;
ReflA2 a = {
s = \\g,n,c => a.s ! g ! n ! c ++ a.c2.s ++ "seg"
} ;
UseA2 a = a ;
UseComparA a = {
s = \\g,n,c => "meir" ++ a.s ! g ! n ! c
} ;
CAdvAP cadv ap np = {
s = \\g,n,c => cadv.s ++ ap.s ! g ! n ! c ++ cadv.p ++ np.s ! Nom
} ;
AdjOrd ord = {
s = ord.s
} ;
SentAP ap sc = {
s = \\g,n,c => ap.s ! g ! n ! c ++ sc.s
} ;
AdAP ada ap = {
s = \\g,n,c => ada.s ++ ap.s ! g ! n ! c
} ;
AdvAP ap adv = {
s = \\g,n,c => ap.s ! g ! n ! c ++ adv.s
} ;
} }

13
src/faroese/AdverbFao.gf Normal file
View File

@@ -0,0 +1,13 @@
concrete AdverbFao of Adverb = CatFao ** open Prelude,ResFao in {
flags
coding = "UTF-8" ;
lin
PositAdvAdj a = {s = a.s ! Neuter ! Sg ! Nom} ;
PrepNP p np = {s = p.s ++ np.s ! p.c} ;
ComparAdvAdj cadv a np = {s = cadv.s ++ a.s ! Neuter ! Sg ! Nom ++ cadv.p ++ np.s ! Nom} ;
ComparAdvAdjS cadv a s = {s = cadv.s ++ a.s ! Neuter ! Sg ! Nom ++ cadv.p ++ s.s} ;
AdAdv ada adv = {s = ada.s ++ adv.s} ;
PositAdAAdj a = {s = a.s ! Neuter ! Sg ! Nom} ;
SubjS subj s = {s = subj.s ++ s.s} ;
AdnCAdv cadv = {s = cadv.s} ;
}

View File

@@ -1,4 +1,4 @@
concrete CatFao of Cat = CommonX ** open ResFao in { concrete CatFao of Cat = CommonX ** open ResFao, Prelude in {
lincat N = Noun ; lincat N = Noun ;
lincat N2 = Noun ** {c2 : Compl} ; lincat N2 = Noun ** {c2 : Compl} ;
@@ -10,20 +10,39 @@ lincat VV,VS,VQ,VA = Verb ;
lincat V2 = Verb ** {c2 : Compl} ; lincat V2 = Verb ** {c2 : Compl} ;
lincat V3,V2A,V2S,V2Q,V2V = Verb ** {c2,c3 : Compl} ; lincat V3,V2A,V2S,V2Q,V2V = Verb ** {c2,c3 : Compl} ;
lincat VP = VerbPhrase ; lincat VP = VerbPhrase ;
lincat VPSlash = Verb ** {c2 : Compl} ; lincat VPSlash = Verb ** {c2 : Compl ; sc : Str} ;
lincat Comp = {s : Gender => Number => Str} ; lincat Comp = {s : Gender => Number => Str} ;
lincat Cl = Clause ; lincat Cl = Clause ;
lincat ClSlash = {s : Tense => Polarity => Str ; c2 : Compl} ;
lincat SSlash = {s : Str ; c2 : Compl} ;
lincat Imp = {s : Polarity => Number => Str} ;
lincat Prep = Compl ; lincat Prep = Compl ;
lincat CN = CommonNoun ; lincat CN = CommonNoun ;
lincat NP, Pron = {s : Case => Str ; g : Gender ; n : Number ; p : Person} ; lincat NP, Pron = {s : Case => Str ; g : Gender ; n : Number ; p : Person} ;
lincat QS = {s : Str} ;
lincat QCl = {s : Tense => Polarity => Str} ;
lincat IP = {s : Str ; n : Number} ;
lincat IComp = {s : Str} ;
lincat IDet = {s : Str ; n : Number} ;
lincat IQuant = {s : Str} ;
lincat RCl = {s : Tense => Polarity => Gender => PersNum => Str} ; lincat RCl = {s : Tense => Polarity => Gender => PersNum => Str} ;
lincat RS = {s : Gender => PersNum => Str} ; lincat RS = {s : Gender => PersNum => Str} ;
lincat RP = {s : Str} ; lincat RP = {s : Str} ;
lincat AP = AdjPhrase ; lincat AP = AdjPhrase ;
lincat Det = {s : Gender => Case => Str ; n : Number ; sp : Species} ; lincat Det = {s : Gender => Case => Str ; n : Number ; sp : Species} ;
lincat Quant = {s : Gender => Number => Case => Str ; sp : Species} ; lincat Predet = {s : Str} ;
lincat Num = {s : Gender => Case => Str ; n : Number} ; lincat Quant = {s : Bool => Gender => Number => Case => Str; sp : Species} ;
lincat Num = {s : Gender => Case => Str ; n : Number ; hasCard : Bool} ;
lincat Card = {s : Gender => Case => Str ; n : Number} ;
lincat ACard = {s : Str} ;
lincat Ord = {s : Gender => Number => Case => Str} ;
lincat DAP = {s : Gender => Case => Str ; n : Number ; sp : Species} ;
lincat S = {s : Str} ; lincat S = {s : Str} ;
lincat Numeral = {s : Gender => Case => Str ; n : Number} ;
lincat Digits = {s : Str ; n : Number} ;
lincat Decimal = {s : Str ; n : Number ; hasDot : Bool} ;
lincat Conj = {s : Str} ;
lincat Subj = {s : Str} ;
lincat LN,SN,GN,PN = {s : Str} ; lincat LN,SN,GN,PN = {s : Str} ;

View File

@@ -0,0 +1,53 @@
concrete ConjunctionFao of Conjunction = CatFao ** open ResFao, Prelude in {
lincat
[S] = {s1,s2 : Str} ;
[RS] = {s1,s2 : Gender => PersNum => Str} ;
[Adv], [AdV], [IAdv] = {s1,s2 : Str} ;
[NP] = {s1,s2 : Case => Str ; g : Gender ; n : Number ; p : Person} ;
[AP] = {s1,s2 : Gender => Number => Case => Str} ;
[CN] = {s1,s2 : Species => Number => Case => Str ; g : Gender} ;
[DAP] = {s1,s2 : Gender => Case => Str ; n : Number ; sp : Species} ;
lin
ConjS conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ;
ConjRS conj xs = {s = \\g,p => xs.s1 ! g ! p ++ conj.s ++ xs.s2 ! g ! p} ;
ConjAdv conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ;
ConjAdV conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ;
ConjIAdv conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ;
ConjNP conj xs = {
s = \\c => xs.s1 ! c ++ conj.s ++ xs.s2 ! c ;
g = xs.g ;
n = Pl ;
p = P3
} ;
ConjAP conj xs = {s = \\g,n,c => xs.s1 ! g ! n ! c ++ conj.s ++ xs.s2 ! g ! n ! c} ;
ConjCN conj xs = {
s = \\sp,n,c => xs.s1 ! sp ! n ! c ++ conj.s ++ xs.s2 ! sp ! n ! c ;
g = xs.g
} ;
ConjDet conj xs = {
s = \\g,c => xs.s1 ! g ! c ++ conj.s ++ xs.s2 ! g ! c ;
n = xs.n ;
sp = xs.sp
} ;
BaseS x y = {s1 = x.s ; s2 = y.s} ;
ConsS x xs = {s1 = x.s ++ "," ++ xs.s1 ; s2 = xs.s2} ;
BaseRS x y = {s1 = x.s ; s2 = y.s} ;
ConsRS x xs = {s1 = \\g,p => x.s ! g ! p ++ "," ++ xs.s1 ! g ! p ; s2 = xs.s2} ;
BaseAdv x y = {s1 = x.s ; s2 = y.s} ;
ConsAdv x xs = {s1 = x.s ++ "," ++ xs.s1 ; s2 = xs.s2} ;
BaseAdV x y = {s1 = x.s ; s2 = y.s} ;
ConsAdV x xs = {s1 = x.s ++ "," ++ xs.s1 ; s2 = xs.s2} ;
BaseIAdv x y = {s1 = x.s ; s2 = y.s} ;
ConsIAdv x xs = {s1 = x.s ++ "," ++ xs.s1 ; s2 = xs.s2} ;
BaseNP x y = {s1 = x.s ; s2 = y.s ; g = x.g ; n = Pl ; p = P3} ;
ConsNP x xs = {s1 = \\c => x.s ! c ++ "," ++ xs.s1 ! c ; s2 = xs.s2 ; g = xs.g ; n = Pl ; p = P3} ;
BaseAP x y = {s1 = x.s ; s2 = y.s} ;
ConsAP x xs = {s1 = \\g,n,c => x.s ! g ! n ! c ++ "," ++ xs.s1 ! g ! n ! c ; s2 = xs.s2} ;
BaseCN x y = {s1 = x.s ; s2 = y.s ; g = x.g} ;
ConsCN x xs = {s1 = \\sp,n,c => x.s ! sp ! n ! c ++ "," ++ xs.s1 ! sp ! n ! c ; s2 = xs.s2 ; g = xs.g} ;
BaseDAP x y = {s1 = x.s ; s2 = y.s ; n = y.n ; sp = y.sp} ;
ConsDAP x xs = {s1 = \\g,c => x.s ! g ! c ++ "," ++ xs.s1 ! g ! c ; s2 = xs.s2 ; n = xs.n ; sp = xs.sp} ;
}

View File

@@ -0,0 +1,173 @@
concrete ConstructionFao of Construction = CatFao ** open ResFao, ParadigmsFao in {
lincat
Timeunit, Hour, Weekday, Month, Monthday, Year, Language = {s : Str} ;
lin
hungry_VP = beVP "svangur" ;
thirsty_VP = beVP "tystur" ;
tired_VP = beVP "troyttur" ;
scared_VP = beVP "bangin" ;
ill_VP = beVP "sjúkur" ;
ready_VP = beVP "klárur" ;
has_age_VP card = beVP (cardStr card ++ "ára gamal") ;
have_name_Cl np name = {
Converb = np.s ! Nom ++ "eitur" ++ name.s ! Nom ;
Indicative = \\t,pol => np.s ! Nom ++ "eitur" ++ negStr pol ++ name.s ! Nom ;
Nonfinite = np.s ! Nom ++ "eita" ++ name.s ! Nom ;
Participle = \\_ => np.s ! Nom ++ "itið" ++ name.s ! Nom
} ;
married_Cl np spouse = {
Converb = np.s ! Nom ++ "er giftur við" ++ spouse.s ! Dat ;
Indicative = \\t,pol => np.s ! Nom ++ copula ! t ! persNum np.n np.p ++ negStr pol ++ "giftur við" ++ spouse.s ! Dat ;
Nonfinite = np.s ! Nom ++ "vera giftur við" ++ spouse.s ! Dat ;
Participle = \\_ => np.s ! Nom ++ "verið giftur við" ++ spouse.s ! Dat
} ;
what_name_QCl np = {
s = \\t,pol => "hvat" ++ "eitur" ++ np.s ! Nom
} ;
how_old_QCl np = {
s = \\t,pol => "hvussu gamal" ++ copula ! t ! persNum np.n np.p ++ negStr pol ++ np.s ! Nom
} ;
how_far_QCl np = {
s = \\t,pol => "hvussu langt burtur" ++ copula ! t ! persNum np.n np.p ++ negStr pol ++ np.s ! Nom
} ;
weather_adjCl ap = {
Converb = "tað er" ++ ap.s ! Neuter ! Sg ! Nom ;
Indicative = \\t,pol => "tað" ++ copula ! t ! PSg P3 ++ negStr pol ++ ap.s ! Neuter ! Sg ! Nom ;
Nonfinite = "vera" ++ ap.s ! Neuter ! Sg ! Nom ;
Participle = \\_ => "verið" ++ ap.s ! Neuter ! Sg ! Nom
} ;
is_right_VP = beVP "rættur" ;
is_wrong_VP = beVP "skeivur" ;
n_units_AP card cn a = {
s = \\g,n,c => card.s ! cn.g ! Nom ++ cn.s ! Indef ! Pl ! Nom ++ a.s ! g ! n ! c
} ;
n_units_of_NP card cn np = mkNP (card.s ! cn.g ! Nom ++ cn.s ! Indef ! Pl ! Nom ++ "av" ++ np.s ! Dat) np.g np.n np.p ;
n_unit_CN card unit cn = mkCN (card.s ! unit.g ! Nom ++ unit.s ! Indef ! Sg ! Nom ++ cn.s ! Indef ! Sg ! Nom) cn.g ;
bottle_of_CN np = mkCN ("fløska av" ++ np.s ! Dat) Fem ;
cup_of_CN np = mkCN ("koppur av" ++ np.s ! Dat) Masc ;
glass_of_CN np = mkCN ("glas av" ++ np.s ! Dat) Neuter ;
few_X_short_of_Y np x y = {s = np.s ! Nom ++ "vantar nakrar" ++ x.s ! Indef ! Pl ! Acc ++ "í" ++ y.s ! Def ! Sg ! Acc} ;
timeunitAdv card unit = {s = "í" ++ cardStr card ++ unit.s} ;
timeunitRange c1 c2 unit = {s = "í" ++ cardStr c1 ++ "til" ++ cardStr c2 ++ unit.s} ;
oneHour = {s = "eitt"} ;
twoHour = {s = "tvey"} ;
threeHour = {s = "trý"} ;
fourHour = {s = "fýra"} ;
fiveHour = {s = "fimm"} ;
sixHour = {s = "seks"} ;
sevenHour = {s = "sjey"} ;
eightHour = {s = "átta"} ;
nineHour = {s = "níggju"} ;
tenHour = {s = "tíggju"} ;
elevenHour = {s = "ellivu"} ;
twelveHour = {s = "tólv"} ;
thirteenHour = {s = "trettan"} ;
fourteenHour = {s = "fjúrtan"} ;
fifteenHour = {s = "fimtan"} ;
sixteenHour = {s = "sekstan"} ;
seventeenHour = {s = "seytjan"} ;
eighteenHour = {s = "átjan"} ;
nineteenHour = {s = "nítjan"} ;
twentyHour = {s = "tjúgu"} ;
twentyOneHour = {s = "tjúgueitt"} ;
twentyTwoHour = {s = "tjúgutvey"} ;
twentyThreeHour = {s = "tjúgutrý"} ;
twentyFourHour = {s = "tjúgufýra"} ;
timeHour h = {s = "klokkan" ++ h.s} ;
timeHourMinute h m = {s = "klokkan" ++ h.s ++ cardStr m} ;
weekdayPunctualAdv w = {s = w.s} ;
weekdayHabitualAdv w = {s = w.s} ;
weekdayLastAdv w = {s = "seinasta" ++ w.s} ;
weekdayNextAdv w = {s = "næsta" ++ w.s} ;
monthAdv m = {s = "í" ++ m.s} ;
yearAdv y = {s = "í" ++ y.s} ;
dayMonthAdv d m = {s = d.s ++ m.s} ;
monthYearAdv m y = {s = m.s ++ y.s} ;
dayMonthYearAdv d m y = {s = d.s ++ m.s ++ y.s} ;
intYear i = {s = i.s} ;
intMonthday i = {s = i.s} ;
InLanguage l = {s = "á" ++ l.s} ;
weekdayN w = mkCN w.s Masc ;
monthN m = mkCN m.s Masc ;
weekdayPN w = {s = w.s} ;
monthPN m = {s = m.s} ;
languageNP l = mkNP l.s Neuter Sg P3 ;
languageCN l = mkCN l.s Neuter ;
second_Timeunit = {s = "sekund"} ;
minute_Timeunit = {s = "minutt"} ;
hour_Timeunit = {s = "tími"} ;
day_Timeunit = {s = "dagur"} ;
week_Timeunit = {s = "vika"} ;
month_Timeunit = {s = "mánaður"} ;
year_Timeunit = {s = "ár"} ;
monday_Weekday = {s = "mánadagur"} ;
tuesday_Weekday = {s = "týsdagur"} ;
wednesday_Weekday = {s = "mikudagur"} ;
thursday_Weekday = {s = "hósdagur"} ;
friday_Weekday = {s = "fríggjadagur"} ;
saturday_Weekday = {s = "leygardagur"} ;
sunday_Weekday = {s = "sunnudagur"} ;
january_Month = {s = "januar"} ;
february_Month = {s = "februar"} ;
march_Month = {s = "mars"} ;
april_Month = {s = "apríl"} ;
may_Month = {s = "mai"} ;
june_Month = {s = "juni"} ;
july_Month = {s = "juli"} ;
august_Month = {s = "august"} ;
september_Month = {s = "september"} ;
october_Month = {s = "oktober"} ;
november_Month = {s = "november"} ;
december_Month = {s = "desember"} ;
afrikaans_Language = {s = "afrikaans"} ;
amharic_Language = {s = "amhariskt"} ;
arabic_Language = {s = "arabiskt"} ;
bulgarian_Language = {s = "bulgarskt"} ;
catalan_Language = {s = "katalanskt"} ;
chinese_Language = {s = "kinesiskt"} ;
danish_Language = {s = "danskt"} ;
dutch_Language = {s = "hollendskt"} ;
english_Language = {s = "enskt"} ;
estonian_Language = {s = "estiskt"} ;
finnish_Language = {s = "finskt"} ;
french_Language = {s = "franskt"} ;
german_Language = {s = "týskt"} ;
greek_Language = {s = "grikskt"} ;
hebrew_Language = {s = "hebraiskt"} ;
hindi_Language = {s = "hindi"} ;
japanese_Language = {s = "japanskt"} ;
italian_Language = {s = "italskt"} ;
latin_Language = {s = "latín"} ;
latvian_Language = {s = "lettiskt"} ;
maltese_Language = {s = "maltesiskt"} ;
nepali_Language = {s = "nepalskt"} ;
norwegian_Language = {s = "norskt"} ;
persian_Language = {s = "persiskt"} ;
polish_Language = {s = "pólskt"} ;
punjabi_Language = {s = "punjabi"} ;
romanian_Language = {s = "rumenskt"} ;
russian_Language = {s = "russiskt"} ;
sindhi_Language = {s = "sindhi"} ;
spanish_Language = {s = "spanskt"} ;
swahili_Language = {s = "swahili"} ;
swedish_Language = {s = "svenskt"} ;
thai_Language = {s = "tailendskt"} ;
turkish_Language = {s = "turkiskt"} ;
urdu_Language = {s = "urdu"} ;
oper
beVP : Str -> VerbPhrase = \ap -> {
Converb = copula ! Pres ! PPl ++ ap ;
Indicative = \\t,pol,_,p => copula ! t ! p ++ negStr pol ++ ap ;
Nonfinite = "vera" ++ ap ;
Participle = \\_ => "verið" ++ ap
} ;
cardStr : Card -> Str = \card ->
card.s ! Neuter ! Nom ;
}

View File

@@ -1,6 +1,21 @@
concrete ExtendFao of Extend = CatFao ** concrete ExtendFao of Extend = CatFao **
open ParadigmsFao, ResFao in { open ParadigmsFao, ResFao in {
lincat
VPS = {s : Gender => PersNum => Str} ;
[VPS] = {s1,s2 : Gender => PersNum => Str} ;
VPI = {s : Str} ;
[VPI] = {s1,s2 : Str} ;
VPS2 = {s : Gender => PersNum => Str ; c2 : Compl ; sc : Str} ;
[VPS2] = {s1,s2 : Gender => PersNum => Str ; c2 : Compl ; sc : Str} ;
VPI2 = {s : Str ; c2 : Compl ; sc : Str} ;
[VPI2] = {s1,s2 : Str ; c2 : Compl ; sc : Str} ;
[Comp] = {s1,s2 : Gender => Number => Str} ;
[Imp] = {s1,s2 : Polarity => Number => Str} ;
RNP = {s : Case => Str ; g : Gender ; n : Number ; p : Person} ;
RNPList = {s1,s2 : Case => Str ; g : Gender ; n : Number ; p : Person} ;
X = {s : Str} ;
lin lin
iFem_Pron = mkPron "eg" "meg" "mær" "mín" Masc Sg P1 ; iFem_Pron = mkPron "eg" "meg" "mær" "mín" Masc Sg P1 ;
youFem_Pron = mkPron "tú" "teg" "tær" "tín" Masc Sg P2 ; youFem_Pron = mkPron "tú" "teg" "tær" "tín" Masc Sg P2 ;

View File

@@ -4,7 +4,13 @@ concrete GrammarFao of Grammar =
NounFao, NounFao,
VerbFao, VerbFao,
AdjectiveFao, AdjectiveFao,
AdverbFao,
NumeralFao,
SentenceFao, SentenceFao,
QuestionFao,
RelativeFao, RelativeFao,
StructuralFao ** { ConjunctionFao,
StructuralFao,
IdiomFao,
NamesFao ** {
} }

62
src/faroese/IdiomFao.gf Normal file
View File

@@ -0,0 +1,62 @@
concrete IdiomFao of Idiom = CatFao ** open ResFao in {
lin
ImpersCl vp = {
Converb = "tað" ++ vp.Converb ;
Indicative = \\t,pol => "tað" ++ vp.Indicative ! t ! pol ! Neuter ! PSg P3 ;
Nonfinite = "tað" ++ vp.Nonfinite ;
Participle = \\t => "tað" ++ vp.Participle ! t
} ;
GenericCl vp = {
Converb = "mann" ++ vp.Converb ;
Indicative = \\t,pol => "mann" ++ vp.Indicative ! t ! pol ! Masc ! PSg P3 ;
Nonfinite = "mann" ++ vp.Nonfinite ;
Participle = \\t => "mann" ++ vp.Participle ! t
} ;
CleftNP np rs = {
Converb = "tað er" ++ np.s ! Nom ++ rs.s ! np.g ! persNum np.n np.p ;
Indicative = \\t,pol => "tað" ++ copula ! t ! PSg P3 ++ negStr pol ++ np.s ! Nom ++ rs.s ! np.g ! persNum np.n np.p ;
Nonfinite = "vera" ++ np.s ! Nom ++ rs.s ! np.g ! persNum np.n np.p ;
Participle = \\_ => "verið" ++ np.s ! Nom ++ rs.s ! np.g ! persNum np.n np.p
} ;
CleftAdv adv s = {
Converb = "tað er" ++ adv.s ++ s.s ;
Indicative = \\t,pol => "tað" ++ copula ! t ! PSg P3 ++ negStr pol ++ adv.s ++ s.s ;
Nonfinite = "vera" ++ adv.s ++ s.s ;
Participle = \\_ => "verið" ++ adv.s ++ s.s
} ;
ExistNP np = {
Converb = "tað er" ++ np.s ! Nom ;
Indicative = \\t,pol => "tað" ++ copula ! t ! persNum np.n P3 ++ negStr pol ++ np.s ! Nom ;
Nonfinite = "vera" ++ np.s ! Nom ;
Participle = \\_ => "verið" ++ np.s ! Nom
} ;
ExistIP ip = {
s = \\t,pol => "hvat" ++ copula ! t ! persNum ip.n P3 ++ negStr pol
} ;
ExistNPAdv np adv = {
Converb = "tað er" ++ np.s ! Nom ++ adv.s ;
Indicative = \\t,pol => "tað" ++ copula ! t ! persNum np.n P3 ++ negStr pol ++ np.s ! Nom ++ adv.s ;
Nonfinite = "vera" ++ np.s ! Nom ++ adv.s ;
Participle = \\_ => "verið" ++ np.s ! Nom ++ adv.s
} ;
ExistIPAdv ip adv = {
s = \\t,pol => ip.s ++ copula ! t ! persNum ip.n P3 ++ negStr pol ++ adv.s
} ;
ProgrVP vp = {
Converb = "vera við at" ++ vp.Nonfinite ;
Indicative = \\t,pol,g,p => copula ! t ! p ++ negStr pol ++ "við at" ++ vp.Nonfinite ;
Nonfinite = "vera við at" ++ vp.Nonfinite ;
Participle = \\_ => "verið við at" ++ vp.Nonfinite
} ;
ImpPl1 vp = {s = "lat okkum" ++ vp.Nonfinite} ;
ImpP3 np vp = {s = "lat" ++ np.s ! Acc ++ vp.Nonfinite} ;
SelfAdvVP vp = vp ** {
Converb = vp.Converb ++ "sjálvur" ;
Indicative = \\t,pol,g,p => vp.Indicative ! t ! pol ! g ! p ++ "sjálvur" ;
Nonfinite = vp.Nonfinite ++ "sjálvur" ;
Participle = \\t => vp.Participle ! t ++ "sjálvur"
} ;
SelfAdVVP = SelfAdvVP ;
SelfNP np = np ** {s = \\c => np.s ! c ++ "sjálvur"} ;
}

View File

@@ -2,9 +2,10 @@
concrete LangFao of Lang = concrete LangFao of Lang =
GrammarFao, GrammarFao,
LexiconFao LexiconFao
,ConstructionFao
,DocumentationFao --# notpresent ,DocumentationFao --# notpresent
** { ** {
flags startcat = Phr ; flags startcat = Phr ;
} }

View File

@@ -600,18 +600,18 @@ mkN016 base =
Gen => base_1+"ar" Gen => base_1+"ar"
} ; } ;
Pl => table { Pl => table {
Nom => base_1+"urin" ; Nom => nonExist ;
Acc => base_1+"in" ; Acc => nonExist ;
Dat => base_1+"inum" ; Dat => nonExist ;
Gen => base_1+"arins" Gen => nonExist
} }
} ; } ;
Def => table { Def => table {
Sg => table { Sg => table {
Nom => nonExist ; Nom => base_1+"urin" ;
Acc => nonExist ; Acc => base_1+"in" ;
Dat => nonExist ; Dat => base_1+"inum" ;
Gen => nonExist Gen => base_1+"arins"
} ; } ;
Pl => table { Pl => table {
Nom => nonExist ; Nom => nonExist ;
@@ -5670,18 +5670,18 @@ mkN146 base =
Gen => base_1+"s" Gen => base_1+"s"
} ; } ;
Pl => table { Pl => table {
Nom => base_1+"kurin" ; Nom => nonExist ;
Acc => base_1+"kin" ; Acc => nonExist ;
Dat => base_1+"kinum" ; Dat => nonExist ;
Gen => base_1+"sins" Gen => nonExist
} }
} ; } ;
Def => table { Def => table {
Sg => table { Sg => table {
Nom => nonExist ; Nom => base_1+"kurin" ;
Acc => nonExist ; Acc => base_1+"kin" ;
Dat => nonExist ; Dat => base_1+"kinum" ;
Gen => nonExist Gen => base_1+"sins"
} ; } ;
Pl => table { Pl => table {
Nom => nonExist ; Nom => nonExist ;

14
src/faroese/NamesFao.gf Normal file
View File

@@ -0,0 +1,14 @@
concrete NamesFao of Names = CatFao ** open ResFao in {
lin
GivenName gn = mkNP gn.s Masc Sg P3 ;
MaleSurname sn = mkNP sn.s Masc Sg P3 ;
FemaleSurname sn = mkNP sn.s Fem Sg P3 ;
PlSurname sn = mkNP sn.s Masc Pl P3 ;
FullName gn sn = mkNP (gn.s ++ sn.s) Masc Sg P3 ;
UseLN ln = mkNP ln.s Neuter Sg P3 ;
PlainLN ln = mkNP ln.s Neuter Sg P3 ;
InLN ln = {s = "í" ++ ln.s} ;
AdjLN ap ln = {s = ap.s ! Neuter ! Sg ! Nom ++ ln.s} ;
}

View File

@@ -1,9 +1,31 @@
concrete NounFao of Noun = CatFao ** open ResFao in { concrete NounFao of Noun = CatFao ** open ResFao, Prelude in {
lin lin
UseN n = n ; UseN n = n ;
UseN2 n = n ;
Use2N3 n = n ** {c2 = n.c2} ;
Use3N3 n = n ** {c2 = n.c3} ;
UsePN pn = mkNP pn.s Masc Sg P3 ;
UsePron p = p ; UsePron p = p ;
RelNP np rs = RelNP np rs =
np ** {s = \\c => np.s ! c ++ "," ++ rs.s ! np.g ! persNum np.n np.p} ; np ** {s = \\c => np.s ! c ++ "," ++ rs.s ! np.g ! persNum np.n np.p} ;
DetNP det = {
s = \\c => det.s ! Masc ! c ;
g = Masc ;
n = det.n ;
p = P3
} ;
PredetNP pred np = np ** {
s = \\c => pred.s ++ np.s ! c
} ;
PPartNP np v2 = np ** {
s = \\c => np.s ! c ++ v2.Participle ! Past
} ;
AdvNP np adv = np ** {
s = \\c => np.s ! c ++ adv.s
} ;
ExtAdvNP np adv = np ** {
s = \\c => np.s ! c ++ "," ++ adv.s
} ;
DetCN det cn = { DetCN det cn = {
s = \\c => det.s ! cn.g ! c ++ cn.s ! det.sp ! det.n ! c ; s = \\c => det.s ! cn.g ! c ++ cn.s ! det.sp ! det.n ! c ;
g = cn.g ; g = cn.g ;
@@ -11,41 +33,129 @@ lin
p = P3 p = P3
} ; } ;
DefArt = { DefArt = {
s = \\_,_,_ => [] ; s = \\_,_,_,_ => [] ;
sp = Def sp = Def ;
} ; } ;
IndefArt = { IndefArt = {
s = table { s = \\b =>
Masc => table { table {
Sg => table {Nom => "ein" ; Acc => "ein" ; Dat => "einum" ; Gen => "eins"} ; Masc => table {
Pl => \\_ => [] Sg => case b of {
False => table {Nom => "ein" ; Acc => "ein" ; Dat => "einum" ; Gen => "eins"} ;
True => \\_ => []
} ;
Pl => \\_ => []
} ;
Fem => table {
Sg => case b of {
False => table {Nom => "ein" ; Acc => "eina" ; Dat => "einari" ; Gen => "einar"} ;
True => \\_ => []
} ;
Pl => \\_ => []
} ;
Neuter => table {
Sg => case b of {
False => table {Nom => "eitt" ; Acc => "eitt" ; Dat => "einum" ; Gen => "eins"} ;
True => \\_ => []
} ;
Pl => \\_ => []
}
} ; } ;
Fem => table { sp = Indef ;
Sg => table {Nom => "ein" ; Acc => "eina" ; Dat => "einari" ; Gen => "einar"} ;
Pl => \\_ => []
} ;
Neuter => table {
Sg => table {Nom => "eitt" ; Acc => "eitt" ; Dat => "einum" ; Gen => "eins"} ;
Pl => \\_ => []
}
} ;
sp = Indef
} ; } ;
DetQuant quant num = { DetQuant quant num = {
s = \\g,c => quant.s ! g ! num.n ! c ++ num.s ! g ! c ; s = \\g,c => quant.s ! num.hasCard ! g ! num.n ! c ++
num.s ! g ! c ;
n = num.n ;
sp = quant.sp
} ;
DetQuantOrd quant num ord = {
s = \\g,c => quant.s ! num.hasCard ! g ! num.n ! c ++
num.s ! g ! c ++ ord.s ! g ! num.n ! c ;
n = num.n ; n = num.n ;
sp = quant.sp sp = quant.sp
} ; } ;
NumSg = { NumSg = {
s = \\_,_ => [] ; s = \\_,_ => [] ;
n = Sg n = Sg ;
hasCard = False
} ; } ;
NumPl = { NumPl = {
s = \\_,_ => [] ; s = \\_,_ => [] ;
n = Pl n = Pl ;
hasCard = False
} ;
NumCard card = card ** {hasCard = True} ;
NumDigits digits = {s = \\_,_ => digits.s ; n = Pl} ;
NumDecimal dec = {s = \\_,_ => dec.s ; n = Pl} ;
NumNumeral numeral = numeral ;
AdNum adn card = {s = \\g,c => adn.s ++ card.s ! g ! c ; n = card.n} ;
OrdDigits digits = {s = \\_,_,_ => digits.s} ;
OrdNumeral numeral = {s = \\g,_,c => numeral.s ! g ! c} ;
OrdSuperl a = {s = a.s} ;
OrdNumeralSuperl numeral a = {
s = \\g,n,c => numeral.s ! g ! c ++ a.s ! g ! n ! c
} ;
MassNP cn = {
s = \\c => cn.s ! Indef ! Sg ! c ;
g = cn.g ;
n = Sg ;
p = P3
} ;
PossPron pron = {
s = \\_,_,_,_ => pron.s ! Gen ;
sp = Def
} ;
ComplN2 n2 np = {
s = \\sp,n,c => n2.s ! sp ! n ! c ++ n2.c2.s ++ np.s ! n2.c2.c ;
g = n2.g
} ;
ComplN3 n3 np = n3 ** {
s = \\sp,n,c => n3.s ! sp ! n ! c ++ n3.c2.s ++ np.s ! n3.c2.c ;
c2 = n3.c3
} ; } ;
AdjCN ap cn = { AdjCN ap cn = {
s = \\sp,n,c => ap.s ! cn.g ! n ! c ++ cn.s ! sp ! n ! c ; s = \\sp,n,c => ap.s ! cn.g ! n ! c ++ cn.s ! sp ! n ! c ;
g = cn.g g = cn.g
} ; } ;
RelCN cn rs = {
s = \\sp,n,c => cn.s ! sp ! n ! c ++ rs.s ! cn.g ! persNum n P3 ;
g = cn.g
} ;
AdvCN cn adv = {
s = \\sp,n,c => cn.s ! sp ! n ! c ++ adv.s ;
g = cn.g
} ;
SentCN cn sc = {
s = \\sp,n,c => cn.s ! sp ! n ! c ++ sc.s ;
g = cn.g
} ;
ApposCN cn np = {
s = \\sp,n,c => cn.s ! sp ! n ! c ++ np.s ! Nom ;
g = cn.g
} ;
PossNP cn np = {
s = \\sp,n,c => cn.s ! sp ! n ! c ++ np.s ! Gen ;
g = cn.g
} ;
PartNP cn np = {
s = \\sp,n,c => cn.s ! sp ! n ! c ++ "av" ++ np.s ! Dat ;
g = cn.g
} ;
CountNP det np = {
s = \\c => det.s ! np.g ! c ++ "av" ++ np.s ! Dat ;
g = np.g ;
n = det.n ;
p = P3
} ;
AdjDAP dap ap = dap ** {
s = \\g,c => dap.s ! g ! c ++ ap.s ! g ! dap.n ! c
} ;
DetDAP det = det ;
QuantityNP dec mu = {
s = \\_ => dec.s ++ mu.s ;
g = Neuter ;
n = Pl ;
p = P3
} ;
} }

115
src/faroese/NumeralFao.gf Normal file
View File

@@ -0,0 +1,115 @@
concrete NumeralFao of Numeral = CatFao [Numeral, Digits, Decimal] ** open Prelude, ResFao in {
lincat
Digit = {s : Gender => Case => Str ; n : Number ; teen : Str ; ten : Str} ;
Sub10, Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 =
{s : Gender => Case => Str ; n : Number} ;
Dig = {s : Str; n : Number} ;
lin
num n = n ;
n2 = {s = table {
Masc => caseList "tveir" "tveir" "tveimum" "tveggja" ;
Fem => caseList "tvær" "tvær" "tveimum" "tveggja" ;
Neuter => caseList "tvey" "tvey" "tveimum" "tveggja"
} ;
teen = "tólv" ;
ten = "tjúgu" ;
n = Pl
} ;
n3 = {s = table {
Masc => caseList "tríggir" "tríggjar" "trimum" "tríggja" ;
Fem => caseList "tríggjar" "tríggjar" "trimum" "tríggja" ;
Neuter => caseList "trý" "trý" "trimum" "tríggja"
} ;
teen = "trettan" ;
ten = "tríati" ;
n = Pl
} ;
n4 = mkDigit "fýra" "fjúrtan" "fýrati" ;
n5 = mkDigit "fimm" "fimtan" "fimmti" ;
n6 = mkDigit "seks" "sekstan" "seksti" ;
n7 = mkDigit "sjey" "seytjan" "sjeyti" ;
n8 = mkDigit "átta" "átjan" "áttati" ;
n9 = mkDigit "níggju" "nítjan" "níti" ;
pot01 = {
s = table {
Masc => caseList "ein" "ein" "einum" "eins" ;
Fem => caseList "einar" "eina" "einari" "einar" ;
Neuter => caseList "eitt" "eitt" "einum" "eins"
} ;
n = Sg
} ;
pot0 d = {s = d.s ; n = d.n} ;
pot0as1 n = n ;
pot110 = {
s = table {
Masc => \\_ => "tíggju" ;
Fem => \\_ => "tíggju" ;
Neuter => \\_ => "ti"
} ;
n = Pl
} ;
pot111 = mkNum "ellivu" Pl ;
pot1to19 d = mkNum d.teen Pl ;
pot1 d = mkNum d.ten Pl ;
pot1plus d e = {s = \\g,c => e.s ! g ! c ++ "og" ++ d.ten ; n = Pl} ;
pot1as2 n = n ;
pot21 = mkNum "hundrað" Pl ;
pot2 d = mkNum (numBase d ++ "hundrað") Pl ;
pot2plus d e = {s = \\g,c => numBase d ++ "hundrað" ++ e.s ! g ! c ; n = Pl} ;
pot2as3 n = n ;
pot31 = mkNum "túsund" Pl ;
pot3 n = mkNum (numBase n ++ "túsund") Pl ;
pot3plus n m = {s = \\g,c => numBase n ++ "túsund" ++ m.s ! g ! c ; n = Pl} ;
pot3as4 n = n ;
pot3decimal d = mkNum (d.s ++ "túsund") Pl ;
pot41 = mkNum "millión" Pl ;
pot4 n = mkNum (numBase n ++ "millión") Pl ;
pot4plus n m = {s = \\g,c => numBase n ++ "millión" ++ m.s ! g ! c ; n = Pl} ;
pot4as5 n = n ;
pot4decimal d = mkNum (d.s ++ "millión") Pl ;
pot51 = mkNum "milliard" Pl ;
pot5 n = mkNum (numBase n ++ "milliard") Pl ;
pot5plus n m = {s = \\g,c => numBase n ++ "milliard" ++ m.s ! g ! c ; n = Pl} ;
pot5decimal d = mkNum (d.s ++ "milliard") Pl ;
IDig d = d ;
IIDig d ds = {s = d.s ++ BIND ++ ds.s; n = Pl} ;
D_0 = {s = "0"; n = Pl} ;
D_1 = {s = "1"; n = Sg} ;
D_2 = {s = "2"; n = Pl} ;
D_3 = {s = "3"; n = Pl} ;
D_4 = {s = "4"; n = Pl} ;
D_5 = {s = "5"; n = Pl} ;
D_6 = {s = "6"; n = Pl} ;
D_7 = {s = "7"; n = Pl} ;
D_8 = {s = "8"; n = Pl} ;
D_9 = {s = "9"; n = Pl} ;
PosDecimal d = d ** {hasDot = False} ;
NegDecimal d = {s = "-" ++ BIND ++ d.s; n = Pl; hasDot = False} ;
IFrac d i = {s = d.s ++ if_then_Str d.hasDot BIND (BIND++"."++BIND) ++ i.s; n = Pl; hasDot = True} ;
oper
caseList : Str -> Str -> Str -> Str -> Case => Str = \nom,acc,dat,gen ->
table {Nom => nom ; Acc => acc ; Dat => dat ; Gen => gen} ;
mkNum : Str -> Number -> {s : Gender => Case => Str ; n : Number} = \str,n -> {
s = \\_,_ => str ;
n = n
} ;
mkDigit : Str -> Str -> Str -> {s : Gender => Case => Str ; n : Number ; teen : Str ; ten : Str} = \str,teen,ten -> {
s = \\_,_ => str ;
teen = teen ;
ten = ten ;
n = Pl
} ;
numBase : {s : Gender => Case => Str ; n : Number} -> Str = \n ->
n.s ! Neuter ! Nom ;
}

View File

@@ -569,14 +569,14 @@ oper
mkPrep : Str -> Prep = \s -> lin Prep {s=s; c=Acc} ; mkPrep : Str -> Prep = \s -> lin Prep {s=s; c=Acc} ;
mkIAdv : Str -> IAdv = \s -> lin IAdv {s=s} ; mkIAdv : Str -> IAdv = \s -> lin IAdv {s=s} ;
mkIP : Str -> IP = \s -> lin IP {s=s} ; mkIP : Str -> IP = \s -> lin IP {s=s; n=Sg} ;
mkIQuant : Str -> IQuant = \s -> lin IQuant {s=s} ; mkIQuant : Str -> IQuant = \s -> lin IQuant {s=s} ;
mkIDet : Str -> IDet = \s -> lin IDet {s=s} ; mkIDet : Str -> IDet = \s -> lin IDet {s=s; n=Sg} ;
mkSubj : Str -> Subj = \s -> lin Subj {s=s} ; mkSubj : Str -> Subj = \s -> lin Subj {s=s} ;
mkQuant : Str -> Quant = \s -> lin Quant {s=\\_,_,_ => s; sp=Indef} ; mkQuant : Str -> Quant = \s -> lin Quant {s=\\_,_,_,_ => s; sp=Indef} ;
mkPredet : Str -> Predet = \s -> lin Predet {s=s} ; mkPredet : Str -> Predet = \s -> lin Predet {s=s} ;
mkDet : Str -> Det = \s -> lin Det {s=\\_,_ => s; n=Sg; sp=Indef} ; mkDet : Str -> Det = \s -> lin Det {s=\\_,_ => s; n=Sg; sp=Indef} ;
mkCard : Str -> Card = \s -> lin Card {s=s} ; mkCard : Str -> Card = \s -> lin Card {s=\\_,_ => s; n=Pl} ;
mkACard : Str -> ACard = \s -> lin ACard {s=s} ; mkACard : Str -> ACard = \s -> lin ACard {s=s} ;
mkConj : Str -> Conj = \s -> lin Conj {s=s} ; mkConj : Str -> Conj = \s -> lin Conj {s=s} ;
mkPConj : Str -> PConj = \s -> lin PConj {s=s} ; mkPConj : Str -> PConj = \s -> lin PConj {s=s} ;

View File

@@ -3,14 +3,23 @@ lin
PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
UttS s = s ; UttS s = s ;
UttQS qs = qs ;
UttImpSg pol imp = {s = imp.s ! pol.p ! Sg} ;
UttImpPl pol imp = {s = imp.s ! pol.p ! Pl} ;
UttImpPol pol imp = {s = imp.s ! pol.p ! Pl} ;
UttIP ip = {s = ip.s} ;
UttIAdv iadv = iadv ;
UttNP np = {s = np.s ! Nom} ; UttNP np = {s = np.s ! Nom} ;
UttVP vp = {s = vp.Nonfinite} ; UttVP vp = {s = vp.Nonfinite} ;
UttCN cn = {s = cn.s ! Indef ! Sg ! Nom} ; UttCN cn = {s = cn.s ! Indef ! Sg ! Nom} ;
UttCard card = {s = card.s ! Neuter ! Nom} ;
UttAP ap = {s = ap.s ! Masc ! Sg ! Nom} ; UttAP ap = {s = ap.s ! Masc ! Sg ! Nom} ;
UttAdv adv = adv ; UttAdv adv = adv ;
UttInterj i = i ; UttInterj i = i ;
NoPConj = {s = []} ; NoPConj = {s = []} ;
PConjConj conj = conj ;
NoVoc = {s = []} ; NoVoc = {s = []} ;
VocNP np = {s = "," ++ np.s ! Nom} ;
} }

View File

@@ -0,0 +1,50 @@
concrete QuestionFao of Question = CatFao ** open ResFao in {
lincat QVP = {s : Tense => Polarity => Str} ;
lin
QuestCl cl = {s = cl.Indicative} ;
QuestVP ip vp = {
s = \\t,pol => ip.s ++ vp.Indicative ! t ! pol ! Masc ! persNum ip.n P3
} ;
QuestSlash ip cls = {
s = \\t,pol => ip.s ++ cls.s ! t ! pol
} ;
QuestIAdv iadv cl = {
s = \\t,pol => iadv.s ++ cl.Indicative ! t ! pol
} ;
QuestIComp icomp np = {
s = \\t,pol => icomp.s ++ copula ! t ! persNum np.n np.p ++ negStr pol ++ np.s ! Nom
} ;
IdetCN idet cn = {
s = idet.s ++ cn.s ! Indef ! idet.n ! Nom ;
n = idet.n
} ;
IdetIP idet = {
s = idet.s ;
n = idet.n
} ;
AdvIP ip adv = ip ** {s = ip.s ++ adv.s} ;
IdetQuant iquant num = {
s = iquant.s ++ num.s ! Masc ! Nom ;
n = num.n
} ;
PrepIP prep ip = {s = prep.s ++ ip.s} ;
AdvIAdv iadv adv = {s = iadv.s ++ adv.s} ;
CompIAdv iadv = iadv ;
CompIP ip = {s = ip.s} ;
ComplSlashIP vps ip = {
s = \\t,pol => vps.Indicative ! t ! PSg P3 ++ vps.particle ++ negStr pol ++ vps.c2.s ++ ip.s ++ vps.sc
} ;
AdvQVP vp iadv = {
s = \\t,pol => vp.Indicative ! t ! pol ! Masc ! PSg P3 ++ iadv.s
} ;
AddAdvQVP qvp iadv = {
s = \\t,pol => qvp.s ! t ! pol ++ iadv.s
} ;
QuestQVP ip qvp = {
s = \\t,pol => ip.s ++ qvp.s ! t ! pol
} ;
}

View File

@@ -1,7 +1,16 @@
concrete RelativeFao of Relative = CatFao ** open ResFao in { concrete RelativeFao of Relative = CatFao ** open ResFao in {
lin lin
IdRP = {s = "sum"} ; IdRP = {s = "sum"} ;
RelCl cl = {
s = \\t,pol,_,_ => "sum" ++ cl.Indicative ! t ! pol
} ;
RelVP rp vp = { RelVP rp vp = {
s = \\t,pol,g,pn => rp.s ++ vp.Indicative ! t ! pol ! g ! pn s = \\t,pol,g,pn => rp.s ++ vp.Indicative ! t ! pol ! g ! pn
} ; } ;
RelSlash rp cls = {
s = \\t,pol,_,_ => rp.s ++ cls.s ! t ! pol
} ;
FunRP prep np rp = {
s = prep.s ++ np.s ! prep.c ++ rp.s
} ;
} }

View File

@@ -169,4 +169,32 @@ oper
} }
} ; } ;
oper
negStr : Polarity -> Str = \pol -> case pol of {
Pos => [] ;
Neg => "ikki"
} ;
mkNP : Str -> Gender -> Number -> Person -> {s : Case => Str ; g : Gender ; n : Number ; p : Person} =
\str,g,n,p -> {
s = \\_ => str ;
g = g ;
n = n ;
p = p
} ;
mkCN : Str -> Gender -> CommonNoun =
\str,g -> {
s = \\_,_,_ => str ;
g = g
} ;
mkVP : Str -> VerbPhrase =
\str -> {
Converb = str ;
Indicative = \\_,pol,_,_ => str ++ negStr pol ;
Nonfinite = str ;
Participle = \\_ => str
} ;
} }

View File

@@ -5,6 +5,35 @@ concrete SentenceFao of Sentence = CatFao ** open Prelude, ResFao, (P = ParamX)
in np.s ! Nom ++ vp.Indicative ! t ! pol ! np.g ! p; in np.s ! Nom ++ vp.Indicative ! t ! pol ! np.g ! p;
Nonfinite = np.s ! Nom ++ vp.Nonfinite; Nonfinite = np.s ! Nom ++ vp.Nonfinite;
Participle = \\t => np.s ! Nom ++ vp.Participle ! t} ; Participle = \\t => np.s ! Nom ++ vp.Participle ! t} ;
PredSCVP sc vp = {Converb = sc.s ++ vp.Converb;
Indicative = \\t,pol => sc.s ++ vp.Indicative ! t ! pol ! Neuter ! PSg P3;
Nonfinite = sc.s ++ vp.Nonfinite;
Participle = \\t => sc.s ++ vp.Participle ! t} ;
SlashVP np vps = {
s = \\t,pol =>
let p = persNum np.n np.p in
np.s ! Nom ++ vps.Indicative ! t ! p ++ vps.particle ++ negStr pol ++ vps.sc ;
c2 = vps.c2
} ;
AdvSlash cls adv = cls ** {
s = \\t,pol => cls.s ! t ! pol ++ adv.s
} ;
SlashPrep cl prep = {
s = cl.Indicative ;
c2 = prep
} ;
SlashVS np vs sslash = {
s = \\t,pol =>
let p = persNum np.n np.p in
np.s ! Nom ++ vs.Indicative ! t ! p ++ vs.particle ++ negStr pol ++ sslash.s ;
c2 = sslash.c2
} ;
ImpVP vp = {
s = \\pol,n => negStr pol ++ vp.Nonfinite
} ;
AdvImp adv imp = {
s = \\pol,n => adv.s ++ imp.s ! pol ! n
} ;
UseCl temp pol cl = UseCl temp pol cl =
let let
tense = case temp.t of { tense = case temp.t of {
@@ -16,6 +45,17 @@ concrete SentenceFao of Sentence = CatFao ** open Prelude, ResFao, (P = ParamX)
in { in {
s = temp.s ++ pol.s ++ cl.Indicative ! tense ! pol.p s = temp.s ++ pol.s ++ cl.Indicative ! tense ! pol.p
} ; } ;
UseQCl temp pol qcl =
let
tense = case temp.t of {
P.Pres => Pres ;
P.Past => Past ;
P.Fut => Pres ;
P.Cond => Past
} ;
in {
s = temp.s ++ pol.s ++ qcl.s ! tense ! pol.p
} ;
UseRCl temp pol rcl = UseRCl temp pol rcl =
let let
tense = case temp.t of { tense = case temp.t of {
@@ -28,4 +68,23 @@ concrete SentenceFao of Sentence = CatFao ** open Prelude, ResFao, (P = ParamX)
s = \\g,pn => s = \\g,pn =>
temp.s ++ pol.s ++ rcl.s ! tense ! pol.p ! g ! pn temp.s ++ pol.s ++ rcl.s ! tense ! pol.p ! g ! pn
} ; } ;
UseSlash temp pol cls =
let
tense = case temp.t of {
P.Pres => Pres ;
P.Past => Past ;
P.Fut => Pres ;
P.Cond => Past
} ;
in {
s = temp.s ++ pol.s ++ cls.s ! tense ! pol.p ;
c2 = cls.c2
} ;
EmbedS s = {s = "at" ++ s.s} ;
EmbedQS qs = {s = qs.s} ;
EmbedVP vp = {s = vp.Nonfinite} ;
AdvS adv s = {s = adv.s ++ s.s} ;
ExtAdvS adv s = {s = adv.s ++ "," ++ s.s} ;
SSubjS s1 subj s2 = {s = s1.s ++ subj.s ++ s2.s} ;
RelS s rs = {s = s.s ++ "," ++ rs.s ! Neuter ! PSg P3} ;
} }

View File

@@ -1,34 +1,53 @@
concrete VerbFao of Verb = CatFao ** open Prelude,ResFao in { concrete VerbFao of Verb = CatFao ** open Prelude,ResFao in {
lin UseV v = {Converb = v.Converb ++ v.particle; lin UseV v = {Converb = v.Converb ++ v.particle;
Indicative = \\t,pol,g,p => v.Indicative ! t ! p ++ v.particle ++ Indicative = \\t,pol,g,p => v.Indicative ! t ! p ++ v.particle ++
case pol of { negStr pol ;
Pos => [] ;
Neg => "ikki"
} ;
Nonfinite = v.Nonfinite ++ v.particle; Nonfinite = v.Nonfinite ++ v.particle;
Participle = \\t => v.Participle ! t ++ v.particle} ; Participle = \\t => v.Participle ! t ++ v.particle} ;
lin ComplVV vv vp = {Converb = vv.Converb ++ vv.particle ++ vp.Nonfinite;
Indicative = \\t,pol,g,p =>
vv.Indicative ! t ! p ++ vv.particle ++ negStr pol ++ vp.Nonfinite;
Nonfinite = vv.Nonfinite ++ vv.particle ++ vp.Nonfinite;
Participle = \\t => vv.Participle ! t ++ vv.particle ++ vp.Nonfinite} ;
lin ComplVS vs s = {Converb = vs.Converb ++ vs.particle ++ "at" ++ s.s;
Indicative = \\t,pol,g,p =>
vs.Indicative ! t ! p ++ vs.particle ++ negStr pol ++ "at" ++ s.s;
Nonfinite = vs.Nonfinite ++ vs.particle ++ "at" ++ s.s;
Participle = \\t => vs.Participle ! t ++ vs.particle ++ "at" ++ s.s} ;
lin ComplVQ vq qs = {Converb = vq.Converb ++ vq.particle ++ qs.s;
Indicative = \\t,pol,g,p =>
vq.Indicative ! t ! p ++ vq.particle ++ negStr pol ++ qs.s;
Nonfinite = vq.Nonfinite ++ vq.particle ++ qs.s;
Participle = \\t => vq.Participle ! t ++ vq.particle ++ qs.s} ;
lin ComplVA va ap = {Converb = va.Converb ++ va.particle ++ ap.s ! Neuter ! Sg ! Nom;
Indicative = \\t,pol,g,p =>
va.Indicative ! t ! p ++ va.particle ++ negStr pol ++ ap.s ! g ! persNumNumber p ! Nom;
Nonfinite = va.Nonfinite ++ va.particle ++ ap.s ! Neuter ! Sg ! Nom;
Participle = \\t => va.Participle ! t ++ va.particle ++ ap.s ! Neuter ! Sg ! Nom} ;
lin AdvVP vp adv = {Converb = vp.Converb ++ adv.s; lin AdvVP vp adv = {Converb = vp.Converb ++ adv.s;
Indicative = \\t,pol,g,p => vp.Indicative ! t ! pol ! g ! p ++ adv.s; Indicative = \\t,pol,g,p => vp.Indicative ! t ! pol ! g ! p ++ adv.s;
Nonfinite = vp.Nonfinite ++ adv.s; Nonfinite = vp.Nonfinite ++ adv.s;
Participle = \\t => vp.Participle ! t ++ adv.s} ; Participle = \\t => vp.Participle ! t ++ adv.s} ;
lin ExtAdvVP vp adv = {Converb = vp.Converb ++ "," ++ adv.s;
Indicative = \\t,pol,g,p => vp.Indicative ! t ! pol ! g ! p ++ "," ++ adv.s;
Nonfinite = vp.Nonfinite ++ "," ++ adv.s;
Participle = \\t => vp.Participle ! t ++ "," ++ adv.s} ;
lin AdVVP adv vp = {Converb = adv.s ++ vp.Converb;
Indicative = \\t,pol,g,p => adv.s ++ vp.Indicative ! t ! pol ! g ! p;
Nonfinite = adv.s ++ vp.Nonfinite;
Participle = \\t => adv.s ++ vp.Participle ! t} ;
lin ComplSlash vps np = {Converb = vps.Converb ++ vps.particle lin ComplSlash vps np = {Converb = vps.Converb ++ vps.particle
++ vps.c2.s ++ np.s ! vps.c2.c; ++ vps.c2.s ++ np.s ! vps.c2.c ++ vps.sc;
Indicative = \\t,pol,g,p => Indicative = \\t,pol,g,p =>
vps.Indicative ! t ! p ++ vps.particle ++ vps.Indicative ! t ! p ++ vps.particle ++
case pol of { negStr pol ++
Pos => [] ; vps.c2.s ++ np.s ! vps.c2.c ++ vps.sc ;
Neg => "ikki" Nonfinite = vps.Nonfinite ++ vps.particle ++ vps.c2.s ++ np.s ! vps.c2.c ++ vps.sc;
} ++ Participle = \\t => vps.Participle ! t ++ vps.particle ++ vps.c2.s ++ np.s ! vps.c2.c ++ vps.sc} ;
vps.c2.s ++ np.s ! vps.c2.c ;
Nonfinite = vps.Nonfinite ++ vps.particle ++ vps.c2.s ++ np.s ! vps.c2.c;
Participle = \\t => vps.Participle ! t ++ vps.particle ++ vps.c2.s ++ np.s ! vps.c2.c} ;
lin UseComp comp = { lin UseComp comp = {
Converb = copula ! Pres ! PPl ++ comp.s ! Masc ! Sg ; Converb = copula ! Pres ! PPl ++ comp.s ! Masc ! Sg ;
Indicative = \\t,pol,g,p => copula ! t ! p ++ Indicative = \\t,pol,g,p => copula ! t ! p ++
case pol of { negStr pol ++
Pos => [] ;
Neg => "ikki"
} ++
comp.s ! g ! persNumNumber p ; comp.s ! g ! persNumNumber p ;
Nonfinite = "vera" ++ comp.s ! Masc ! Sg ; Nonfinite = "vera" ++ comp.s ! Masc ! Sg ;
Participle = \\t => "verið" ++ comp.s ! Masc ! Sg Participle = \\t => "verið" ++ comp.s ! Masc ! Sg
@@ -37,6 +56,83 @@ concrete VerbFao of Verb = CatFao ** open Prelude,ResFao in {
lin CompNP np = {s = \\_,_ => np.s ! Nom} ; lin CompNP np = {s = \\_,_ => np.s ! Nom} ;
lin CompAdv adv = {s = \\_,_ => adv.s} ; lin CompAdv adv = {s = \\_,_ => adv.s} ;
lin CompCN cn = {s = \\_,n => cn.s ! Indef ! n ! Nom} ; lin CompCN cn = {s = \\_,n => cn.s ! Indef ! n ! Nom} ;
lin UseCopula = {
Converb = "verið" ;
Indicative = \\t,pol,_,p => copula ! t ! p ++ negStr pol ;
Nonfinite = "vera" ;
Participle = \\_ => "verið"
} ;
lin SlashV2a v = v ; lin SlashV2a v = v ** {sc = []} ;
lin Slash2V3 v np = v ** {
Converb = v.Converb ++ v.particle ++ v.c2.s ++ np.s ! v.c2.c ;
Indicative = \\t,p => v.Indicative ! t ! p ++ v.particle ++ v.c2.s ++ np.s ! v.c2.c ;
Nonfinite = v.Nonfinite ++ v.particle ++ v.c2.s ++ np.s ! v.c2.c ;
Participle = \\t => v.Participle ! t ++ v.particle ++ v.c2.s ++ np.s ! v.c2.c ;
particle = [] ;
c2 = v.c3 ;
sc = []
} ;
lin Slash3V3 v np = v ** {
c2 = v.c2 ;
sc = v.c3.s ++ np.s ! v.c3.c
} ;
lin SlashV2A v ap = v ** {
c2 = v.c2 ;
sc = ap.s ! Neuter ! Sg ! Nom
} ;
lin SlashV2S v s = v ** {
c2 = v.c2 ;
sc = "at" ++ s.s
} ;
lin SlashV2Q v qs = v ** {
c2 = v.c2 ;
sc = qs.s
} ;
lin SlashV2V v vp = v ** {
c2 = v.c2 ;
sc = vp.Nonfinite
} ;
lin SlashVV vv vps = vps ** {
Converb = vv.Converb ++ vv.particle ++ vps.Nonfinite ;
Indicative = \\t,p => vv.Indicative ! t ! p ++ vv.particle ++ vps.Nonfinite ;
Nonfinite = vv.Nonfinite ++ vv.particle ++ vps.Nonfinite ;
Participle = \\t => vv.Participle ! t ++ vv.particle ++ vps.Nonfinite ;
particle = []
} ;
lin SlashV2VNP v np vps = v ** {
c2 = v.c2 ;
sc = v.c3.s ++ np.s ! v.c3.c ++ vps.Nonfinite
} ;
lin ReflVP vps =
let np = mkNP "seg" Masc Sg P3 in {
Converb = vps.Converb ++ vps.particle ++ vps.c2.s ++ np.s ! vps.c2.c ++ vps.sc ;
Indicative = \\t,pol,g,p =>
vps.Indicative ! t ! p ++ vps.particle ++ negStr pol ++ vps.c2.s ++ np.s ! vps.c2.c ++ vps.sc ;
Nonfinite = vps.Nonfinite ++ vps.particle ++ vps.c2.s ++ np.s ! vps.c2.c ++ vps.sc ;
Participle = \\t => vps.Participle ! t ++ vps.particle ++ vps.c2.s ++ np.s ! vps.c2.c ++ vps.sc
} ;
lin PassV2 v = {
Converb = "verið" ++ v.Participle ! Past ;
Indicative = \\t,pol,_,p => copula ! t ! p ++ negStr pol ++ v.Participle ! Past ;
Nonfinite = "vera" ++ v.Participle ! Past ;
Participle = \\_ => "verið" ++ v.Participle ! Past
} ;
lin AdvVPSlash vps adv = vps ** {sc = vps.sc ++ adv.s} ;
lin AdVVPSlash adv vps = vps ** {
Converb = adv.s ++ vps.Converb ;
Indicative = \\t,p => adv.s ++ vps.Indicative ! t ! p ;
Nonfinite = adv.s ++ vps.Nonfinite ;
Participle = \\t => adv.s ++ vps.Participle ! t
} ;
lin VPSlashPrep vp prep = {
Converb = vp.Converb ;
imperative = \\_ => vp.Nonfinite ;
Indicative = \\t,p => vp.Indicative ! t ! Pos ! Masc ! p ;
Nonfinite = vp.Nonfinite ;
Participle = vp.Participle ;
particle = [] ;
c2 = prep ;
sc = []
} ;
} }