예제 #1
0
파일: StdGAnlys.cs 프로젝트: iwaag/AGBLang
        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);
            }
        }
예제 #2
0
파일: StdGAnlys.cs 프로젝트: iwaag/AGBLang
            void AlternativeIncrGAnalyzer.AnalyzeAgain(IncrGAnalysisListener listener)
            {
                var index         = nextIndex;
                var innerListener = new SubListener {
                    clientListner = listener, parent = parent, nextAnalyzerIndex = index, originalInput = originalInput
                };

                if (subAltAnalyzer != null)
                {
                    subAltAnalyzer.AnalyzeAgain(innerListener);
                }
                while (!innerListener.didHit && index < parent.candidates.Count)
                {
                    innerListener.nextAnalyzerIndex++;
                    parent.candidates[index].Analyze(originalInput, innerListener);
                    index++;
                }
            }
예제 #3
0
파일: StdGAnlys.cs 프로젝트: iwaag/AGBLang
            void AlternativeIncrGAnalyzer.AnalyzeAgain(IncrGAnalysisListener listener)
            {
                #region try past alternatives
                if (previousAlt != null)
                {
                    var altLis = new EasyIncrGAnalysListener();
                    previousAlt.AnalyzeAgain(altLis);
                    if (altLis.didMatch)
                    {
                        var alt = new PrvtAltIGAnlys {
                            parent = parent, previousAlt = altLis.alternative, analyzers = analyzers, input = input
                        };
                        listener.OnMatch(altLis.nextInput, altLis.listener, alt);
                        return;
                    }
                }
                #endregion
                #region try repeat

                /*if (parent.conjectionAnalyzer != null && !parent.isConjectionOptional) {
                 *      var easyConjLis = new EasyIncrGAnalysListener();
                 *      parent.conjectionAnalyzer.Analyze(input, easyConjLis);
                 *      if (!easyConjLis.didMatch) {
                 *              return;
                 *      }
                 * }*/
                var newAnalyzers = new List <IncrementalGAnalyzer>(analyzers);
                if (parent.conjectionAnalyzer != null)
                {
                    if (parent.isConjectionOptional)
                    {
                        newAnalyzers.Add(new IGAnlys_IgnoreBlock {
                            baseAnalyzer = new IGAnlys_Optional {
                                baseAnalyzer = parent.conjectionAnalyzer
                            }
                        });
                    }
                    else
                    {
                        newAnalyzers.Add(new IGAnlys_IgnoreBlock {
                            baseAnalyzer = parent.conjectionAnalyzer
                        });
                    }
                }
                newAnalyzers.Add(parent.baseAnalyzer);
                var repeatLis = new EasyIncrGAnalysListener();
                newAnalyzers[0].Analyze(
                    input,
                    new ChainListener {
                    index                = 0,
                    results              = new List <IndexAndResult>(),
                    analyzers            = newAnalyzers,
                    finalListener        = repeatLis,
                    afterListenerFactory = DefaultAfterListener
                }
                    );
                if (repeatLis.didMatch)
                {
                    listener.OnMatch(repeatLis.nextInput, repeatLis.listener,
                                     new PrvtAltIGAnlys {
                        analyzers = newAnalyzers, input = input, parent = parent, previousAlt = repeatLis.alternative
                    }
                                     );
                }
                #endregion
            }
예제 #4
0
파일: StdGAnlys.cs 프로젝트: iwaag/AGBLang
 void AlternativeIncrGAnalyzer.AnalyzeAgain(IncrGAnalysisListener listener)
 {
     baseAltAnalyzer.AnalyzeAgain(new ResultChangingIGAListener {
         parent = parent, baseListener = listener
     });
 }