コード例 #1
0
ファイル: lihtlisa.cpp プロジェクト: Filosoft/vabamorf
int eemalda_ainsus( void )
    {
    int  i,r;
    FSXSTRING tmp1;

    for (i=0; i < 11; i++)   /* eemalda kõik gen-st tulenevad ainsuse vormid */
	    {
        tmp1 = (const FSxCHAR *)ains_vorm;
        tmp1 += analog_v[i];
	    r = eemalda( (FSxCHAR *)(const FSxCHAR *)tmp1 );
	    if ( !r )
	        return( 0 );
	    }
    r = eemalda( FSxSTR("sg n") );     /* eemalda ainsuse nimetav */
    if ( !r )
	    return( 0 );
    r = eemalda( FSxSTR("sg g") );     /* eemalda ainsuse omastav */
    if ( !r )
	    return( 0 );
    r = eemalda( FSxSTR("sg p") );     /* eemalda ainsuse osastav */
    if ( !r )
	    return( 0 );
    r = eemalda( FSxSTR("adt") );       /* eemalda aditiiv */
    r = eemalda( FSxSTR("(adt)") );     /* eemalda aditiiv */
    return(1);
    }
コード例 #2
0
ファイル: chkoleta.cpp プロジェクト: theranger/vabamorf
void MORF0::arvamin(
    const FSXSTRING *sisse, // sisends6na
    MRFTULEMUSED *tul)
{
    if (!mrfFlags.Chk(MF_OLETA))  // ei tulegi oletada
        return;
    int res;

    FSXSTRING sona= *sisse;
    TaheHulgad::AsendaMitu(&sona, TaheHulgad::uni_kriipsud, TaheHulgad::amor_kriipsud);

    tul->tagasiTasand=0;
    tul->mitmeS6naline = 1;    // s.t. oletame 1 s�na, mitte v�ljendeid
    tul->keeraYmber = false;
    tul->eKustTulemused=eMRF_AO; // anal��sid oletajast
    tul->DelAll();

    if (sisse->GetLength() >= STEMLEN) // tegelt seda juba chkmin() kontrollis
    {
        tul->Add((const FSxCHAR *)*sisse, FSxSTR(""), FSxSTR(""), FSxSTR("Z"), FSxSTR("")); // parema puudusel
        return;
    }
    res = arvax( tul, &sona );
    if (res != ALL_RIGHT)
    {
        tul->eKustTulemused=eMRF_XX;
        tul->s6na = FSxSTR("");
        throw(VEAD(ERR_MG_MOOTOR, ERR_MINGIJAMA, __FILE__, __LINE__, "$Revision: 542 $")); //jama!
    }
}
コード例 #3
0
ファイル: strtosi.cpp プロジェクト: tpetmanson/jsvabamorf
int Xstr_2_int // ==0:pole numbrit; >0: niimitmest baidist tehti m�rgiga t�isarv;
	(
	int           *i,	// saadud m�rgiga t�isarv
	const FSxCHAR *xstr // l�htestring
	)
	{
	int n=0, x;
    bool miinus;

    if(*xstr == (FSxSTR("-"))[0])
        {
        miinus = true;
        n++;
        }
    else
        {
        miinus = false;
        if(*xstr == (FSxSTR("+"))[0])
            {
            n++;
            }
        }
    if(TaheHulgad::number.Find(xstr[n]) == -1)
        {
        return 0;   // pole number
        }
    for(x=0; xstr[n] && TaheHulgad::number.Find(xstr[n]) >= 0; n++)
		{
		x = 10 * x + (xstr[n]-(FSxSTR("0"))[0]);
		}
    *i = miinus ? -x : x;

    return n;       // n baiti teisendasime t�isarvuks
	}
コード例 #4
0
ファイル: mrf-gen.cpp プロジェクト: urdvr/estnltk
LYLI *ETMRFAS::Flush(void)
{
    if(mrfFlags->ChkB(MF_GENE)==false)
        return ETMRFA::Flush(); //analüüs

    // läheb sünteesiks
    FSXSTRING gTyvi, gKigi, gSl, gVormid;
    FSXSTRING gnaidis;  // sõna, mis peaks genetavas paradigmas olema, nt palk puhul palgi või palga
    int pos3;
    int pos1, pos2;
    MRFTULEMUSED geneOut;
    int idx;
    LYLI* tmpGeneLyliPtr=aGene.Lyli(0,A2_SUVALINE_LYLI,&idx);
    if(tmpGeneLyliPtr==NULL)
        return NULL; // ei saanud ahelast midagi
    // saime ahelast midagi...
    if((tmpGeneLyliPtr->lipp & PRMS_SONA)!=PRMS_SONA)// Kui pole lemme+vorm (on TAG vms)...
        return aGene.LyliPtrOut(idx); //...tõstame mälu vabastamata ahelast välja
    // ja anname genemata tagasi
    // lemma+vorm, tuleb geneda
    // jätame ta esialgu sünteesiahelasse ja teeme seal mida vaja
    geneStr=*(tmpGeneLyliPtr->ptr.pStr); //seda hakkame genema: 'tüvi' //_sl_ vormid//kigi'
    if(geneStr.GetLength() <= 0)
        throw(VEAD(ERR_GEN_MOOTOR,ERR_ARGVAL,__FILE__,__LINE__));
    geneStr.Trim();
    if((pos1=geneStr.Find(FSxSTR(" //_"))) <= 0)
        throw(VEAD(ERR_GEN_MOOTOR,ERR_ARGVAL,__FILE__,__LINE__));
    gTyvi=geneStr.Left(pos1);
    // näidise olemasolu puhuks
    pos2 = gTyvi.Find(FSxSTR(" ("));
    pos3 = gTyvi.Find(FSxSTR(")"));
    if (pos2 != -1 && pos3 > pos2+4 && pos3==gTyvi.GetLength()-1) // näidis leitigi
    {
        gnaidis = gTyvi.Mid(pos2+2, pos3-pos2-2);
        gTyvi=geneStr.Left(pos2);
    }
    if(geneStr.GetLength() < pos1+5 || geneStr[pos1+5]!=(FSxCHAR)'_')
        throw(VEAD(ERR_GEN_MOOTOR,ERR_ARGVAL,__FILE__,__LINE__));
    gSl=geneStr.Mid(pos1+4,1);
    if((pos2=geneStr.Find(FSxSTR(" //"), pos1+5))<=0)
        throw(VEAD(ERR_GEN_MOOTOR,ERR_ARGVAL,__FILE__,__LINE__));
    if(pos1+5 < pos2)
    {
        gVormid=geneStr.Mid(pos1+6, pos2-pos1-6);
        gVormid.Trim();
    }
    // else vormid==""
    gKigi=geneStr.Mid(pos2+3, geneStr.GetLength()-pos2-3);
    gKigi.Trim();

    //if(Synt1(geneOut, &gTyvi, &gSl, &gVormid, &gKigi)==false)
    if(SyntDetailne(geneOut, &gTyvi, &gnaidis, &gSl, &gVormid, &gKigi)==false)
    {
        // jama või ei õnnestunud sünteesida
    }
    tmpGeneLyliPtr->Start(geneOut, PRMS_MRF);
    geneStr=FSxSTR("\0");
    return aGene.LyliPtrOut(idx); // tõstame genetud asjaga lüli
    // mälu vabastamata ahelast välja
}
コード例 #5
0
ファイル: arva_av.cpp プロジェクト: Filosoft/vabamorf
// return true, kui s�na v�iks suurt�helisuse poolest olla p�risnimi
bool OLETAJA_DCT::sobiks_nimeks(FSXSTRING *sisendsona)
    {
    //FSXSTRING S6na;
    int S6naPikkus, i;

    if (!sobiks_sonaks(sisendsona))
        return false;
    S6naPikkus = sisendsona->GetLength();
    // ei saa suurt�helisust niisama lihtsalt kontrollida, 
    // sest pole k�ikv�imalike ime-suurt�htede loendit 
    if (!TaheHulgad::OnSuur(sisendsona, 0) && !TaheHulgad::OnSuur(sisendsona, 1)) // pole Nimi ega eNimi
        return false;  // 1. v�i ��rmisel juhul 2. t�ht oli v�ike
    for (i=S6naPikkus-1; i > 0; i--)
        {
        if (!TaheHulgad::OnPisi(sisendsona, i))
            break;
        }
//    S6na = *sisendsona;
//    S6na.TrimRight(TaheHulgad::vaiketht);
//    spik = S6na.GetLength();
    if ( i > S6naPikkus-3 )  // liiga l�hike ots
        {
        if (TaheHulgad::OnAlguses(sisendsona, FSxSTR("Mc")) || 
                TaheHulgad::OnAlguses(sisendsona, FSxSTR("Mac")))
            return true;
        if (!TaheHulgad::OnSuur(sisendsona, i-1)) // ja pole nt NoWe
            return false;
        }
    return true;
    }
