示例#1
0
        public IntervalSet GetFollowSet()
        {
            int symbol         = UnknownSymbol;
            int symbolPosition = _input.Index + _lookAheadPosition - 1;

            if (_lookAheadPosition == 0 && _lookBehindPosition == 0 && _contexts.Count == 0)
            {
                IntervalSet allTokens = new IntervalSet();
                foreach (var transition in Network.Transitions.Where(i => i.IsMatch))
                {
                    allTokens.UnionWith(transition.MatchSet);
                }

                return(allTokens);
            }

            Stopwatch updateTimer = Stopwatch.StartNew();

            List <InterpretTrace>    existing = new List <InterpretTrace>(_contexts);
            SortedSet <int>          states   = new SortedSet <int>();
            HashSet <InterpretTrace> contexts = new HashSet <InterpretTrace>(EqualityComparer <InterpretTrace> .Default);

            foreach (var context in existing)
            {
                states.Add(context.EndContext.State.Id);
                StepForward(contexts, states, context, symbol, symbolPosition, PreventContextType.None);
                states.Clear();
            }

            IntervalSet result = new IntervalSet();

            if (contexts.Count > 0)
            {
                foreach (var context in contexts)
                {
                    var lastMatch = context.Transitions.Last.Value;
                    if (lastMatch.Transition.IsMatch)
                    {
                        result.UnionWith(lastMatch.Transition.MatchSet);
                    }
                }
            }

            long nfaUpdateTime = updateTimer.ElapsedMilliseconds;

            return(result);
        }
        public IntervalSet GetFollowSet()
        {
            int symbol = UnknownSymbol;
            int symbolPosition = _input.Index + _lookAheadPosition - 1;

            if (_lookAheadPosition == 0 && _lookBehindPosition == 0 && _contexts.Count == 0)
            {
                IntervalSet allTokens = new IntervalSet();
                foreach (var transition in Network.Transitions.Where(i => i.IsMatch))
                    allTokens.UnionWith(transition.MatchSet);

                return allTokens;
            }

            Stopwatch updateTimer = Stopwatch.StartNew();

            List<InterpretTrace> existing = new List<InterpretTrace>(_contexts);
            SortedSet<int> states = new SortedSet<int>();
            HashSet<InterpretTrace> contexts = new HashSet<InterpretTrace>(EqualityComparer<InterpretTrace>.Default);

            foreach (var context in existing)
            {
                states.Add(context.EndContext.State.Id);
                StepForward(contexts, states, context, symbol, symbolPosition, PreventContextType.None);
                states.Clear();
            }

            IntervalSet result = new IntervalSet();
            if (contexts.Count > 0)
            {
                foreach (var context in contexts)
                {
                    var lastMatch = context.Transitions.Last.Value;
                    if (lastMatch.Transition.IsMatch)
                        result.UnionWith(lastMatch.Transition.MatchSet);
                }
            }

            long nfaUpdateTime = updateTimer.ElapsedMilliseconds;

            return result;
        }
示例#3
0
        public IntervalSet GetFollowSet(PreventContextType preventContextType)
        {
            if (_followSet != null && _followSet[(int)preventContextType] != null)
            {
                return(_followSet[(int)preventContextType]);
            }

            IntervalSet[] sets     = _followSet ?? new IntervalSet[Enum.GetValues(typeof(PreventContextType)).Cast <int>().Max() + 1];
            IntervalSet   set      = new IntervalSet();
            var           queue    = new Queue <Tuple <Transition, PreventContextType> >(OutgoingTransitions.Select(i => Tuple.Create(i, preventContextType)));
            var           comparer = new TupleEqualityComparer <Transition, PreventContextType>(ObjectReferenceEqualityComparer <Transition> .Default, null);
            var           visited  = new HashSet <Tuple <Transition, PreventContextType> >(queue, comparer);

            while (queue.Count > 0)
            {
                var                pair                   = queue.Dequeue();
                Transition         transition             = pair.Item1;
                PreventContextType nextPreventContextType = pair.Item2;

                if (transition.IsContext)
                {
                    switch (nextPreventContextType)
                    {
                    case PreventContextType.Pop:
                        if (!transition.IsRecursive && transition is PopContextTransition)
                        {
                            continue;
                        }

                        break;

                    case PreventContextType.PopRecursive:
                        if (transition.IsRecursive && (transition is PopContextTransition))
                        {
                            continue;
                        }

                        break;

                    case PreventContextType.Push:
                        if (!transition.IsRecursive && transition is PushContextTransition)
                        {
                            continue;
                        }

                        break;

                    case PreventContextType.PushRecursive:
                        if (transition.IsRecursive && (transition is PushContextTransition))
                        {
                            continue;
                        }

                        break;

                    default:
                        break;
                    }
                }

                if (transition.IsEpsilon || transition.IsContext)
                {
                    // the preventContextType can only change if we're following a another context transition
                    if (transition.IsContext)
                    {
                        nextPreventContextType = PreventContextType.None;
                        if (transition.SourceState.IsOptimized)
                        {
                            if (transition is PushContextTransition)
                            {
                                nextPreventContextType = transition.IsRecursive ? PreventContextType.PushRecursive : PreventContextType.Push;
                            }
                            else if (transition is PopContextTransition)
                            {
                                nextPreventContextType = transition.IsRecursive ? PreventContextType.PopRecursive : PreventContextType.Pop;
                            }
                        }
                    }

                    if (transition.TargetState._followSet != null && transition.TargetState._followSet[(int)nextPreventContextType] != null)
                    {
                        set.UnionWith(transition.TargetState._followSet[(int)nextPreventContextType]);
                    }
                    else
                    {
                        foreach (var outgoing in transition.TargetState.OutgoingTransitions)
                        {
                            var nextPair = Tuple.Create(outgoing, nextPreventContextType);
                            if (visited.Add(nextPair))
                            {
                                queue.Enqueue(Tuple.Create(outgoing, nextPreventContextType));
                            }
                        }
                    }
                }
                else
                {
                    set.UnionWith(transition.MatchSet);
                }
            }

            _followSet = sets;
            _followSet[(int)preventContextType] = set;

            return(set);
        }
