public TokenTagsEnumerator(bool IsBoundaryToken, SolarixGrammarEngineNET.SyntaxTreeNode _token, SolarixGrammarEngineNET.GrammarEngine2 gren)
{
token = _token;
list = new List <TokenRecognizer>();
int id_entry = token.GetEntryID();
int id_class = gren.GetEntryClass(id_entry);
// Подготовим список измерений и атрибутов.
List <SolarixGrammarEngineNET.CoordPair> dims = new List <SolarixGrammarEngineNET.CoordPair>();
List <SolarixGrammarEngineNET.CoordPair> attrs = new List <SolarixGrammarEngineNET.CoordPair>();
List <SolarixGrammarEngineNET.CoordPair> pairs = token.GetPairs();
foreach (SolarixGrammarEngineNET.CoordPair p in pairs)
{
int t = gren.GetCoordType(id_class, p.CoordID);
if (t == 0 || t == 2)
{
attrs.Add(p);
}
else if (t == 1)
{
dims.Add(p);
}
}
// ------------------------------------------------------
// Часть речи - самый общий случай
// ------------------------------------------------------
TokenRecognizer tr4 = new TokenRecognizer(id_class, -1);
list.Add(tr4);
List <TokenRecognizer> more_abstract = new List <TokenRecognizer>();
more_abstract.Add(tr4);
// ------------------------------------------------------
// Часть речи и комбинации атрибутов
// ------------------------------------------------------
if (attrs.Count > 0)
{
List <TokenRecognizer> created_recognizers = new List <TokenRecognizer>();
bool[] dim_bit = new bool[attrs.Count];
for (int i = 0; i < attrs.Count; ++i)
{
dim_bit[i] = false;
}
while (true)
{
List <SolarixGrammarEngineNET.CoordPair> selected_pairs = new List <SolarixGrammarEngineNET.CoordPair>();
for (int i = 0; i < attrs.Count; ++i)
{
if (dim_bit[i])
{
selected_pairs.Add(attrs[i]);
}
}
if (selected_pairs.Count > 0)
{
TokenRecognizer tr3 = new TokenRecognizer(id_class, -1, selected_pairs);
tr3.SetMoreAbstract(more_abstract);
list.Add(tr3);
created_recognizers.Add(tr3);
}
// Следующая комбинация
int carry = 1;
for (int ibit = dim_bit.Length - 1; ibit >= 0; --ibit)
{
if (dim_bit[ibit] == false)
{
dim_bit[ibit] = true;
carry = 0;
break;
}
else
{
dim_bit[ibit] = false;
}
}
if (carry == 1)
{
break;
}
}
more_abstract = created_recognizers;
}
// Лемма - только id словарной статьи. Это боее частный случай, чем указание части речи.
TokenRecognizer tr2 = new TokenRecognizer(-1, id_entry);
tr2.SetMoreAbstract(more_abstract);
list.Add(tr2);
more_abstract = new List <TokenRecognizer>();
more_abstract.Add(tr2);
if (dims.Count > 0)
{
List <TokenRecognizer> created_recognizers = new List <TokenRecognizer>();
// -----------------------------------------------------------------------
// Лемма (то есть id словарной статьи) и различные комбинации измерений.
// -----------------------------------------------------------------------
bool[] dim_bit = new bool[dims.Count];
for (int i = 0; i < dims.Count; ++i)
{
dim_bit[i] = false;
}
while (true)
{
List <SolarixGrammarEngineNET.CoordPair> selected_pairs = new List <SolarixGrammarEngineNET.CoordPair>();
for (int i = 0; i < dims.Count; ++i)
{
if (dim_bit[i])
{
selected_pairs.Add(dims[i]);
}
}
if (selected_pairs.Count > 0)
{
TokenRecognizer tr5 = new TokenRecognizer(-1, id_entry, selected_pairs);
tr5.SetMoreAbstract(more_abstract);
created_recognizers.Add(tr5);
list.Add(tr5);
}
// Следующая комбинация
int carry = 1;
for (int ibit = dim_bit.Length - 1; ibit >= 0; --ibit)
{
if (dim_bit[ibit] == false)
{
dim_bit[ibit] = true;
carry = 0;
break;
}
else
{
dim_bit[ibit] = false;
}
}
if (carry == 1)
{
break;
}
}
more_abstract = created_recognizers;
}
// ----------------------------------
// Лексема - самый частный случай.
// ----------------------------------
/*
* if( !IsBoundaryToken )
* {
* TokenRecognizer tr0 = new TokenRecognizer( token.GetWord() );
* tr0.SetMoreAbstract( more_abstract );
* list.Add( tr0 );
* }
*/
return;
}