コード例 #6
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int gu_lisa( void )
    {
    int r;

    r = lisa( gu_tyvi, gu_format, FSxSTR("gu") );
    if ( !r )
	    return(0);
    if ( !FSxSTRCMP(gu_format, FSxSTR("GU")) )            /* lk 54 */
	    {
	    r = lisa( gu_tyvi, FSxSTR("GEM"), FSxSTR("gem") );
	    if ( !r )
	        return(0);
	    r = lisa( gu_tyvi, FSxSTR("GE"), FSxSTR("ge") );
	    if ( !r )
	        return(0);
	    }
    else
	    {
	    r = lisa( gu_tyvi, FSxSTR("KEM"), FSxSTR("gem") );
	    if ( !r )
	        return(0);
	    r = lisa( gu_tyvi, FSxSTR("KE"), FSxSTR("ge") );
	    if ( !r )
	        return(0);
	    }
    return(1);
    }
コード例 #7
0
ファイル: arvamitte.cpp プロジェクト: Filosoft/vabamorf
int MORF0::arvamitte(MRFTULEMUSED *tulemus, FSXSTRING *S6na)
    {
    if ( TaheHulgad::PoleMuudKui(S6na, &(TaheHulgad::s_punktuatsioon)))         /* ilmselt _Z_ */
	    {			  /* korraldame va"ljatryki */
        tulemus->Add((const FSxCHAR *)(*S6na), FSxSTR(""), FSxSTR(""), FSxSTR("Z"), FSxSTR("")); 
	    }
	return ALL_RIGHT;
	}
コード例 #8
0
ファイル: arva_av.cpp プロジェクト: Filosoft/vabamorf
// p�risnimele sobimatute muutumismallide elimineerimiseks
bool OLETAJA_DCT::pn_sobiv_kirje(void)
    {
    assert(ot_viimane_kirje.tyypsona);
    if (!FSxSTRCMP(ot_viimane_kirje.tyypsona, FSxSTR("praene")))
        return false;
    if (!FSxSTRCMP(ot_viimane_kirje.tyypsona, FSxSTR("heeringas")))
        return false;
    if (!FSxSTRCMP(ot_viimane_kirje.tyypsona, FSxSTR("kreemjas")))
        return false;
    return true;
    }
コード例 #9
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int ma_lisa( void )
    {
    int r;

    r = lisa( ma_tyvi, ma_format, FSxSTR("ma") );
    if ( !r )
	    return(0);
    r = lisa( ma_tyvi, FSxSTR("VAT"), FSxSTR("vat") );      /* analoogiareegel (lk 53) */
    if ( !r )
	    return(0);
    return(1);
    }
コード例 #10
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int me_lisa( void )
    {
    int r;

    r = lisa( me_tyvi, me_format, FSxSTR("me") );
    if ( !r )
	    return(0);
    r = lisa( me_tyvi, FSxSTR("TE"), FSxSTR("te") );
    if ( !r )
	    return(0);
    r = lisa( me_tyvi, FSxSTR("VAD"), FSxSTR("vad") );
    if ( !r )
	    return(0);
    return(1);
    }
コード例 #11
0
ファイル: sobivus.cpp プロジェクト: Filosoft/vabamorf
/*
* return 1, kui ty-le vo~iks "ne" otsa kleepida, et saada omaduss. tu"ve
*/
int MORF0::sobiks_ne( FSXSTRING *ty, int pikkus )
    {
    int  j;
    int  silpe, silp;
    FSXSTRING tyvi;

    silpe = 0;
    silp = VANA_SILP;
    tyvi = (const FSxCHAR *)(ty->Left(pikkus));
    for (j=0; j < pikkus; j++)
	    {
        if (TaheHulgad::OnTaishaalik(tyvi[j]))
	        {
	        if (silp == VANA_SILP)
		        silpe++;
	        silp = UUS_SILP;
	        }
	    else
	        {
	        silp = VANA_SILP;
	        }
	    }
    if ( silpe < 2 )    /* liiga lu"hike so~na */
    	return 0;
    if ( TaheHulgad::OnLopus(&tyvi, FSxSTR("akt")) )
    	return 1;       /* na"it. "...iil" */
    if ( TaheHulgad::OnTaishaalik(tyvi[pikkus-3]) &&
	      TaheHulgad::OnTaishaalik(tyvi[pikkus-2]) &&
	       !TaheHulgad::OnTaishaalik(tyvi[pikkus-1]) )
    	return 1;       /* na"it. "...iil" */
    return 0;
    }
