Пример #1
0
        private FlattenSequences FlattenSequence(
            FlattenSequences prevs,
            ParseResult parseResult,
            ParsedSequence seq,
            int end,
            TokenChanges sequenceInsertedTokens,
            Dictionary <ParsedSequenceKey, SequenceTokenChanges> memiozation)
        {
            //var seqTxt = parseResult.Text.Substring(seq.StartPos, end - seq.StartPos);

            if (seq.StartPos == 8 && end == 15)
            {
                Debug.Assert(true);
            }

            SequenceTokenChanges first;
            var key = new ParsedSequenceKey(seq, end);

            if (!memiozation.TryGetValue(key, out first))
            {
                Debug.Assert(false);
            }

            var parses = first.SubrulesTokenChanges;

            if (first.TotalTokenChanges.IsFail)
            {
                return(new FlattenSequences());
            }

            if (sequenceInsertedTokens != first.TotalTokenChanges)
            {
                //Debug.Assert(false);
                return(new FlattenSequences());
            }

            var firstSubrules = seq.GetFirstSubrules(parses.Keys).ToArray();

            var total = new FlattenSequences();

            foreach (var firstSubrule in firstSubrules)
            {
                //var txt = parseResult.Text.Substring(firstSubrule.Begin, firstSubrule.End - firstSubrule.Begin);
                //var stateIndex = firstSubrule.State;
                //var state = stateIndex < 0 ? null : seq.ParsingSequence.States[stateIndex];

                var insertedTokens = parses[firstSubrule];
                if (insertedTokens.IsFail)
                {
                    continue;
                }

                var result = FlattenSubrule(prevs, parseResult, seq, parses, firstSubrule, insertedTokens, memiozation);
                total.AddRange(result);
            }

            return(total);
        }
Пример #2
0
    private int FindBestPath(ParsedSequence seq, int end, Dictionary<ParsedSequenceKey, SubruleParsesAndEnd> memiozation)
    {
      if (_parseResult.TerminateParsing)
        throw new OperationCanceledException();

      SubruleParsesAndEnd result;

      var key = new ParsedSequenceKey(seq, end);

      if (memiozation.TryGetValue(key, out result))
        return result.End;

      if (seq.StartPos == end)
      {
        memiozation.Add(key, new SubruleParsesAndEnd(new Dictionary<ParsedSubrule, int>(), seq.ParsingSequence.MandatoryTokenCount));
        return seq.ParsingSequence.MandatoryTokenCount;
      }

      var results = new Dictionary<ParsedSubrule, int>();
      var validSubrules = seq.GetValidSubrules(end).ToList();
      if (validSubrules.Count == 0)
      {
        memiozation.Add(key, new SubruleParsesAndEnd(results, 0));
        return 0;
      }
      memiozation.Add(key, new SubruleParsesAndEnd(results, Fail));

      foreach (var subrule in validSubrules)
      {
        var localMin = Fail;
        if (_deletedToken.ContainsKey(new ParsedSequenceAndSubrule(seq, subrule)))
          localMin = 1; // оцениваем удаление как одну вставку
        else
          localMin = LocalMinForSubSequence(seq, memiozation, subrule, localMin);

        results[subrule] = localMin;
      }

      int comulativeMin;
      if (results.Count == 0)
      { }
      var bestResults = RemoveWorstPaths(seq, end, results, out comulativeMin);
      var result2 = new SubruleParsesAndEnd(bestResults, comulativeMin);
      memiozation[key] = result2;

      return result2.End;
    }
Пример #3
0
    private TokenChanges FindBestPath(ParsedSequence seq, int end, Dictionary<ParsedSequenceKey, SequenceTokenChanges> memiozation)
    {
      if (_parseResult.TerminateParsing)
        throw new OperationCanceledException();

      SequenceTokenChanges result;

      var key = new ParsedSequenceKey(seq, end);

      if (memiozation.TryGetValue(key, out result))
        return result.TotalTokenChanges;

      if (seq.StartPos == end)
      {
        var tokenChanges = new TokenChanges(seq.ParsingSequence.MandatoryTokenCount, 0);
        memiozation.Add(key, new SequenceTokenChanges(new SubrulesTokenChanges(), tokenChanges));
        return tokenChanges;
      }

      var results = new SubrulesTokenChanges();
      var validSubrules = seq.GetValidSubrules(end).ToList();
      if (validSubrules.Count == 0)
      {
        var tokenChanges = new TokenChanges();
        memiozation.Add(key, new SequenceTokenChanges(results, tokenChanges));
        return tokenChanges;
      }
      memiozation.Add(key, new SequenceTokenChanges(results, TokenChanges.Fail));

      foreach (var subrule in validSubrules)
      {
        TokenChanges localMin = TokenChanges.Fail;
        if (_deletedToken.ContainsKey(new ParsedSequenceAndSubrule(seq, subrule)))
          localMin = new TokenChanges(0, 1);
        else
          localMin = LocalMinForSubSequence(seq, memiozation, subrule, localMin);

        results[subrule] = localMin;
      }

      TokenChanges comulativeMin;
      if (results.Count == 0)
      { }
      var bestResults = RemoveWorstPaths(seq, end, results, out comulativeMin);
      var result2 = new SequenceTokenChanges(bestResults, comulativeMin);
      memiozation[key] = result2;

      return result2.TotalTokenChanges;
    }
