s --> np(Arv,nom),vp(Arv).
np(A,K) --> n(A,K).
vp(A) --> itv(A),vaba(_,_).
vp(A) -->trv(A),vaba(viis,_),np(_,part),vaba(X,_),{X\==viis}.
vp(A) -->ditr(A),vaba(X,_),np(_,all),np(_,gen),vaba(Y,_),{X\==Y}.
s-->vaba(Y,leidub),itv(A),np(A,nom),vaba(X,_),{X\==Y}.
s-->vaba(X,leidub),trv(A),np(A,nom),vaba(Y,_),np(_,part),vaba(Z,_),{X\==Y,Y\==Z,X\==Z}.


vaba(aeg,leidub)-->ajaadv.
vaba(koht,leidub)-->np(_,in).
vaba(viis,leidub)-->viisiadv.
vaba(_,eileidu)-->[].

np(A,K)-->ap(A,K),n(A,K),{K\==kom}.
ap(A,K) -->intensifier,a(A,K).
intensifier-->[v2ga];[].
a(sg,nom)-->[suur].
a(sg,gen)-->[suure].
a(sg,part)-->[suurt].
a(sg,all)-->[v2iksele].

np(pl,K) --> kvantor(K),np(sg,part),{K==nom;K==gen;K==part}.
np(pl,K) -->kvantor(K),np(sg,K),{K\==nom,K\==gen,K\==part}.

kvantor(nom) --> [kolm].

itv(sg) -->[magas].
itv(pl) -->[magasid].
n(sg,nom) -->[koer];[laps];[ema].
n(sg,part) -->[kassi].
trv(sg) --> [ehmatas].
ditr(sg) --> [andis].
ajaadv --> [hommikul].
viisiadv -->[hirmsasti].
n(sg,in) -->[kuudis];[oues].
n(sg,all) -->[kassile];[lapsele].
n(sg,gen) -->[piima];[kommi].