コード例 #12
0
ファイル: sobivus.cpp プロジェクト: Filosoft/vabamorf
/*
* return minimaalne tyvepikkus, mida on m�tet otsida 
*/
int MORF0::minipik(FSXSTRING *ty)
    {
    FSXSTRING ttt;
    int pik=2;

    ttt = (const FSxCHAR *)(ty->Left(3));  
    if ( ttt == FSxSTR("alu") || ttt == FSxSTR("ude") || ttt == FSxSTR("pan") )
	    pik = 4;
    else
        {
        ttt = (const FSxCHAR *)(ttt.Left(2));
        if ( ( (dctLoend[9])[(FSxCHAR *)(const FSxCHAR *)ttt] ) == -1 )
	        pik = 3;
        }
    return(pik);
    }
コード例 #13
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int v_lisa( void )
    {
    int r;

    r = lisa( v_tyvi, v_format, FSxSTR("v") );
    return(r);
    }
コード例 #14
0
ファイル: dctcnv4.cpp プロジェクト: Filosoft/vabamorf
//
// 2.ring: indeksid asemele
//
void PaneIndeksidAsemele(
    CFSFileName &inFileName,
    CFSFileName &outFileName)
    {
    CPFSFile in, out;
    CFSbaseSTRING rida, uusRida;

    if(in.Open(inFileName, FSTSTR("rb"))==false)
        {
        printf(FSTSTR("%s: ei saa faili avatud\n"), (const FSTCHAR *)inFileName);
        exit( EXIT_FAILURE );
        }
    printf(FSTSTR("%s "), (const FSTCHAR *)outFileName);
    if(out.Open(outFileName, FSTSTR("wb+"))==false)
        {
        printf(FSTSTR("\n%s: ei saa faili luua\n"), (const FSTCHAR *)outFileName);
        exit( EXIT_FAILURE );
        }
    while(in.ReadLine(&rida)==true)
        {
        int idx;
        TeeSLL(&rida); // jupitame uuesti sisendrea
        if((idx=sonaliikideMassiiv.GetIdx(&sonaLiigiString)) < 0)
            {
            printf(FSTSTR("Ei leia juba tehtud sõnaliigijärjendit\n"));
            assert( false );        
            }
        // paneme uue rea kokku
        uusRida.Format(FSxSTR("%s %d=%s\n"), (const FSxCHAR*)tyvi, idx, (const FSxCHAR*)tyveInf);
        out.WriteString((const FSxCHAR *)(uusRida), uusRida.GetLength());
        }
    in.Close();
    out.Close();
    }
コード例 #15
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int s_lisa( void )
    {
    int r;

    r = lisa( s_tyvi, s_format, FSxSTR("s") );
    return(r);
    }
コード例 #16
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int takse_lisa( void )
    {
    int r;

    r = lisa( takse_tyvi, takse_format, FSxSTR("takse") );
    return(r);
    }
コード例 #17
0
ファイル: mrf-gen.cpp プロジェクト: urdvr/estnltk
void ETMRFAS::Clr(void)
{
    ETMRFA::Clr();
    aGene.DelAll();
    geneStr=FSxSTR("\0");
    //delete retGeneLyliPtr;
    //retGeneLyliPtr=NULL;
}
コード例 #18
0
ファイル: bsearch.cpp プロジェクト: tpetmanson/jsvabamorf
// Muditud klassindust 2002.kevad
// KOtsi 
//  ==true:  v6ti   oli  kahendtabelis element nr  *idx
//  ==false: v6ti polnud kahendtabelis, lisada *idx-indaks
//
bool cTYVEDETABEL::KOtsi
	(
	const BTABLE  *kt,
	const FSxCHAR *v6ti,
	const int vPikkus,
	int   *idx) const
	{
    ASSERT( vPikkus >=0 && v6ti != NULL);

    int i;
	int v = 0,
	    p = kt->ktSuurus - 1,
	    k = (p - v) / 2,
		n=0;
    if(vPikkus<=0 || v6ti==NULL || *v6ti==FSxSTR("")[0])
        {
        *idx=0;
        return false;
        }
	// Otsime kahendtabelist
    //
	while(v <= p)
		{        
        const FSxCHAR *ptr = kt->v6tmed + kt->kTabel[k].s_nihe;
        int l1=vPikkus;
        int l2=kt->kTabel[k].len;
        int ll=l1 < l2 ? l1 : l2;    
        ASSERT( l1 > 0 && l2 >= 0 && ll >= 0);
        if(ll)
            {
            for(i=0; i < ll && (n=TaheHulgad::FSxCHCMP(v6ti[i], ptr[i]))==0; i++)
                ;
            if(n==0)
                n = l1 - l2;
            }
        else
            {
            n=1; // oli 2ndtabeli 1mene 0pikkusega element
            ASSERT( k==0 &&  kt->kTabel[k].len==0 );
            }
        if(n < 0)
			{
			p = k - 1;      // v6ti < kahendtabeli jooksvast v�tmest
			}
		else if(n > 0)
			{
			v = k + 1;      // v6ti > kahendtabeli jooksvast v�tmest
			}
		else                // n == 0 st oli kahendtabelis
			{
			*idx = k;       // v6ti == kahendtabeli jooksva v�tmega
			return true;    // Leidsin kahendtabelist!
			}
		k = v + (p - v) / 2;
		}
	*idx = v;               // Polnud kahendtabelis.
	return false;
	}
コード例 #19
0
ファイル: lihtlisa.cpp プロジェクト: Filosoft/vabamorf
int lisa_ainsus( FSXSTRING *stem )
    {
    int  i,r;
    FSXSTRING tmp1;

    for (i=0; i < 11; i++)   /* lisa kõik gen-st tulenevad ainsuse vormid */
	    {
        tmp1 = (const FSxCHAR *)ains_vorm;
        tmp1 += analog_v[i];
	    r = lisa( stem, analog_l[i], (FSxCHAR *)(const FSxCHAR *)tmp1 );
	    if ( !r )
	        return( 0 );
	    }
    r = lisa( stem, FSxSTR("D"), FSxSTR("pl n") );     /* lisa mitmuse nimetav */
    if ( !r )
	    return( 0 );
    return(1);
    }
