summaryrefslogtreecommitdiff
path: root/old-lib/resource/catalan/MorphoCat.gf
blob: f21bc849d9f8fef4b99fc1d821e74047d901ae5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
--# -path=.:../romance:../common:../../prelude

--1 A Simple Catalan Resource Morphology
--
-- Aarne Ranta 2002 -- 2005
-- Jordi Saludes 2008: Derived from MorphoSpa. 
--
-- This resource morphology contains definitions needed in the resource
-- syntax. To build a lexicon, it is better to use $ParadigmsCat$, which
-- gives a higher-level access to this module.

resource MorphoCat = CommonRomance, ResCat ** 
  open PhonoCat, Prelude, Predef in {

  flags optimize=all ; coding=utf8 ;

--2 Nouns
--
-- The following macro is useful for creating the forms of number-dependent
-- tables, such as common nouns.
-- gcc M2.3
oper
  numForms : (_,_ : Str) -> Number => Str = \vi, vins ->
    table {Sg => vi ; Pl => vins} ; 

  nomCep : Str -> Number => Str = \cep -> 
    numForms cep (cep + "s") ;


  nomCasa : Str -> Str -> Number => Str = \es,casa ->
  	numForms casa (init casa + es) ;

  nomFre : Str -> Number => Str = \fre ->
  	numForms fre (fre + "ns") ;
	
  nomCas : Str -> Number => Str = \cas ->
	numForms cas (cas + "os") ;
	
  nomTest : Str -> Number => Str = \test ->
  	numForms test (variants {test + "s"; test + "os"}) ; 

  nomFaig : Str -> Number => Str = \faig ->
	let
		fa = Predef.tk 2 faig
	in
	numForms faig (variants {fa + "jos" ; faig + "s"}) ;
	
  nomDesig : Str -> Number => Str = \desig ->
	let 
		desi = Predef.tk 1 desig
	in
	numForms desig (variants {desi + "tjos" ; desi + "gs"}) ;
	
  nomTemps : Str -> Number => Str = \temps ->
	numForms temps temps ;

-- Common nouns are inflected in number and have an inherent gender.

  mkNoun : (Number => Str) -> Gender -> Noun = \noinois,gen -> 
    {s = noinois ; g = gen} ;

  mkNounIrreg : Str -> Str -> Gender -> Noun = \vi,vins -> 
    mkNoun (numForms vi vins) ;

  mkNomReg : Str -> Noun = \noi ->
	let
		mkNounMas : (Str -> Number => Str) -> Noun = \rule -> mkNoun (rule noi) Masc
	in
    case last noi of {
      "a" 						=> mkNoun (nomCasa "es" noi) Fem ;
	  "s"|"x"|"ç" 				=> mkNounMas nomCas ;
	  "i"|"e"					=> mkNounMas nomFre ;
	  "í"						=> mkNounMas (nomCasa "ins") ;
	  "à"						=> mkNounMas (nomCasa "ans") ;
	  "ó"						=> mkNounMas (nomCasa "ons") ;
	  "g"						=> mkNounMas nomFaig ;
      _   						=> mkNounMas nomCep
     } ;

--2 Adjectives
--
-- Adjectives are conveniently seen as gender-dependent nouns.
-- Here are some patterns. First one that describes the worst case.
-- gcc M2.1

  mkAdj : (_,_,_,_,_ : Str) -> Adj = \prim,prima,prims,primes,primament ->
    {s = table {
       AF Masc n => numForms prim prims ! n ;
       AF Fem  n => numForms prima primes ! n ;
       AA        => primament
       }
    } ;

--- Then the regular and invariant patterns.

  adjPrim : Str -> Adj = \prim -> 
    mkAdj prim (prim + "a") (prim + "s") (prim + "es") (prim + "ament") ;

  adjBlau : Str -> Str -> Adj = \blau,blava ->
	let
		blav = Predef.tk 1 blava
	in
 	mkAdj blau blava (blau + "s") (blav + "es") (blava + "ment") ;
	
  adjFondo : Str -> Adj = \fondo ->
	let
		fond = Predef.tk 1 fondo
	in
	adjBlau fondo (fond + "a") ;
	
  adjBo : Str -> Adj = \bo ->
	mkAdj bo (bo + "na") (bo + "ns") (bo + "nes") (bo + "nament") ;

  adjFidel : Str -> Adj = \fidel ->
	let
		fidels = fidel + "s"
	in
	mkAdj fidel fidel fidels fidels (fidel + "ment") ;

  mkAdjReg : Str -> Adj = \prim ->
	case last prim of {
		"e"|"u"|"o"	=> adjFondo prim ;
		_			=> adjPrim prim  
	} ;


--2 Personal pronouns
--
-- All the eight personal pronouns can be built by the following macro.
-- The use of "ne" as atonic genitive is debatable.
-- We follow the rule that the atonic nominative is empty.

  mkPronoun : (_,_,_,_,_,_,_,_ : Str) -> 
              Gender -> Number -> Person -> Pronoun =
    \il,le,lui,Lui,son,sa,ses,see,g,n,p ->
    {s = table {
       Ton Nom => il ;
       Ton x => prepCase x ++ Lui ;
       Aton Nom => strOpt il ; ---- [] ;
       Aton Acc => le ;
       Aton (CPrep P_a) => lui ;
       Aton q       => prepCase q ++ Lui ; ---- GF bug with c or p! 
       Poss Masc Sg => son ;
       Poss Fem Sg  => sa ;
       Poss Masc Pl => ses ;
       Poss Fem Pl  => see
       } ;
     a = {g = g ; n = n ; p = p} ;
     hasClit = True
    } ;


--2 Determiners
--
-- Determiners, traditionally called indefinite pronouns, are inflected
-- in gender and number, like adjectives.

  pronForms : Adj -> Gender -> Number -> Str = \tal,g,n -> tal.s ! AF g n ;

}