Exemplo n.º 1
0
    private TokenChanges LocalMinForSubSequence(ParsedSequence seq, Dictionary<ParsedSequenceKey, SequenceTokenChanges> memiozation, ParsedSubrule subrule, TokenChanges localMin)
    {
      var subSeqs = seq.GetSequencesForSubrule(subrule).ToArray();
      var hasSequence = false;

      foreach (var subSeq in subSeqs)
      {
        hasSequence = true;
        var localRes = FindBestPath(subSeq, subrule.End, memiozation);

        localMin = TokenChanges.Min(localMin, localRes);
      }

      if (!hasSequence)
      {
        if (subrule.IsEmpty)
          localMin = new TokenChanges(seq.SubruleMandatoryTokenCount(subrule), 0);
        else
          localMin = new TokenChanges();
      }

      return localMin;
    }
Exemplo n.º 2
0
 public static int GetNodeWeight(Dictionary<ParsedSubrule, int> prevCumulativeMinMap, ParsedSubrule key)
 {
   int weight;
   if (prevCumulativeMinMap.TryGetValue(key, out weight))
     return weight;
   return int.MaxValue;
 }
Exemplo n.º 3
0
    private FlattenSequences FlattenSubrule(FlattenSequences prevs, ParseResult parseResult, ParsedSequence seq, SubrulesTokenChanges parses, ParsedSubrule subrule, TokenChanges tokenChanges, Dictionary<ParsedSequenceKey, SequenceTokenChanges> memiozation)
    {
    Begin:

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

      if (subrule.End == 11)
      { }

      var currentNodes = new FlattenSequences();
      //var subruledDesc = seq.GetSubruleDescription(subrule.State);
      if (subrule.IsEmpty)
      {
        //if (subruleInsertedTokens > 0)
        //  Debug.WriteLine("Inserted = " + subruleInsertedTokens + "  -  " + subruledDesc + "  Seq: " + seq);
      }
      else
      {
        var sequences = seq.GetSequencesForSubrule(subrule).ToArray();

        if (sequences.Length > 1)
        { }

        foreach (var subSequences in sequences)
        {
          //Debug.WriteLine(subruledDesc);
          var result = FlattenSequence(prevs, parseResult, subSequences, subrule.End, tokenChanges, memiozation);
          currentNodes.AddRange(result);
        }
      }

      if (currentNodes.Count == 0) // если не было сабсиквенсов, надо создать продолжения из текущего сабруля
      {
        foreach (var prev in prevs)
          currentNodes.Add(new ParsedSequenceAndSubrules.Cons(new SubruleTokenChanges(seq, subrule, tokenChanges), prev));
      }

      var nextSubrules = seq.GetNextSubrules(subrule, parses.Keys).ToArray();
      switch (nextSubrules.Length)
      {
        case 0:
          return currentNodes;
        case 1:
          {
            var nextSubrule = nextSubrules[0];
            if (nextSubrule.State == 9 && nextSubrule.Begin == 8 && nextSubrule.End == 15)
            { }

            tokenChanges = parses[nextSubrule];
            if (tokenChanges.IsFail)
              return currentNodes;
            // recursive self call...
            prevs = currentNodes;
            subrule = nextSubrule;
            goto Begin;
            return null;
          }
        default:
          {
            var resultNodes = new FlattenSequences();

            foreach (var nextSubrule in nextSubrules)
            {
              var newSubruleInsertedTokens = parses[nextSubrule];
              if (newSubruleInsertedTokens.IsFail)
                continue;

              var result = FlattenSubrule(currentNodes, parseResult, seq, parses, nextSubrule, newSubruleInsertedTokens, memiozation);
              resultNodes.AddRange(result);
            }

            return resultNodes;
          }
      }
    }
Exemplo n.º 4
0
        public static int GetNodeWeight(Dictionary <ParsedSubrule, int> prevCumulativeMinMap, ParsedSubrule key)
        {
            int weight;

            if (prevCumulativeMinMap.TryGetValue(key, out weight))
            {
                return(weight);
            }
            return(int.MaxValue);
        }