コード例 #20
0
ファイル: dctcnv4.cpp プロジェクト: Filosoft/vabamorf
//
// Tükelda sisendfaili rida
//
void TeeSLL(CFSbaseSTRING *rida) // real alati 1 tühik lõpus
    {
    int tyveLopp, tykikeseAlgus, tykikeseLopp;

    rida->TrimRight();
    (*rida) += FSxSTR(" ");

    if((tyveLopp=rida->Find((FSxSTR(" "))[0]))== -1)
        {
        printf(FSTSTR("Ei leia tüve lõppu\n"));
        assert( false );
        }
    tyvi = rida->Left(tyveLopp);
    tykikeseAlgus=tyveLopp+1;

    sonaLiigiString=(const FSxCHAR*)(rida->Mid(tykikeseAlgus, 1));
    if((*rida)[tykikeseAlgus+1] != (FSxSTR("="))[0])
        {
        printf(FSTSTR("Võrdusmärk puudu\n"));
        assert( false );        
        }
    if((tykikeseLopp=rida->Find((FSxSTR(" "))[0], tykikeseAlgus))== -1)
        {
        printf(FSTSTR("Jama\n"));
        assert( false );        
        }
    tyveInf=rida->Mid(tykikeseAlgus+2, tykikeseLopp-tykikeseAlgus-2);
    tykikeseAlgus=tykikeseLopp+1;
    tykikeseLopp=rida->Find((FSxSTR(" "))[0], tykikeseAlgus);
    
    while((*rida)[tykikeseAlgus] != 0)
        {
        sonaLiigiString +=(const FSxCHAR*)(rida->Mid(tykikeseAlgus, 1));
        if((*rida)[tykikeseAlgus+1] != (FSxSTR("="))[0])
            {
            printf(FSTSTR("Võrdusmärk puudu\n"));
            assert( false );        
            }
        if((tykikeseLopp=rida->Find((FSxSTR(" "))[0], tykikeseAlgus))== -1)
            {
            printf(FSTSTR("Jama\n"));
            assert( false );        
            }
        tyveInf += FSxSTR(" ");
        tyveInf += rida->Mid(tykikeseAlgus+2, tykikeseLopp-tykikeseAlgus-2);
        tykikeseAlgus=tykikeseLopp+1;
        tykikeseLopp=rida->Find((FSxSTR(" "))[0], tykikeseAlgus);
        }
    }
コード例 #21
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int da_lisa( void )
    {
    int r;

    r = lisa( da_tyvi, da_format, FSxSTR("da") );
    if ( !r )
	    return(0);
    if ( !FSxSTRCMP(da_format, FSxSTR("DA")) )            /* lk 54 */
	    r = lisa( da_tyvi, FSxSTR("DES"), FSxSTR("des") );
    else if ( !FSxSTRCMP(da_format, FSxSTR("TA")) )
	    r = lisa( da_tyvi, FSxSTR("TES"), FSxSTR("des") );
    else
	    r = lisa( da_tyvi, FSxSTR("ES"), FSxSTR("des") );
    if ( !r )
	    return(0);
    return(1);
    }
コード例 #22
0
ファイル: lihtlisa.cpp プロジェクト: Filosoft/vabamorf
int eemalda_mitmus( void )
    {
    int  i,r;
    FSXSTRING tmp1;

    for (i=0; i < 11; i++)   /* eemalda kõik gen-st tulenevad mitmuse vormid */
	    {
        tmp1 = (const FSxCHAR *)mitm_vorm;
        tmp1 += analog_v[i];
	    r = eemalda( (FSxCHAR *)(const FSxCHAR *)tmp1 );
	    if ( !r )
	        return( 0 );
	    }
    r = eemalda( FSxSTR("pl n") );     /* eemalda mitmuse nimetav */
    if ( !r )
	    return( 0 );
    r = eemalda( FSxSTR("pl g") );     /* eemalda mitmuse omastav */
    if ( !r )
	    return( 0 );
    r = eemalda( FSxSTR("pl p") );     /* eemalda mitmuse osastav */
    if ( !r )
	    return( 0 );
    return(1);
    }
コード例 #23
0
ファイル: arvapn2.cpp プロジェクト: tpetmanson/jsvabamorf
int MORF0::arvapn2(MRFTULEMUSED *tulemus, FSXSTRING *S6na, int S6naPikkus)
    {
    int i;
    int maha;
    FSXSTRING tyvi;
    FSXSTRING lopp;
    FSXSTRING sl;
    FSXSTRING vormid;
    const FSxC5I1 *lopu_info;

    i = S6na->ReverseFind(APOSTROOF);
    if (i == -1)
        return ALL_RIGHT;
    if (S6naPikkus - i > PN_ENDLEN)  // O'Connorist
        return ALL_RIGHT;
    if (i < S6naPikkus-1 && TaheHulgad::OnAeiu((*S6na)[i+1]))
        maha=1; // Paige'iks tyvi=Paige lopp=ks
    else
        maha=0;
    if (mrfFlags.Chk(MF_ALGV))
        tyvi = S6na->Left(i);
    else
        tyvi = S6na->Left(i+1);
    lopp = S6na->Mid(i+1+maha);
    if (TaheHulgad::SuurAlgustaht(S6na))
        sl = LIIK_PARISNIMI;
    else
        sl = LIIK_YLDNIMI;
//    if (lopp == FSxSTR("d"))        // d-loppu vt eraldi
//        vormid = FSxSTR("pl n, sg p, ");
    if (lopp.GetLength() == 0)   // 0-loppu vt eraldi
        {
        if (maha == 0 && sl == LIIK_YLDNIMI) // nt f****n', tolgend'
            return ALL_RIGHT;
        lopp = FSxSTR("0");
        tulemus->Add(tyvi, lopp, FSxSTR(""), sl, FSxSTR("sg g, "));
        if (maha)
            tulemus->Add(tyvi, lopp, FSxSTR(""), sl, FSxSTR("sg p, "));
        }
    else   // muud lopud
        {
        for (lopu_info = oletajaDct.pn_lopud_jm.Get((const FSxCHAR *)lopp); lopu_info; 
                                             lopu_info = oletajaDct.pn_lopud_jm.GetNext())
            {
            if (lopu_info->tyyp == 1) // sobib p�risnimele
                tulemus->Add(tyvi, lopp, FSxSTR(""), sl, lopu_info->vorm);
            }
        }
    return ALL_RIGHT;
    }
