void IncrGAnalysisListener.OnMatch(GAnlysInput nextInput, AfterMatchListener afterListener, AlternativeIncrGAnalyzer alternative) { List <IndexedAfterMatchListener> updatedMatches = new List <IndexedAfterMatchListener>(previoudMatches); updatedMatches.Add(new IndexedAfterMatchListener(nextIndex - 1, afterListener)); if (nextIndex < analyzers.Count) { var recordingListener = new RecordingIncrGAnalysListener { baseListener = new ChainListenerOld { analyzers = analyzers, nextIndex = nextIndex + 1, rootListener = rootListener, previoudMatches = updatedMatches, afterListenerFactory = afterListenerFactory } }; analyzers[nextIndex].Analyze(nextInput, recordingListener); if (!recordingListener.didMatch && alternative != null) { updatedMatches.RemoveAt(updatedMatches.Count - 1); AlternativeIncrGAnalyzer currentAlternative = alternative; var altListener = new ChainListenerOld { analyzers = analyzers, nextIndex = nextIndex, rootListener = rootListener, previoudMatches = updatedMatches, afterListenerFactory = afterListenerFactory }; alternative.AnalyzeAgain(altListener); } } else { //rootListener.OnMatch(nextInput, new ClusterAfterListener { afterListeners = updatedMatches }); rootListener.OnMatch(nextInput, afterListenerFactory(updatedMatches), alternative); } }
void IncrementalGAnalyzer.Analyze(GAnlysInput input, IncrGAnalysisListener listener) { var recLis = new RecordingIncrGAnalysListener { baseListener = listener }; baseAnalyzer.Analyze(input, recLis); if (!recLis.didMatch) { listener.OnMatch(input, StbAfterLis.instance); } }