public ContextRecognizer(List <TokenRecognizer> _points, OmonymTokenRecognizer _omonym_point, SolarixGrammarEngineNET.GrammarEngine2 gren)
 {
     id               = seq_counter++;
     omonym_point     = _omonym_point;
     points           = _points;
     success_count    = 0;
     fail_count       = 0;
     success_samples  = new HashSet <MatchedContextInfo>();
     fail_samples     = new HashSet <MatchedContextInfo>();
     rule_context_str = PrintContext(gren);
 }
    public OmonymContextEnumerator(SolarixGrammarEngineNET.AnalysisResults tokens, int _omonym_position, int _left_i, int _len, SolarixGrammarEngineNET.GrammarEngine2 _gren)
    {
        gren            = _gren;
        left_i          = _left_i;
        len             = _len;
        omonym_position = _omonym_position;

        recognizers = new List <ContextRecognizer>();

        // Для каждого токена, кроме омонимичной формы, генерируем список вариантов.

        // ... пока только код для контекстов длины=2
        if (len == 2)
        {
            SolarixGrammarEngineNET.SyntaxTreeNode omonym_token = tokens[left_i + omonym_position];

            OmonymTokenRecognizer omonym_point = new OmonymTokenRecognizer(omonym_position, omonym_token);

            if (omonym_position == 0)
            {
                TokenTagsEnumerator tte = new TokenTagsEnumerator(IsBoundaryToken(tokens, left_i + 1), tokens[left_i + 1], gren);

                int n = tte.Count;
                for (int i = 0; i < n; ++i)
                {
                    List <TokenRecognizer> points = new List <TokenRecognizer>();
                    points.Add(null); // это омонимичная форма
                    points.Add(tte[i]);
                    ContextRecognizer ctx_recognizer = new ContextRecognizer(points, omonym_point, gren);
                    recognizers.Add(ctx_recognizer);
                }
            }
            else
            {
                TokenTagsEnumerator tte = new TokenTagsEnumerator(IsBoundaryToken(tokens, left_i), tokens[left_i], gren);

                int n = tte.Count;
                for (int i = 0; i < n; ++i)
                {
                    List <TokenRecognizer> points = new List <TokenRecognizer>();
                    points.Add(tte[i]);
                    points.Add(null); // это омонимичная форма
                    ContextRecognizer ctx_recognizer = new ContextRecognizer(points, omonym_point, gren);
                    recognizers.Add(ctx_recognizer);
                }
            }
        }
    }