コード例 #24
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int mata_lisa( void )
    {
    int r;

    r = lisa( mata_tyvi, mata_format, FSxSTR("mata") );
    if ( !r )
	    return(0);
    r = lisa( mata_tyvi, FSxSTR("MAS"), FSxSTR("mas") );
    if ( !r )
	    return(0);
    r = lisa( mata_tyvi, FSxSTR("MAST"), FSxSTR("mast") );
    if ( !r )
	    return(0);
    r = lisa( mata_tyvi, FSxSTR("MAKS"), FSxSTR("maks") );
    if ( !r )
	    return(0);
    return(1);
    }
コード例 #25
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int sime_lisa( void )
    {
    int r;

    r = lisa( sime_tyvi, sime_format, FSxSTR("sime") );
    if ( !r )
	    return(0);
    if ( !FSxSTRCMP(sime_format, FSxSTR("IME")) )            /* lk 54 */
	    r = lisa( sime_tyvi, FSxSTR("ITE"), FSxSTR("site") );
    else
	    r = lisa( sime_tyvi, FSxSTR("SITE"), FSxSTR("site") );
    if ( !r )
	    return(0);
    return(1);
    }
コード例 #26
0
ファイル: kogupara.cpp プロジェクト: theranger/vabamorf
int sin_lisa( void )
    {
    int r;

    r = lisa( sin_tyvi, sin_format, FSxSTR("sin") );
    if ( !r )
	    return(0);
    if ( !FSxSTRCMP(sin_format, FSxSTR("IN")) )            /* lk 54 */
	    r = lisa( sin_tyvi, FSxSTR("ID"), FSxSTR("sid") );
    else
	    r = lisa( sin_tyvi, FSxSTR("SID"), FSxSTR("sid") );
    if ( !r )
	    return(0);
    return(1);
    }