Пример #4
0
    private FlattenSequences FlattenSequence(
      FlattenSequences prevs,
      ParseResult parseResult,
      ParsedSequence seq,
      int end,
      TokenChanges sequenceInsertedTokens,
      Dictionary<ParsedSequenceKey, SequenceTokenChanges> memiozation)
    {
      //var seqTxt = parseResult.Text.Substring(seq.StartPos, end - seq.StartPos);

      if (seq.StartPos == 8 && end == 15)
        Debug.Assert(true);

      SequenceTokenChanges first;
      var key = new ParsedSequenceKey(seq, end);
      if (!memiozation.TryGetValue(key, out first))
        Debug.Assert(false);

      var parses = first.SubrulesTokenChanges;

      if (first.TotalTokenChanges.IsFail)
        return new FlattenSequences();

      if (sequenceInsertedTokens != first.TotalTokenChanges)
      {
        //Debug.Assert(false);
        return new FlattenSequences();
      }

      var firstSubrules = seq.GetFirstSubrules(parses.Keys).ToArray();

      var total = new FlattenSequences();

      foreach (var firstSubrule in firstSubrules)
      {
        //var txt = parseResult.Text.Substring(firstSubrule.Begin, firstSubrule.End - firstSubrule.Begin);
        //var stateIndex = firstSubrule.State;
        //var state = stateIndex < 0 ? null : seq.ParsingSequence.States[stateIndex];

        var insertedTokens = parses[firstSubrule];
        if (insertedTokens.IsFail)
          continue;

        var result = FlattenSubrule(prevs, parseResult, seq, parses, firstSubrule, insertedTokens, memiozation);
        total.AddRange(result);
      }

      return total;
    }
Пример #5
0
        private TokenChanges FindBestPath(ParsedSequence seq, int end, Dictionary <ParsedSequenceKey, SequenceTokenChanges> memiozation)
        {
            if (_parseResult.TerminateParsing)
            {
                throw new OperationCanceledException();
            }

            SequenceTokenChanges result;

            var key = new ParsedSequenceKey(seq, end);

            if (memiozation.TryGetValue(key, out result))
            {
                return(result.TotalTokenChanges);
            }

            if (seq.StartPos == end)
            {
                var tokenChanges = new TokenChanges(seq.ParsingSequence.MandatoryTokenCount, 0);
                memiozation.Add(key, new SequenceTokenChanges(new SubrulesTokenChanges(), tokenChanges));
                return(tokenChanges);
            }

            var results       = new SubrulesTokenChanges();
            var validSubrules = seq.GetValidSubrules(end).ToList();

            if (validSubrules.Count == 0)
            {
                var tokenChanges = new TokenChanges();
                memiozation.Add(key, new SequenceTokenChanges(results, tokenChanges));
                return(tokenChanges);
            }
            memiozation.Add(key, new SequenceTokenChanges(results, TokenChanges.Fail));

            foreach (var subrule in validSubrules)
            {
                TokenChanges localMin = TokenChanges.Fail;
                if (_deletedToken.ContainsKey(new ParsedSequenceAndSubrule(seq, subrule)))
                {
                    localMin = new TokenChanges(0, 1);
                }
                else
                {
                    localMin = LocalMinForSubSequence(seq, memiozation, subrule, localMin);
                }

                results[subrule] = localMin;
            }

            TokenChanges comulativeMin;

            if (results.Count == 0)
            {
            }
            var bestResults = RemoveWorstPaths(seq, end, results, out comulativeMin);
            var result2     = new SequenceTokenChanges(bestResults, comulativeMin);

            memiozation[key] = result2;

            return(result2.TotalTokenChanges);
        }