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); }
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; }
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; }
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; } } }
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); } } }