コード例 #27
0
ファイル: mrf-gen.cpp プロジェクト: urdvr/estnltk
bool ETMRFAS::ArvaGene2(       // -1==siiber; 0==ok
    MRFTULEMUSED   *pValja,
    MRFTULEMUSED   *pMrfTul,
    const FSXSTRING  *pGeneLiik,
    const FSXSTRING  *pGeneVormid,
    const FSXSTRING  *pGeneKigi)
{
    //char algv_lopp;
    //int algv_vorm,
    int viimne;

    FSXSTRING gene_liik = KOIK_LIIGID;  // igaks juhuks
    FSXSTRING genetud_tyvi, gene_t1, gene_t2, ette, kigi;
    int i, sgn=0;
    FSxCHAR vi;

    if (pMrfTul->Get_vormid(FSxSTR("sg n,")) != -1)
        sgn = 1; // analyyside hulgas leidub sg n
    i = pMrfTul->Get_vormid(FSxSTR("ma,"));
    if (i != -1 && pMrfTul->Get_vormid(FSxSTR("tama,")) != i)
        sgn = 1; // analyyside hulgas leidub ma
    if (*pGeneLiik == FSxSTR("*"))
        gene_liik = KOIK_LIIGID;
    else
        gene_liik = (const FSxCHAR*)*pGeneLiik;
    // vt kõiki algvorme
    //
    kigi = FSxSTR("");
    viimne = pValja->idxLast;
    for (i=0; i < pMrfTul->idxLast; i++)
    {
        if ((*pMrfTul)[i]->vormid.Find(FSxSTR("?")) != -1 || (*pMrfTul)[i]->vormid.Find(FSxSTR(",")) == -1) // muutumatu s�na
        {
            if (gene_liik.Find((*pMrfTul)[i]->sl) == -1)
                continue;           // polnud sobiv sõnaliik
            if (sgn == 0 ||                         // analyyside hulgas polegi käänduvat sõna või ...
                    pGeneVormid->GetLength() == 0 ||    // tahetaksegi muutumatut sõna
                    pGeneVormid->Find(FSxSTR("sg n")) >=0 )  // küsitaksegi ainsuse nimetavat
            {   // et enne //_*_ // ja enne //_*_ sg n, // enne //_*_ sg g, // oleks kooskõlas
                genetud_tyvi = pMrfTul->rec[i]->tyvi;
                genetud_tyvi.Remove((FSxCHAR)'_');
                genetud_tyvi.Remove((FSxCHAR)'=');
                genetud_tyvi.Remove((FSxCHAR)'+');
                vi = genetud_tyvi[genetud_tyvi.GetLength()-1];
                if (pGeneKigi->GetLength()>0)
                {
                    if (!TaheHulgad::OnHelitu(vi))
                        kigi = FSxSTR("gi");
                    else
                        kigi = FSxSTR("ki");
                }
                pValja->Add(
                    (const FSxCHAR *)genetud_tyvi,
                    FSxSTR(""),  // 0-lõpu puhul 0 ei lisa
                    (const FSxCHAR *)kigi, //
                    (*pMrfTul)[i]->sl,
                    (*pMrfTul)[i]->vormid);

                continue;
            }
        }

        if ( (*pMrfTul)[i]->vormid.Find(FSxSTR("sg n,"))!= -1 )
        {
            sgn=1;        //* on leitud lihtsaim algvorm *
            //algv_lopp = null_lopp;
            //algv_vorm = sg_n;
        }
        else if ((*pMrfTul)[i]->vormid.Left(3) == FSxSTR("ma,"))
        {
            sgn=1;        //* on leitud lihtsaim algvorm *
            //algv_lopp = lopp_ma;
            //algv_vorm = ma;
        }
        else if ( omastavanr(&((*pMrfTul)[i]->tyvi)) != -1 )
        {
            sgn=1;        //* on leitud lihtsaim algvorm *
            //algv_lopp = null_lopp;
            //algv_vorm = sg_g;
        }
        else if (!sgn && (*pMrfTul)[i]->vormid.Find(FSxSTR("pl n,"))!= -1)  //* votan d lopust maha *
        {
            if ((*pMrfTul)[i]->tyvi.Right(2) == FSxSTR("nu") ||
                    (*pMrfTul)[i]->tyvi.Right(2) == FSxSTR("tu") ||
                    (*pMrfTul)[i]->tyvi.Right(2) == FSxSTR("du"))
            {   // nt vastsündinu+d
                (*pMrfTul)[i]->tyvi += FSxSTR("d");
                (*pMrfTul)[i]->lopp = FSxSTR("");
                (*pMrfTul)[i]->sl = LIIK_A;
                sgn=1;        // vastsündinud+0 on lihtsaim algvorm
            }
            else
            {
                //algv_lopp = lopp_d;
                //algv_vorm = pl_n;
            }
        }
        else
        {
            continue;               // seda rohkem ei vt, sest pole algvorm
        }
        if (gene_liik.Find((*pMrfTul)[i]->sl) == -1)
            continue;           // polnud sobiv sõnaliik
        gene_t1 = (*pMrfTul)[i]->tyvi;
        // siia tuleb oletamine ise
        FSXSTRING analoogvorm, v_analoogvorm;
        FSXSTRING tyhi;
        bool rs;

        for (analoogvorm=oletajaDct.sobiv_analoog(&gene_t1, &(*pMrfTul)[i]->sl);; analoogvorm=oletajaDct.jargmine_sobiv_analoog())
        {
            int mitu;
            int a_pikkus, g_pikkus, pikkus;
            int res;
            MRFTULEMUSED tulemus, analoog_tulemus;
            int tagasi;

            a_pikkus = analoogvorm.GetLength();
            if (a_pikkus == 0) // polnud rohkem sobivaid analooge
                break;
            g_pikkus = gene_t1.GetLength();
            pikkus = a_pikkus > g_pikkus ? g_pikkus : a_pikkus;
            // leia, kui pikk jupp on sõnadel lõpus ühesugune
            for (mitu = 1; mitu <= pikkus; mitu++)
            {
                if (analoogvorm[a_pikkus-mitu] != gene_t1[g_pikkus-mitu])
                    break;
            }
            mitu--;
            if ((*pMrfTul)[i]->sl == LIIK_VERB)
            {
                v_analoogvorm = analoogvorm;
                v_analoogvorm += FSxSTR("ma");
                res = chkwrd(&tulemus, &v_analoogvorm, a_pikkus+2, 1, &tagasi, ALGV_LIIK);
            }
            else
                res = chkwrd(&tulemus, &analoogvorm, a_pikkus, 1, &tagasi, ALGV_LIIK);
            assert(res <= ALL_RIGHT);
            if (res > ALL_RIGHT)
                return false; // viga; ei saa olla
            if (!tulemus.on_tulem())
            {
                assert(tulemus.on_tulem());
            }
            assert(tagasi==1);
            if (!tulemus.on_tulem())    // polnud norm. eesti k. sõna
                return false; // viga; ei saa olla

            rs = Gene2Detailne(&analoog_tulemus, &tulemus, &tyhi, pGeneLiik, pGeneVormid, pGeneKigi);
            if (rs == false)
                return false;
            analoog_tulemus.VotaTyvedeltEest(a_pikkus-mitu);
            analoog_tulemus.LisaTyvedeleEtte(gene_t1.Left(g_pikkus-mitu));
            pValja->Move2Tail(&analoog_tulemus);
        }
    }

    if (pValja->idxLast > viimne) // midagi leitigi
    {
        pValja->eKustTulemused = eMRF_SO; // tulemused tulid sünteesi-oletajast
    }
    pValja->SortUniq();
    return true;
}
コード例 #28
0
ファイル: mrf-gen.cpp プロジェクト: urdvr/estnltk
bool ETMRFAS::GeneSTV(
    MRFTULEMUSED   *pValja,
    const FSXSTRING *gPrf,        // käib tüve ette
    const FSXSTRING *gSuffiks,    // suffiks morf analüüsija väljundist
    //const FSXSTRING *gSufSl,      // suffiksi son liik morf anal väljundist
    const FSXSTRING *sl,          // sõnaliigid, millesse kuuluvaid sonu tahetakse
    const FSXSTRING *geneVormid,  // genetavate vormide loend
    const int algv_lopp,   // 0, -ma voi -d
    const int algv_vorm,   // sg_g[0], sg_n[0], ma voi pl_n[0]
    const FSXSTRING *pGeneKigi)
{
    FSUNUSED(sl);
    int sufNr;  // sufiksi nr sufiksite tabelis
    int i, j;
    FSXSTRING tmpSuf, tmpSuf1, tmpSuf2;
    FSXSTRING *sonaLiigid;
    FSxCHAR sl1;
    //FSXSTRING *sssl;
    int nSonaLiiki;
    FSXSTRING gTyviUus;
    //FSXSTRING gene_t2;
    FSXSTRING styvi;
    FSXSTRING skronksutyvi;
    int adhocnu = 0; // ad hoc nud, tud, dud jaoks

    if (gSuffiks->GetLength() >= SUFLEN)
        return true; //* ei saa olla sufiks *

    tmpSuf = (const FSxCHAR *)*gSuffiks;
    //* otsime välja sufiksi indeksi sufiksite tabelist *
    sufNr=suffnr((const FSxCHAR *)tmpSuf);
    if (sufNr == -1)
    {
        //* sellist sufiksit pole olemas, *
        //* see juhtub nt siis, kui suf loendis on pikem sufiks, *
        //* aga lingv ilu pa'rast na'idat. teda lu'hemana *
        //* nt =umuslik asemel =muslik *
        //* mingi kombineerimine *
        int mitu_maha = gPrf->GetLength();

        if (mitu_maha > 3)
            mitu_maha = 3;
        tmpSuf1 = gPrf->Right(mitu_maha);
        tmpSuf1 += (const FSxCHAR *)*gSuffiks;
        for (i=0; i < mitu_maha; i++)
        {
            tmpSuf = tmpSuf1.Mid(i);
            if ((sufNr=suffnr((const FSxCHAR *)tmpSuf)) > -1)
                break; //* suffiks käes *
        }
        if (i == mitu_maha) // tavaliselt seda ei saa olla, et ei leia sobivat suffiksit
        {
            if(*gSuffiks == FSxSTR("nud") || *gSuffiks == FSxSTR("tud") || *gSuffiks == FSxSTR("dud"))
            {   // ... aga vahel ikka saab: leksikonis on ainult S nu, tu ja du, mitte A nud, tud ja dud...
                tmpSuf = gSuffiks->Left(2);
                sufNr=suffnr((const FSxCHAR *)tmpSuf);
                adhocnu = 1;  // lipp püsti
            }
            else
                return true;
        }
        tmpSuf1 = tmpSuf.Mid((int)(sufix[sufNr].mitutht));
    }
    else
        tmpSuf1 = tmpSuf;

    sonaLiigid = sonaliik[(unsigned char) sufix[sufNr].ssl];
    nSonaLiiki = sonaLiigid->GetLength();

    for(i=0; i < nSonaLiiki; i++)  // vt sufiksi homonüüme (s.h. lik ja l<ik on homonüümid)
    {
        sl1 = (*sonaLiigid)[i];
        if ( sl->Find(sl1) == -1) // see sõnaliik pole siin lubatud
            if (adhocnu == 1); // ... aga teatud juhtudel ikkagi võiks
            else if (sl->Find((FSxCHAR)'A') != -1 &&      // tahetakse A, aga sufiks on leksikonis S
                     (tmpSuf1 == FSxSTR("tu") ||
                      tmpSuf1.Right(2) == FSxSTR("ke") ||
                      tmpSuf1.Right(4) == FSxSTR("kene"))); // ... aga teatud juhtudel ikkagi võiks
            else
                continue;
        // vaja kontrollida, kas on ikka vajaliku algvormi tüvi
        gTyviUus = tmpSuf1;
        if(OtsiTyvi(&(sufix[sufNr].suftyinf[i].idx),
                    algv_lopp, algv_vorm, &gTyviUus)==false)
            continue; //polnud sobiv tüvi
        if(gTyviUus != tmpSuf1) // pole õige algvormi tüvi
            continue;
        if(sl1==W_SL) // nagunii on ka S liigiline sõna leitud
            continue;
        if(sl1==(FSxCHAR)'B' && sl->Find((FSxCHAR)'A') >=0)
            sl1 = 'A'; // kah õige sõnaliik: tahad A-d saad B, aga ütleme, et said A

        MKT1c *rec1; // siia pannakse gTyvi (nt piksel) lgNr ja tyMuut
        MKTc  *rec;  // {lgNr, tyMuut} massiiv, mis on seotud ühe sõnaga; nt tyvedele piksel, piksli, piksle
        int muutumatu; // muutumatu tüveosa (nt piks)

        tmpSuf2 = tmpSuf1;
        if((rec1=tyveMuutused.Get(sufix[sufNr].suftyinf[i].idx.tab_idx,sufix[sufNr].suftyinf[i].idx.blk_idx))==NULL)
        {
            return false;
        }
        // leia muutumatu tüveosa
        if((muutumatu=tmpSuf1.GetLength()-rec1->tyMuut.GetLength()) < 0)
        {
            return false;
        }
        if((rec=tyveMuutused[sufix[sufNr].suftyinf[i].idx.tab_idx])==NULL)
        {
            return false;
        }
        int tmpsufnr, jj, jjnSonaLiiki;
        FSXSTRING vormityvi;
        FSXSTRING tyvi, utyvi;
        for (j=0; j < rec->n; j++) // vt selle sufiksi paradigma kõiki "tüvesid"
        {

            utyvi = gPrf->Right(sufix[sufNr].mitutht); // tavaliselt "", aga umuslik puhul u
            tyvi = tmpSuf1.Left(muutumatu) + rec->mkt1c[j].tyMuut;
            utyvi += tyvi;
            tmpsufnr=suffnr((const FSxCHAR *)utyvi);
            FSXSTRING *jjsonaLiigid = sonaliik[(unsigned char) sufix[tmpsufnr].ssl];
            jjnSonaLiiki = jjsonaLiigid->GetLength();
            for (jj=0; jj < jjnSonaLiiki; jj++) // vt "tüve" kõiki homonüüme
            {
                if ((*sonaliik[(unsigned char) sufix[tmpsufnr].ssl])[jj] != sl1)
                    continue; // pole sama sõnaliik ...
                //if (sufix[sufNr].suftyinf[i].idx.tab_idx != sufix[tmpsufnr].suftyinf[jj].idx.tab_idx)
                //continue; // pole sama paradigma
                // kole asi üksikute juhtumite filtreerimiseks, nt l<ik ja lik eristamiseks
                // tundl<ik+0 vs tundlik+el
                MKT1c *rec2 = tyveMuutused.Get(sufix[tmpsufnr].suftyinf[jj].idx.tab_idx,sufix[tmpsufnr].suftyinf[jj].idx.blk_idx);
                if (rec->mkt1c[j].lgNr != rec2->lgNr)
                    continue; // homonüümne tüvi (kui hääldust ei arvesta) ja samas paradigmas, aga tegelt sobimatu
                LisaKdptr(sufix[tmpsufnr].suftyinf, &vormityvi, &tyvi, jj);
                if (adhocnu == 1) // nu -> nud
                {
                    int sgn_koht;
                    if ((sgn_koht=geneVormid->Find(FSxSTR("sg n"))) != -1)
                    {
                        FSXSTRING uustyvi = *gPrf;
                        uustyvi += tyvi;
                        uustyvi += FSxSTR("d");
                        pValja->Add(
                            (const FSxCHAR *) uustyvi,
                            FSxSTR(""),
                            (const FSxCHAR *)*pGeneKigi,
                            FSxSTR("A"),
                            FSxSTR("sg n, "));
                        FSXSTRING uusgeneVormid = geneVormid->Mid(0, sgn_koht);
                        uusgeneVormid += geneVormid->Mid(sgn_koht+5);
                        if (GeneL(pValja, gPrf, &vormityvi, (const FSxCHAR) 'A', rec->mkt1c[j].lgNr,
                                  &uusgeneVormid, pGeneKigi)==false)
                        {
                            return false;
                        }
                    }
                    else
                    {
                        if (GeneL(pValja, gPrf, &vormityvi, (const FSxCHAR) 'A', rec->mkt1c[j].lgNr,
                                  geneVormid, pGeneKigi)==false)
                        {
                            return false;
                        }
                    }
                }
                else

                {
                    if(GeneL(pValja, gPrf, &vormityvi, (const FSxCHAR) sl1, rec->mkt1c[j].lgNr,
                             geneVormid, pGeneKigi)==false)
                    {
                        return false;
                    }
                }
            }
        }
    }
    return true;
}
コード例 #29
0
ファイル: mrf-gen.cpp プロジェクト: urdvr/estnltk
bool ETMRFAS::GeneL1(
    MRFTULEMUSED   *pValja,
    const FSXSTRING *gPrf,       // käib tüve ette
    const FSXSTRING *gTyvi,      // tüvi morf analüüsijast
    const FSxCHAR   sl,
    const int  lgNr,
    const FSXSTRING *geneVorm, // genetav vorm
    const FSXSTRING  *pGeneKigi)
{
    int i,j,l6ppudeAlgusNihe,l6ppudeArv,vormideAlgusNihe,ffnr;
    int l6pujrknr;
    FSxCHAR tmp[2]=FSxSTR("\0");
    FSXSTRING l6pp, tyvi, liik, kigi;
    FSxCHAR vi;
    tmp[0]=sl;
    liik=tmp;
    kigi = FSxSTR("");

    // sõnastiku kettalt sisselugemisel tuleks kohe need2 baiti
    // intiks teisenda ja seda kasutadagi lõputu bitinikerdamise asemel
    l6ppudeAlgusNihe= (((groups[lgNr].gr_algus)&0xFF)<<8)|
                      (groups[lgNr].gr_lopp&0xFF);
    l6ppudeArv=(unsigned char)(groups[lgNr].cnt);
    vormideAlgusNihe = homo_form * l6ppudeAlgusNihe;
    ffnr = vormnr((const FSxCHAR *)*geneVorm);
    assert( l6ppudeAlgusNihe >=0 && l6ppudeArv >=0  && vormideAlgusNihe >=0 );

    if(ffnr <= 0)
        return false; // sellist vormi pole üldse olemaski
    for(i=0; i < l6ppudeArv; i++)
    {
        for(j=0; j < (int)homo_form; j++)
        {
            if( ffnr==(unsigned char)(fgr[vormideAlgusNihe+(i*homo_form) + j]) )
            {
                // otsitav vorm leitud
                l6pujrknr=(unsigned char)(gr[l6ppudeAlgusNihe + i]);
                l6pp=l6ppudeLoend[l6pujrknr];
                //if(adHocString.GetLength() > 0 && ffnr==vormideLoend[FSxSTR("sg n"])) //Kuidas see sai kompileeruda?!
                if(adHocString.GetLength() > 0 && ffnr==vormnr(FSxSTR("sg n")))
                {
                    l6pp += adHocString;
                }
                tyvi= *gPrf + *gTyvi;
                FSXSTRING geneVorm1 = *geneVorm;
                geneVorm1 += FSxSTR(", ");

                if (l6pp.GetLength() > 0)
                    vi = l6pp[l6pp.GetLength()-1];
                else
                    vi = tyvi[tyvi.GetLength()-1];
                if (pGeneKigi->GetLength()>0)
                {
                    if (!TaheHulgad::OnHelitu(vi))
                        kigi = FSxSTR("gi");
                    else
                        kigi = FSxSTR("ki");
                }
                pValja->Add(
                    (const FSxCHAR *)tyvi,
                    (const FSxCHAR *)l6pp,
                    (const FSxCHAR *)kigi,
                    (const FSxCHAR *)liik,
                    (const FSxCHAR *)geneVorm1);
            }
        }
    }
    return true;
}
コード例 #30
0
ファイル: mrf-gen.cpp プロジェクト: urdvr/estnltk
//bool ETMRFAS::GeneTLDetailne(
bool ETMRFAS::GeneTLDetailne(
    MRFTULEMUSED  *pValja,
    const TYVE_INF *naidise_dptr,
    const int mitu_naidise_homon,
    const FSXSTRING *gPrf,       // käib tüve ette
    const FSXSTRING *gTyvi,      // algvormi tüvi morf analüüsijast (nt piksel))
    const FSxCHAR   sl,		   // sõnaliik, millesse kuuluvaid sõnu tahetakse
    TYVE_INF    *tyveinf,      // kõik gTyviga seotud info, mis sõnastikust on leitud
    const FSXSTRING *geneVormid, // genetavate vormide loend
    const FSXSTRING  *pGeneKigi)
{
    MKT1c *rec1; // siia pannakse gTyvi (nt piksel) lgNr ja tyMuut
    MKTc  *rec;  // {lgNr, tyMuut} massiiv, mis on seotud ühe sõnaga; nt tyvedele piksel, piksli, piksle
    int muutumatu; // muutumatu tüveosa (nt piks)
    int i, j;
    FSXSTRING vormityvi;

    if((rec1=tyveMuutused.Get(tyveinf->idx.tab_idx,tyveinf->idx.blk_idx))==NULL)
    {
        return false;
    }
    // leia muutumatu tüveosa
    if((muutumatu=gTyvi->GetLength()-rec1->tyMuut.GetLength()) < 0)
    {
        return false;
    }
    if((rec=tyveMuutused[tyveinf->idx.tab_idx])==NULL)
    {
        return false;
    }
    for(i=0; i < rec->n; i++) // vt selle sõna kõiki tüvesid
    {
        FSXSTRING tyvi= gTyvi->Left(muutumatu) + rec->mkt1c[i].tyMuut;
        FSXSTRING tyvi_leksikonis=tyvi;
        int slTabIdx;
        int sliike;
        if (tyvi_leksikonis.Find(FSxSTR(" "))!=-1)
            tyvi_leksikonis.Replace(FSxSTR(" "), FSxSTR("="), 1);
        if (cXXfirst(&tyvi_leksikonis, &slTabIdx)!=ALL_RIGHT)
        {
            return NULL;
        }
        sliike = sonaliik[slTabIdx]->GetLength();
        // peab tsükeldama ja sõnaliike ja tab_idx kontrollima,
        // sest sõnastik on niimoodi tehtud:
        // homonüümsed tüved (s.h. mittevajalikud) on kuidagi üheskoos...
        for (j=0; j < sliike; j++)
        {
            int jj;
            for (jj=0; jj < mitu_naidise_homon; jj++)
            {   // kas samas paradigmas on ka näidise tüvi ?
                if (dptr[j].idx.tab_idx == naidise_dptr[jj].idx.tab_idx)
                    break;
            }
            if (mitu_naidise_homon > 0 && jj == mitu_naidise_homon)
                continue; // ei vasta nõutud paradigmale; nt. tahetakse palgi, aga see on palga
            if ((*sonaliik[slTabIdx])[j] == sl || // on sama sõnaliik ...
                    ((*sonaliik[slTabIdx])[j] == (FSxCHAR)'B' && sl == (FSxCHAR)'A')) // või sobiv sõnalik
            {
                if (dptr[j].idx.tab_idx == tyveinf->idx.tab_idx)
                {   // ... ja sama paradigma tüvi
                    LisaKdptr(dptr, &vormityvi, &tyvi, j);
                    if(GeneL(pValja, gPrf, &vormityvi, sl, dptr[j].lg_nr, geneVormid, pGeneKigi)==false)
                    {
                        return false;
                    }
                }
            }
        }
        //-----
    }
    return true;
}