Exemplo n.º 5
0
        private TokenChanges LocalMinForSubSequence(ParsedSequence seq, Dictionary <ParsedSequenceKey, SequenceTokenChanges> memiozation, ParsedSubrule subrule, TokenChanges localMin)
        {
            var subSeqs     = seq.GetSequencesForSubrule(subrule).ToArray();
            var hasSequence = false;

            foreach (var subSeq in subSeqs)
            {
                hasSequence = true;
                var localRes = FindBestPath(subSeq, subrule.End, memiozation);

                localMin = TokenChanges.Min(localMin, localRes);
            }

            if (!hasSequence)
            {
                if (subrule.IsEmpty)
                {
                    localMin = new TokenChanges(seq.SubruleMandatoryTokenCount(subrule), 0);
                }
                else
                {
                    localMin = new TokenChanges();
                }
            }

            return(localMin);
        }
Exemplo n.º 6
0
        private FlattenSequences FlattenSubrule(FlattenSequences prevs, ParseResult parseResult, ParsedSequence seq, SubrulesTokenChanges parses, ParsedSubrule subrule, TokenChanges tokenChanges, Dictionary <ParsedSequenceKey, SequenceTokenChanges> memiozation)
        {
Begin:

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

            if (subrule.End == 11)
            {
            }

            var currentNodes = new FlattenSequences();

            //var subruledDesc = seq.GetSubruleDescription(subrule.State);
            if (subrule.IsEmpty)
            {
                //if (subruleInsertedTokens > 0)
                //  Debug.WriteLine("Inserted = " + subruleInsertedTokens + "  -  " + subruledDesc + "  Seq: " + seq);
            }
            else
            {
                var sequences = seq.GetSequencesForSubrule(subrule).ToArray();

                if (sequences.Length > 1)
                {
                }

                foreach (var subSequences in sequences)
                {
                    //Debug.WriteLine(subruledDesc);
                    var result = FlattenSequence(prevs, parseResult, subSequences, subrule.End, tokenChanges, memiozation);
                    currentNodes.AddRange(result);
                }
            }

            if (currentNodes.Count == 0) // если не было сабсиквенсов, надо создать продолжения из текущего сабруля
            {
                foreach (var prev in prevs)
                {
                    currentNodes.Add(new ParsedSequenceAndSubrules.Cons(new SubruleTokenChanges(seq, subrule, tokenChanges), prev));
                }
            }

            var nextSubrules = seq.GetNextSubrules(subrule, parses.Keys).ToArray();

            switch (nextSubrules.Length)
            {
            case 0:
                return(currentNodes);

            case 1:
            {
                var nextSubrule = nextSubrules[0];
                if (nextSubrule.State == 9 && nextSubrule.Begin == 8 && nextSubrule.End == 15)
                {
                }

                tokenChanges = parses[nextSubrule];
                if (tokenChanges.IsFail)
                {
                    return(currentNodes);
                }
                // recursive self call...
                prevs   = currentNodes;
                subrule = nextSubrule;
                goto Begin;
                return(null);
            }

            default:
            {
                var resultNodes = new FlattenSequences();

                foreach (var nextSubrule in nextSubrules)
                {
                    var newSubruleInsertedTokens = parses[nextSubrule];
                    if (newSubruleInsertedTokens.IsFail)
                    {
                        continue;
                    }

                    var result = FlattenSubrule(currentNodes, parseResult, seq, parses, nextSubrule, newSubruleInsertedTokens, memiozation);
                    resultNodes.AddRange(result);
                }

                return(resultNodes);
            }
            }
        }
Exemplo n.º 7
0
    private int LocalMinForSubSequence(ParsedSequence seq, Dictionary<ParsedSequenceKey, SubruleParsesAndEnd> memiozation, ParsedSubrule subrule, int localMin)
    {
      var subSeqs = seq.GetSequencesForSubrule(subrule).ToArray();
      var hasSequence = false;

      foreach (var subSeq in subSeqs)
      {
        hasSequence = true;
        var localRes = FindBestPath(subSeq, subrule.End, memiozation);

        if (localRes < localMin)
          localMin = localRes;
      }

      if (!hasSequence)
      {
        if (subrule.IsEmpty)
          localMin = seq.SubruleMandatoryTokenCount(subrule);
        else
          localMin = 0;
      }
      return localMin;
    }