Exemple #1
0
void DCTRD::open_d2(void)
	{
	register int i;

	readeel();

	readends();    // teeb loppude mass.
	readgrs();     // teeb lgr mass. 
	readfms();     // teeb vormide mass. 
	readfgrs();    // teeb lgr mass. 
	readsuf();     // teeb suf mass. 
	readprf();     // teeb pref mass. 
    // teeb loend[i] mass.
	for (i=0; i < LOENDEID-1; i++) // tegelik loendite arv <= LOENDEID-1
	    {
	    readloe(i);
	    }
	sg_g = vormnr(FSxSTR("sg g"));
	sg_n = vormnr(FSxSTR("sg n"));
	sg_p = vormnr(FSxSTR("sg p"));
	adt  = vormnr(FSxSTR("adt"));
	pl_n = vormnr(FSxSTR("pl n"));
	pl_g = vormnr(FSxSTR("pl g"));
	pl_p = vormnr(FSxSTR("pl p"));
	da   = vormnr(FSxSTR("da"));
	ma   = vormnr(FSxSTR("ma"));
    suva_vrm = SUVA_VRM;
	if(sg_g == -1||sg_n == -1 ||ma == -1) // valikuline test
        {
        throw(VEAD(ERR_MORFI_PS6N,ERR_ROTTEN,__FILE__,__LINE__, "$Revision: 521 $"));
		}
    lopp_a = lpnr(FSxSTR("a"));
    lopp_d = lpnr(FSxSTR("d"));
    lopp_da = lpnr(FSxSTR("da"));
    lopp_dama = lpnr(FSxSTR("dama"));
    lopp_dav = lpnr(FSxSTR("dav"));
    lopp_des = lpnr(FSxSTR("des"));
    lopp_dud = lpnr(FSxSTR("dud"));
    lopp_es = lpnr(FSxSTR("es"));
    lopp_ma = lpnr(FSxSTR("ma"));
    lopp_mata = lpnr(FSxSTR("mata"));
    lopp_nud = lpnr(FSxSTR("nud"));
    lopp_t = lpnr(FSxSTR("t"));
    lopp_ta = lpnr(FSxSTR("ta"));
    lopp_tama = lpnr(FSxSTR("tama"));
    lopp_tav = lpnr(FSxSTR("tav"));
    lopp_te = lpnr(FSxSTR("te"));
    lopp_tes = lpnr(FSxSTR("tes"));
    lopp_tud = lpnr(FSxSTR("tud"));
    lopp_v = lpnr(FSxSTR("v"));
    lopp_0 = null_lopp;
    suva_lp = SUVA_LP;
	if((signed char)lopp_d == (signed char)-1 || 
	   (signed char)lopp_ma == (signed char)-1)   // valikuline test
		{
        throw(VEAD(ERR_MORFI_PS6N,ERR_ROTTEN,__FILE__,__LINE__, "$Revision: 521 $"));
		}
	}
