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