From 2cf9c2ff1e813c253f56eefd1edd1be3137902c7 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Sun, 28 Jun 2020 12:35:05 +0200 Subject: [PATCH] (Hun) Handle multiword splitting already in Paradigms. --- src/hungarian/NounMorphoHun.gf | 15 ++++++++++ src/hungarian/ParadigmsHun.gf | 52 ++++++++++++++++++++++++---------- 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/hungarian/NounMorphoHun.gf b/src/hungarian/NounMorphoHun.gf index cb68d8db..fb11685c 100644 --- a/src/hungarian/NounMorphoHun.gf +++ b/src/hungarian/NounMorphoHun.gf @@ -629,4 +629,19 @@ oper _ => endCase c } ; + Multiword : Type = {p1,p2 : Str} ; + splitMultiword : Str -> Multiword = \multi_word -> case multi_word of { + x + "-" + y + => ; + v + " " + w + " " + x + " " + y + " " + z + => ; + w + " " + x + " " + y + " " + z + => ; + x + " " + y + " " + z + => ; + y + " " + z + => ; + _ => <"", multi_word> + } ; + } diff --git a/src/hungarian/ParadigmsHun.gf b/src/hungarian/ParadigmsHun.gf index 1887bea3..69f285e7 100644 --- a/src/hungarian/ParadigmsHun.gf +++ b/src/hungarian/ParadigmsHun.gf @@ -122,34 +122,56 @@ oper harmO = ResHun.H_o ; mkN = overload { - mkN : Str -> N = - \s -> lin N (regNoun s) ; + mkN : Str -> N = \s -> + let mw : Multiword = splitMultiword s ; + in case mw of { + => multiwordN pr (regNoun n) + } ; - mkN : Str -> Str -> N = - \n,a-> lin N (regNounNomAcc n a) ; + mkN : Str -> Str -> N = \n,a -> + let mwn : Multiword = splitMultiword n ; + mwa : Multiword = splitMultiword a ; + in multiwordN mwn.p1 (regNounNomAcc mwn.p2 mwa.p2) ; - mkN : Str -> Str -> Str -> N = - \n,a,pln-> lin N (regNounNomAccPl n a pln) ; + mkN : Str -> Str -> Str -> N = \n,a,pln -> + let mwn : Multiword = splitMultiword n ; + mwa : Multiword = splitMultiword a ; + mwpln : Multiword = splitMultiword pln ; + in multiwordN mwn.p1 (regNounNomAccPl mwn.p2 mwa.p2 mwpln.p2) ; - mkN : (x1,_,_,x4 : Str) -> N = - \n,a,pln,possd -> lin N (regNoun4 n a pln possd) ; + mkN : (x1,_,_,x4 : Str) -> N = \n,a,pln,possd -> + let mwn : Multiword = splitMultiword n ; + mwa : Multiword = splitMultiword a ; + mwpln : Multiword = splitMultiword pln ; + mwpossd : Multiword = splitMultiword possd ; + in multiwordN mwn.p1 (regNoun4 mwn.p2 mwa.p2 mwpln.p2 mwpossd.p2) ; - mkN : (unoka : Str) -> (testvér : N) -> N = -- Compound noun: e.g. `mkN "unoka" (mkN "testvér")`. - \prefix,n -> n ** {s = \\x => prefix + n.s ! x} ; + mkN : (unoka : Str) -> (testvér : N) -> N = compoundN ; + --------------------------------------------------------------------- + -- Not in the visible API. TODO remove, improve or document better -- + --------------------------------------------------------------------- + + -- Worst case with 9 strings. mkN : (x1,_,_,_,_,_,_,_,x9 : Str) -> N = \nomsg,accsg,supsg,allsg,nompl,f,g,h,i -> lin N (worstCaseNoun nomsg accsg supsg allsg nompl f g h i (harmFromSgAll allsg)) ; - -- mkN : (férfi : Str) -> (harm : Harmony) -> (ak : Str) -> N ; -- Noun with unpredictable vowel harmony and plural allomorph - mkN : Str -> Harmony -> N = - \s,h -> lin N (mkNounHarm h (pluralAllomorph s) s) ; - + -- Noun with unpredictable vowel harmony and plural allomorph mkN : Str -> (plural : Str) -> Harmony -> N = - \s,pl,h -> lin N (mkNounHarm h pl s) ; + \s,pl,h -> lin N (mkNounHarm h pl s) + } ; + multiwordN : Str -> Noun -> N = + \prefix,n -> case prefix of { + _ + "-" => compoundN prefix n ; + _ => lin N (n ** {s = \\x => prefix ++ n.s ! x}) + } ; + + compoundN : (unoka : Str) -> (testvér : Noun) -> N = -- Compound noun: e.g. `mkN "unoka" (mkN "testvér")`. + \prefix,n -> lin N (n ** {s = \\x => prefix + n.s ! x}) ; mkN2 = overload { mkN2 : Str -> N2 = \s -> lin N2 (regNoun s) ;