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