示例#1
0
文件: Names.cpp 项目: eamosov/lspl
// Правила для БОЛЕЕ или МЕНЕЕ + прил или кр.прил
bool CRusFormatCaller::format_for_anat_compar(CGroup& G)
{
	//более  извращенная  любительница
	size_t i = G.m_iFirstWord;
	const CGroup& MaxGrp = get_maximal_group(i);
	if (MaxGrp.m_iFirstWord != MaxGrp.m_iLastWord) return false;

    if (   !Wi.is_word_upper("БОЛЕЕ") 
		&& !Wi.is_word_upper("МЕНЕЕ") 
	   ) return false;
	size_t j = i + 1;
	if (j >= sent.size()) return false;
	if (get_maximal_group_size(j) != 1) return false;
	if (is_morph_adj(Wj) || is_morph_participle (Wj))
	{
		G.m_GroupType = ANAT_COMPAR;
		G.m_iLastWord = j;
		G.m_MainGroup.m_iFirstWord = j;
		G.m_MainGroup.m_iLastWord = j;
		G.SetGrammems( Wj.GetGrammems() );
		create_syn_rel(G, j, i, ANAT_COMPAR);
		return true;		
	}

	return false;		
};
示例#2
0
文件: Gleiche.cpp 项目: deNULL/seman
bool CRusFormatCaller::format_for_modif_adj_groups (CGroup& G)
{
    if (get_maximal_group_no(G.m_iFirstWord) != -1) return  false;    
    int j =  G.m_iFirstWord;

    if( FindInList((const char*)g_strAdjModif, g_AdjModifCount, Wj.get_lemma()) == -1)
        return false;


    if( j+1 >= sent.size() )
        return false;
    const CGroup& H = get_maximal_group(j+1);
    if( !is_morph_adj(sent[H.m_MainWordNo]) )
            return false;

    if( !GetGramTab()->GleicheGenderNumberCase(sent[H.m_MainWordNo].m_type_gram_code, sent[H.m_MainWordNo].m_gramcodes, Wj.m_gramcodes ) )
        return false;

    G.m_iLastWord = H.m_iLastWord;
    G.m_GroupType = MODIF_ADJ;
    G.SetGrammems (H.GetGrammems() & sent[j].GetGrammems());
    G.m_MainGroup =  H;
    change_words_in_group_grammems(G, G.GetGrammems(), (rAllNumbers | rAllCases));  
    create_syn_rel(G, H.m_MainWordNo, j , MODIF_ADJ);
    return true;
}
示例#3
0
bool CGerGramTab::is_left_noun_modifier (size_t poses, QWORD grammems) const
{
	if (poses & (1 <<gZAL )) return true;
	if (!(grammems & gAllCases)) return false;
	if (!(grammems & gAllNumbers)) return false;
	return			is_morph_adj(poses) 
				||	is_morph_pronoun_adjective(poses)
				||	( poses & (1 <<gPA1 )) != 0	
				||	( poses & (1 <<gPA2 )) != 0;
}
示例#4
0
文件: Names.cpp 项目: eamosov/lspl
// Правила для обособ. прил. в постпозиции\\Этим вопросом, давно и надолго забытым, \\.
bool CRusFormatCaller::format_for_noun_detached_adj_postposition(CGroup& G)
{
	size_t i, j;
	i = G.m_iFirstWord;
	const CGroup& MaxGrp = get_maximal_group(i);
	if (MaxGrp.m_iFirstWord != MaxGrp.m_iLastWord)
		i = MaxGrp.m_MainWordNo;
	else
		i = MaxGrp.m_iFirstWord;
	if ( !Wi.is_morph_noun() && !is_morph_pronoun(Wi)) return false;
	j = MaxGrp.m_iLastWord + 1;
	if (j == sent.size()) return false;
	if (!Wj.HasFlag(fl_comma)) return false;
	j++;
	if (j == sent.size()) return false;
	const CGroup& MaxGrpAdj = get_maximal_group(j);
	if (MaxGrpAdj.m_iFirstWord != MaxGrpAdj.m_iLastWord)
		j = MaxGrpAdj.m_MainWordNo;
	else
		j = MaxGrpAdj.m_iFirstWord;
	if (!is_morph_adj(Wj)) return false;
	if (    !(MaxGrpAdj.m_iLastWord == sent.size()-1) 
		&&  !sent[MaxGrpAdj.m_iLastWord+1].HasFlag(fl_comma)
	   )
		return false;
	bool bGr = false;
	if (  GetGramTab()->GleicheGenderNumberCase(Wi.m_type_gram_code, Wi.GetGramcodes(),Wj.GetGramcodes()) )
		bGr = true;

	if ((Wi.GetGrammems() & (1 <<rPlural)) && (Wj.GetGrammems() & (1 <<rSingular)))
		if ( GetGramTab()->GleicheCase(Wi.GetGramcodes(), Wj.GetGramcodes()))
			bGr = true;

	if ((Wi.GetGrammems() & (1 <<rSingular)) && (Wj.GetGrammems() & (1 <<rPlural)))
		if (GetGramTab()->GleicheCase(Wi.GetGramcodes(), Wj.GetGramcodes()))
			bGr = true;

	if (bGr == true)
	{
		G.m_GroupType = NOUN_DETACHED_ADJ;
		G.m_iFirstWord = MaxGrp.m_iFirstWord;
		G.m_iLastWord = MaxGrpAdj.m_iLastWord;
		G.m_MainGroup = MaxGrp;
		G.SetGrammems( Wi.GetGrammems() );
		create_syn_rel(G, i, j, NOUN_DETACHED_ADJ);
		return true;
	}
		
	return false;
};
示例#5
0
文件: Names.cpp 项目: eamosov/lspl
// Правила для "черная и белая ракетки; черные шкаф и стул"
bool CRusFormatCaller::format_for_plural_noun_adj(CGroup& G)
{
	const CGroup& AdjMaxGrp = get_maximal_group(G.m_iFirstWord);
	size_t adj_main_word = get_main_word_in_group(AdjMaxGrp);
	const CSynPlmLine& Adj = sent[adj_main_word];

	
	size_t noun_main_word = get_next_main_word(adj_main_word);
	if (noun_main_word == sent.size()) return false;
	const CSynPlmLine& Noun = sent[noun_main_word];
	const CGroup& NounMaxGrp = get_maximal_group(noun_main_word);

	if (!Adj.GetGramcodes() || !Noun.GetGramcodes()) return false; 

	bool bCase1 = 
		(		(AdjMaxGrp.m_GroupType == SIMILAR_ADJS)
			&&	(Noun.GetGrammems() & _QM(rPlural)) 
			&&  Noun.is_morph_noun( ) 
			&&  (NounMaxGrp.size() == 1)
			&&	GetGramTab()->GleicheCase(Adj.GetGramcodes(), Noun.GetGramcodes())
		);

	bool bCase2 = 
		(
				(NounMaxGrp.m_GroupType == SIMILAR_NOUN_GROUPS)
			&&	Noun.is_morph_noun( ) 
			&&	(Adj.GetGrammems() & _QM(rPlural)) 
			&&	(Noun.GetGrammems() & _QM(rSingular))
			&&	AdjMaxGrp.size() == 1
			&&	is_morph_adj(Adj)
			&&	GetGramTab()->GleicheCase(Adj.GetGramcodes(),Noun.GetGramcodes())
		);
		
	if (bCase1 || bCase2)
	{
		G.m_GroupType = NOUN_ADJ;
		G.m_iFirstWord = AdjMaxGrp.m_iFirstWord;
		G.m_iLastWord = NounMaxGrp.m_iLastWord;
		G.m_MainGroup = NounMaxGrp;
		G.SetGrammems( NounMaxGrp.GetGrammems() );
		create_syn_rel(G, noun_main_word, adj_main_word, NOUN_ADJ);
		return true;
	}
	
	return false;		
};
示例#6
0
文件: Names.cpp 项目: eamosov/lspl
// Правила для \\Человек этот, неожиданно увидев нечто впечатляющее, отпрянул, но ничего страшного не произошло\\.
bool CRusFormatCaller::format_for_noun_adj_postposition(CGroup& G)
{
	int i = get_main_word (G.m_iFirstWord);
	if (!Wi.is_morph_noun()) return false;
	if (Wi.m_UnitType != EWord) return false;

	int j = get_next_main_word(i);
	if (j == sent.size()) return false;
	if (!is_morph_adj(Wj)) return false;
	if (Wj.m_UnitType != EWord) return false;
	
	if (! GetGramTab()->GleicheGenderNumberCase(Wi.m_type_gram_code, Wi.GetGramcodes(), Wj.GetGramcodes()) ) return false;

	G.m_GroupType = NOUN_ADJ_POSTPOSITION;
	G.m_iLastWord = get_maximal_group(j).m_iLastWord;
	G.m_MainGroup  = get_maximal_group(i);
	G.SetGrammems( Wi.GetGrammems() );
	create_syn_rel(G, i, j, NOUN_ADJ_POSTPOSITION);
	return true;		
};
示例#7
0
文件: Names.cpp 项目: eamosov/lspl
bool CRusFormatCaller :: format_for_adj_in_commas_preposition(CGroup& G)
{
	int i = get_main_word (G.m_iFirstWord);
	if (i != G.m_iFirstWord) return false;
	if (!is_morph_pronoun(Wi)) return false;
	if (i < 2) return false; 
	if (!sent[i-1].HasFlag(fl_comma) ) return false;
	size_t j = i-2;
	const CGroup& MaxGrp = get_maximal_group(j);	

	if (MaxGrp.m_iLastWord == j && MaxGrp.m_iFirstWord == j)
		j = j;
	else
		j = MaxGrp.m_MainWordNo;

	if (!is_morph_adj(Wj)) return false;

	bool vB = false;
	if (MaxGrp.m_iLastWord == 0)
		vB = true;
	else
	 if (MaxGrp.m_iFirstWord >0 && sent[MaxGrp.m_iFirstWord-1].HasFlag(fl_comma)) 
		 vB = true;
	
	if ( GetGramTab()->GleicheGenderNumberCase(Wi.m_type_gram_code, Wi.GetGramcodes(), Wj.GetGramcodes()) )
	{
		G.m_GroupType = NOUN_ADJ;
		G.m_iLastWord = i;
		G.m_iFirstWord = MaxGrp.m_iFirstWord;
		G.m_MainGroup.m_iFirstWord =  i;
		G.m_MainGroup.m_iLastWord =  i;
		G.SetGrammems( Wi.GetGrammems() );
		return true;
	}
	return false;
};