示例#4
0
        private static void GetLl2SymbolSets()
        {
            lock (_lookupTablesLock)
            {
                if (_definitionContextSet1 != null)
                {
                    return;
                }

                Network setAnalysisNetwork = NetworkBuilder <JavaSimplifiedAtnBuilder> .GetOrBuildNetwork();

                JavaSimplifiedAtnBuilder setAnalysisBuilder = (JavaSimplifiedAtnBuilder)setAnalysisNetwork.Builder;

                _definitionSourceSet = setAnalysisBuilder.DefinitionSourceSet;
                _referenceSourceSet  = setAnalysisBuilder.ReferenceSourceSet;
                _definitionFollowSet = setAnalysisBuilder.DefinitionFollowSet;
                _referenceFollowSet  = setAnalysisBuilder.ReferenceFollowSet;

                _definitionOnlySourceSet = setAnalysisBuilder.DefinitionOnlySourceSet;
                _referenceOnlySourceSet  = setAnalysisBuilder.ReferenceOnlySourceSet;
                _definitionOnlyFollowSet = setAnalysisBuilder.DefinitionOnlyFollowSet;
                _referenceOnlyFollowSet  = setAnalysisBuilder.ReferenceOnlyFollowSet;

                _definitionContextSet1 = new Dictionary <int, IntervalSet>();
                _referenceContextSet1  = new Dictionary <int, IntervalSet>();
                _definitionSourceSet2  = new Dictionary <int, IntervalSet>();
                _referenceSourceSet2   = new Dictionary <int, IntervalSet>();
                _definitionFollowSet2  = new Dictionary <int, IntervalSet>();
                _referenceFollowSet2   = new Dictionary <int, IntervalSet>();

                var sharedSourceTokens = setAnalysisBuilder.DefinitionSourceSet.Intersect(setAnalysisBuilder.ReferenceSourceSet);
                foreach (var sharedSourceToken in sharedSourceTokens)
                {
                    CommonTokenStream analysisTokenStream = new CommonTokenStream(new ArrayTokenSource(sharedSourceToken, Java2Lexer.IDENTIFIER));
                    analysisTokenStream.Fill();
                    analysisTokenStream.Seek(1);

                    // definition context set
                    NetworkInterpreter ll2analyzer = new NetworkInterpreter(setAnalysisNetwork, analysisTokenStream);
                    ll2analyzer.ExcludedStartRules.Add(setAnalysisNetwork.GetRule(JavaAtnBuilder.RuleNames.SymbolReferenceIdentifier));
                    ll2analyzer.TryStepForward();
                    ll2analyzer.TryStepBackward();
                    _definitionContextSet1[sharedSourceToken] = ll2analyzer.GetFollowSet();
                    _definitionSourceSet2[sharedSourceToken]  = ll2analyzer.GetSourceSet();

                    // reference context set
                    ll2analyzer = new NetworkInterpreter(setAnalysisNetwork, analysisTokenStream);
                    ll2analyzer.ExcludedStartRules.Add(setAnalysisNetwork.GetRule(JavaAtnBuilder.RuleNames.SymbolDefinitionIdentifier));
                    ll2analyzer.TryStepForward();
                    ll2analyzer.TryStepBackward();
                    _referenceContextSet1[sharedSourceToken] = ll2analyzer.GetFollowSet();
                    _referenceSourceSet2[sharedSourceToken]  = ll2analyzer.GetSourceSet();
                }

                var sharedFollowTokens = setAnalysisBuilder.DefinitionFollowSet.Intersect(setAnalysisBuilder.ReferenceFollowSet);
                foreach (var sharedFollowToken in sharedFollowTokens)
                {
                    CommonTokenStream analysisTokenStream = new CommonTokenStream(new ArrayTokenSource(Java2Lexer.IDENTIFIER, sharedFollowToken));
                    analysisTokenStream.Fill();
                    analysisTokenStream.Seek(0);

                    // definition follow set
                    NetworkInterpreter ll2analyzer = new NetworkInterpreter(setAnalysisNetwork, analysisTokenStream);
                    ll2analyzer.ExcludedStartRules.Add(setAnalysisNetwork.GetRule(JavaAtnBuilder.RuleNames.SymbolReferenceIdentifier));
                    ll2analyzer.TryStepForward();
                    ll2analyzer.TryStepBackward();
                    _definitionFollowSet2[sharedFollowToken] = ll2analyzer.GetFollowSet();

                    // reference follow set
                    ll2analyzer = new NetworkInterpreter(setAnalysisNetwork, analysisTokenStream);
                    ll2analyzer.ExcludedStartRules.Add(setAnalysisNetwork.GetRule(JavaAtnBuilder.RuleNames.SymbolDefinitionIdentifier));
                    ll2analyzer.TryStepForward();
                    ll2analyzer.TryStepBackward();
                    _referenceFollowSet2[sharedFollowToken] = ll2analyzer.GetFollowSet();
                }
            }
        }