Exemple #2
0
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;
}
Exemple #3
0
bool ETMRFAS::Gene2Detailne(       // -1==siiber; 0==ok
    MRFTULEMUSED   *pValja,
    MRFTULEMUSED   *pMrfTul,
    const FSXSTRING  *pnaidis,
    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, k1, k2;
    bool r;
    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("");
    for (i=0; i < pMrfTul->idxLast; i++)
    {
        if (gene_liik.Find((*pMrfTul)[i]->sl) == -1)
            continue;           // polnud sobiv sõnaliik
        if ((*pMrfTul)[i]->vormid.Find(FSxSTR("?")) != -1 || (*pMrfTul)[i]->vormid.Find(FSxSTR(",")) == -1) // muutumatu s�na
        {
            if (sgn == 0 ||                         // analüüside 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 //_*_ // et //_*_ // 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)
        {
            algv_lopp = lopp_d;
            algv_vorm = pl_n;
            // HJK 2008: igaks juhuks (kui eelnenud analüüsil on tehtud tyve asemel lemma)
            if ( (*pMrfTul)[i]->tyvi.Right(1) == FSxSTR("d") ) // nt Madalmaad; votad lopust maha
                (*pMrfTul)[i]->tyvi = (*pMrfTul)[i]->tyvi.Left((*pMrfTul)[i]->tyvi.GetLength()-1);
        }
        else if (!sgn &&
                 // null-lopp !!!
                 (*pMrfTul)[i]->sl == LIIK_VERB &&
                 ((*pMrfTul)[i]->tyvi == FSxSTR("ei") ||
                  (*pMrfTul)[i]->tyvi == FSxSTR("\x00E4ra")))  // ei, ära puhuks
        {
            algv_lopp = null_lopp;
            FSXSTRING tmpstr;
            tmpstr = (*pMrfTul)[i]->vormid;
            if (TaheHulgad::OnLopus(&tmpstr, FSxSTR(", ")))
                tmpstr = tmpstr.Left(tmpstr.GetLength()-2);
            algv_vorm = vormnr((const FSxCHAR *)tmpstr);
        }
        else
        {
            continue;               // seda rohkem ei vt, sest pole algvorm
        }
        gene_t1 = (*pMrfTul)[i]->tyvi;
        // algul geneme terveid sõnu (lootes, et ka liitsõnad on sõnastikus sees)
        gene_t2 = gene_t1;
        gene_t2.Remove((FSxCHAR)'_');
        gene_t2.Remove((FSxCHAR)'+');
        gene_t2.Remove((FSxCHAR)'=');
        ette = FSxSTR("");
        viimne = pValja->idxLast;
        r = GeneMTVDetailne(pValja, &ette, &gene_t2, pnaidis, &gene_liik, pGeneVormid, algv_lopp, algv_vorm, pGeneKigi );
        if (r == false)
            return false;
        if (pValja->idxLast > viimne) // midagi leitigi
        {
            pValja->eKustTulemused = eMRF_SP; // tulemused põhisõnastikust
            continue;
        }
        k1 = gene_t1.ReverseFind((FSxCHAR)'_')+1;
        k2 = gene_t1.ReverseFind((FSxCHAR)'=')+1;
        if (k1==k2)  // pole ei _ ega =, seega oli lihtsõna
            continue;
        if (k2 < k1) // viimane komponent oli osasõna
        {
            if (mrfFlags->Chk(MF_EITULETALIIT)) // tuleb arvestada tervet sõna, koos _
                continue;      // ... aga see ei õnnestunud
        }
//------
        else // viimane komponent oli järelliide
        {
            gene_t2 = gene_t1.Mid(k2);
            ette = gene_t1.Mid(0, k2);
            ette.Remove((FSxCHAR)'_');
            ette.Remove((FSxCHAR)'=');
            ette.Remove((FSxCHAR)'+');
            r = GeneSTV(pValja, &ette, &gene_t2, /*&((*pMrfTul)[i]->sl),*/ &gene_liik, pGeneVormid, algv_lopp, algv_vorm, pGeneKigi );
            if (r == false)
                return false;
            if (pValja->idxLast > viimne) // midagi leitigi
                continue;
        }
        // viimane komponent oli osasõna
        for (k1=gene_t1.Find((FSxCHAR)'_'); k1!=-1; k1=gene_t1.Find((FSxCHAR)'_', k1+1)) // võta järjest eestpoolt osi ära, kuni midagi järel pole
        {
            k1 += 1;
            gene_t2 = gene_t1.Mid(k1);
            ette = gene_t1.Mid(0, k1);
            ette.Remove((FSxCHAR)'_');
            ette.Remove((FSxCHAR)'=');
            ette.Remove((FSxCHAR)'+');
            gene_t2.Remove((FSxCHAR)'_');
            gene_t2.Remove((FSxCHAR)'=');
            gene_t2.Remove((FSxCHAR)'+');
            r = GeneMTVDetailne(pValja, &ette, &gene_t2, pnaidis, &gene_liik, pGeneVormid, algv_lopp, algv_vorm, pGeneKigi );
            if (r == false)
                return false;
            if (pValja->idxLast > viimne) // midagi leitigi
            {
                pValja->eKustTulemused = eMRF_SP; // tulemused põhisõnastikust
                break;
            }
        }
    }
    pValja->SortUniq();
    return true;
}