示例#1
0
 private RegularLanguageNFAState Subtract(RegularLanguageNFAState left, RegularLanguageNFAState right)
 {
     /* *
      * Include the right-element where the left overlaps it;
      * however, every other point of the right-automation
      * is ignored.
      * * 
      * Where the left and right automation are at an edge
      * point, the automation does not yield an edge due to 
      * the exclusive nature of the operation.
      * */
     RegularLanguageNFAState result = new RegularLanguageNFAState();
     if (left.IsEdge)
     {
         if (right.IsEdge)
             result.ForcedNoEdge = true;
         else
             result.IsEdge = true;
     }
     foreach (var transition in left.OutTransitions.Keys)
     {
         IDictionary<RegularLanguageSet, IFiniteAutomataTransitionNode<RegularLanguageSet, List<RegularLanguageNFAState>>> colliders;
         RegularLanguageSet remainder = right.OutTransitions.GetColliders(transition, out colliders);
         if (!remainder.IsEmpty)
             foreach (var target in left.OutTransitions[transition])
                 result.MoveTo(remainder, target);
         foreach (var collision in colliders.Keys)
             foreach (var leftTarget in left.OutTransitions[transition])
                 foreach (var rightTarget in colliders[collision].Target)
                     result.MoveTo(collision, Subtract(leftTarget, rightTarget));
     }
     return result;
 }
示例#2
0
        public void BuildState(Dictionary <ITokenSource, Captures.ICaptureTokenStructuralItem> sourceReplacementLookup)
        {
            var thisReplacement           = sourceReplacementLookup.ContainsKey(this) ? (ITokenSource)(sourceReplacementLookup[this]) : (ITokenSource)this;
            RegularLanguageNFAState state = null;

            foreach (var expression in this.Cast <InlinedTokenExpression>())
            {
                expression.BuildState(sourceReplacementLookup);
                if (state == null)
                {
                    state = expression.NFAState;
                }
                else
                {
                    state.Union(expression.NFAState);
                }
            }
            List <RegularLanguageNFAState> flatline = new List <RegularLanguageNFAState>();

            RegularLanguageNFAState.FlatlineState(state, flatline);
            foreach (var fState in flatline)
            {
                fState.SetIntermediate(thisReplacement);
            }
            state.SetInitial(thisReplacement);
            foreach (var edge in state.ObtainEdges())
            {
                edge.SetFinal(thisReplacement);
            }
            state.HandleRepeatCycle <RegularLanguageSet, RegularLanguageNFAState, RegularLanguageDFAState, ITokenSource, RegularLanguageNFARootState, IInlinedTokenItem>(this, thisReplacement, OilexerGrammarInliningCore.TokenRootStateClonerCache, OilexerGrammarInliningCore.TokenStateClonerCache);
            this.state = state;
        }
示例#3
0
        public void BuildState(Dictionary <ITokenSource, Captures.ICaptureTokenStructuralItem> sourceReplacementLookup)
        {
            var thisReplacement = sourceReplacementLookup.ContainsKey(this) ? (ITokenSource)(sourceReplacementLookup[this]) : (ITokenSource)this;
            var result          = this.BuildStringState(thisReplacement, this.CaseInsensitive, this.Value);

            result.HandleRepeatCycle <RegularLanguageSet, RegularLanguageNFAState, RegularLanguageDFAState, ITokenSource, RegularLanguageNFARootState, IInlinedTokenItem>(this, thisReplacement, OilexerGrammarInliningCore.TokenRootStateClonerCache, OilexerGrammarInliningCore.TokenStateClonerCache);
            this.state = result;
        }
        public void BuildState(Dictionary <ITokenSource, Captures.ICaptureTokenStructuralItem> sourceReplacementLookup)
        {
            var thisReplacement = sourceReplacementLookup.ContainsKey(this) ? (ITokenSource)(sourceReplacementLookup[this]) : (ITokenSource)this;
            var target          = (InlinedTokenExpressionSeries)this.SearchTarget;

            target.BuildState(sourceReplacementLookup);
            RegularLanguageNFAState         current = null;
            Stack <RegularLanguageNFAState> states  = new Stack <RegularLanguageNFAState>(new RegularLanguageNFAState[] { target.State });
            List <RegularLanguageNFAState>  covered = new List <RegularLanguageNFAState>();

            states.Peek().SetInitial(thisReplacement);
            //Step through the sequence until it's finished with the all states
            //associated to the scan operation.
            while (states.Count > 0)
            {
                current = states.Pop();
                if (covered.Contains(current))
                {
                    continue;
                }
                covered.Add(current);
                RegularLanguageSet currentSet = current.OutTransitions.FullCheck;
                if (!currentSet.IsEmpty)
                {
                    foreach (var transition in current.OutTransitions.Values)
                    {
                        foreach (var transitionTarget in transition)
                        {
                            if (!covered.Contains(transitionTarget))
                            {
                                states.Push(transitionTarget);
                            }
                        }
                    }
                    currentSet = currentSet.Complement();
                    if (!(currentSet.IsEmpty))
                    {
                        current.MoveTo(currentSet, target.State);
                    }
                }
            }
            state = target.State;
            List <RegularLanguageNFAState> flatline = new List <RegularLanguageNFAState>();

            RegularLanguageNFAState.FlatlineState(state, flatline);
            foreach (var fState in flatline)
            {
                fState.SetIntermediate(thisReplacement);
            }
            state.SetInitial(thisReplacement);
            foreach (var edge in State.ObtainEdges())
            {
                edge.SetFinal(thisReplacement);
            }
            state.HandleRepeatCycle <RegularLanguageSet, RegularLanguageNFAState, RegularLanguageDFAState, ITokenSource, RegularLanguageNFARootState, IInlinedTokenItem>(this, thisReplacement, OilexerGrammarInliningCore.TokenRootStateClonerCache, OilexerGrammarInliningCore.TokenStateClonerCache);
        }
        public void BuildState(Dictionary <ITokenSource, Captures.ICaptureTokenStructuralItem> sourceReplacementLookup)
        {
            var thisReplacement          = sourceReplacementLookup.ContainsKey(this) ? (ITokenSource)(sourceReplacementLookup[this]) : (ITokenSource)this;
            RegularLanguageNFAState root = new RegularLanguageNFAState();
            RegularLanguageNFAState next = new RegularLanguageNFAState();

            root.SetInitial(thisReplacement);
            root.MoveTo(this.Range, next);
            next.SetFinal(thisReplacement);
            root.HandleRepeatCycle <RegularLanguageSet, RegularLanguageNFAState, RegularLanguageDFAState, ITokenSource, RegularLanguageNFARootState, IInlinedTokenItem>(this, thisReplacement, OilexerGrammarInliningCore.TokenRootStateClonerCache, OilexerGrammarInliningCore.TokenStateClonerCache);
            this.state = root;
        }
        public void BuildState(Dictionary <ITokenSource, ICaptureTokenStructuralItem> sourceReplacementLookup)
        {
            RegularLanguageNFAState state = new RegularLanguageNFAState();

            foreach (var item in this.Cast <IInlinedTokenItem>())
            {
                item.BuildState(sourceReplacementLookup);
                state.Concat(item.State);
            }

            this.nfaState = state;
        }
        public void BuildNFA(IOilexerGrammarFile source)
        {
            if (this.Source is IOilexerGrammarTokenEofEntry)
            {
                return;
            }
            this.captureType = this.DetermineKind();
            Dictionary <ITokenSource, ICaptureTokenStructuralItem> replacements = new Dictionary <ITokenSource, ICaptureTokenStructuralItem>();

            if (captureType.Value != RegularCaptureType.Recognizer)
            {
                this.structure = TokenStructuralExtractionCore.BuildStructureFor(this, source);
                replacements   = TokenStructuralExtractionCore.ObtainReplacements(this.structure);
            }
            else
            {
                replacements = new Dictionary <ITokenSource, ICaptureTokenStructuralItem>();
            }
            this.nfaState = new RegularLanguageNFARootState(this);
            bool first = true;

            foreach (var expression in this.Branches.Cast <InlinedTokenExpression>())
            {
                expression.BuildState(replacements);
                var expressionNFA = expression.NFAState;
                if (first)
                {
                    bool isEdge = expressionNFA.IsEdge;
                    first = false;
                    nfaState.Union(expression.NFAState);
                    if (nfaState.IsEdge && !isEdge)
                    {
                        nfaState.IsEdge = isEdge;
                    }
                }
                else
                {
                    nfaState.Union(expression.NFAState);
                }
            }
            if (ForcedRecognizer)
            {
                List <RegularLanguageNFAState> flatline = new List <RegularLanguageNFAState>();
                RegularLanguageNFAState.FlatlineState(this.nfaState, flatline);
                foreach (var state in flatline)
                {
                    state.IgnoreSources = true;
                }
            }
        }
 public void BuildState(Dictionary <ITokenSource, ICaptureTokenStructuralItem> sourceReplacementLookup)
 {
     foreach (var expression in this.Cast <InlinedTokenExpression>())
     {
         expression.BuildState(sourceReplacementLookup);
         if (this.state == null)
         {
             this.state = expression.NFAState;
         }
         else
         {
             this.state.Union(expression.NFAState);
         }
     }
 }
        private static void CreateBaseEncodedGraph(RegularLanguageNFAState targetState, RegularLanguageNFAState originalState, Dictionary <RegularLanguageNFAState, RegularLanguageNFAState> oldNewLookup, Func <int, NumericBase> baseFactory, bool caseSensitive, int numChars)
        {
            /* *
             * If it's using a user-supplied base, '0' isn't always
             * correct, but it *will* always be one character.
             * */
            var zero = baseFactory(0).ToString()[0];

            foreach (var set in originalState.OutTransitions.Keys)
            {
                var targets    = originalState.OutTransitions[set];
                var endTargets = (from s in targets
                                  select oldNewLookup[s]).ToArray();
                List <string> characters = null;
                Dictionary <char, List <string> > currentSubsets = new Dictionary <char, List <string> >();
                for (int i = (int)set.Offset; i < set.Offset + set.Length; i++)
                {
                    if (set[(uint)i])
                    {
                        var    s       = baseFactory(i);
                        string current = s.ToString();
                        if (numChars > current.Length)
                        {
                            /* *
                             * The math of the radix yields the firstSeries element within the
                             * set always carries a value of zero.  The headache of a
                             * variable-length escape sequence is not worth it.
                             * */
                            current = zero.Repeat(numChars - current.Length) + current;
                        }
                        char first = current[0];
                        if (!currentSubsets.ContainsKey(first))
                        {
                            currentSubsets.Add(first, characters = new List <string>());
                        }
                        string substr = current.Substring(1);
                        if (!characters.Contains(substr))
                        {
                            characters.Add(substr);
                        }
                    }
                }
                Breakdown(targetState, currentSubsets, endTargets, caseSensitive);
            }
        }
示例#10
0
 public void BuildState(Dictionary<ITokenSource, Captures.ICaptureTokenStructuralItem> sourceReplacementLookup)
 {
     var left = ((InlinedTokenExpressionSeries)this.Left);
     var right = ((InlinedTokenExpressionSeries)this.Right);
     var thisReplacement = sourceReplacementLookup.ContainsKey(this) ? (ITokenSource)(sourceReplacementLookup[this]) : (ITokenSource)this;
     left.BuildState(sourceReplacementLookup);
     right.BuildState(sourceReplacementLookup);
     var result = this.Subtract(left.State, right.State);
     List<RegularLanguageNFAState> flatline = new List<RegularLanguageNFAState>();
     RegularLanguageNFAState.FlatlineState(result, flatline);
     foreach (var fState in flatline)
         fState.SetIntermediate(thisReplacement);
     result.SetInitial(thisReplacement);
     foreach (var edge in result.ObtainEdges())
         edge.SetFinal(thisReplacement);
     result.HandleRepeatCycle<RegularLanguageSet, RegularLanguageNFAState, RegularLanguageDFAState, ITokenSource, RegularLanguageNFARootState, IInlinedTokenItem>(this, thisReplacement, OilexerGrammarInliningCore.TokenRootStateClonerCache, OilexerGrammarInliningCore.TokenStateClonerCache);
     this.state = result;
 }
 private static void Breakdown(RegularLanguageNFAState targetState, Dictionary <char, List <string> > currentSubsets, RegularLanguageNFAState[] endTargets, bool caseSensitive)
 {
     foreach (var c in currentSubsets.Keys)
     {
         var           currentSet = currentSubsets[c];
         var           transition = new RegularLanguageSet(caseSensitive, c);
         List <string> characters = null;
         Dictionary <char, List <string> > nextSubsets = new Dictionary <char, List <string> >();
         foreach (var str in currentSet)
         {
             if (str == string.Empty)
             {
                 foreach (var state in endTargets)
                 {
                     targetState.MoveTo(transition, state);
                 }
             }
             else
             {
                 char first = str[0];
                 if (!nextSubsets.ContainsKey(first))
                 {
                     nextSubsets.Add(first, characters = new List <string>());
                 }
                 string substr = str.Substring(1);
                 if (!characters.Contains(substr))
                 {
                     characters.Add(substr);
                 }
             }
         }
         if (nextSubsets.Count > 0)
         {
             var nextSubstate = new RegularLanguageNFAState();
             targetState.MoveTo(transition, nextSubstate);
             Breakdown(nextSubstate, nextSubsets, endTargets, caseSensitive);
         }
     }
 }
        public void BuildState(Dictionary <ITokenSource, Captures.ICaptureTokenStructuralItem> sourceReplacementLookup)
        {
            /* *
             * ToDo: Analyze encodeTarget state and find the number of
             * characters necessary to encode it in the target
             * base.
             * */
            var thisReplacement = sourceReplacementLookup.ContainsKey(this) ? (ITokenSource)(sourceReplacementLookup[this]) : (ITokenSource)this;
            InlinedTokenExpressionSeries encodeTarget = (InlinedTokenExpressionSeries)this.EncodeTarget;

            encodeTarget.BuildState(sourceReplacementLookup);
            var state = encodeTarget.State;
            List <RegularLanguageNFAState> originalStates = new List <RegularLanguageNFAState>();

            RegularLanguageNFAState.FlatlineState(state, originalStates);
            if (!originalStates.Contains(state))
            {
                originalStates.Add(state);
            }
            var onLookup = new Dictionary <RegularLanguageNFAState, RegularLanguageNFAState>();

            foreach (var originalState in originalStates)
            {
                onLookup.Add(originalState, new RegularLanguageNFAState());
            }
            Func <int, NumericBase> baseFactory = null;
            bool caseSensitive = false;

            if (this.NumericBase == null)
            {
                /* *
                 * User-supplied base.
                 * */
                var ac = new AnyController(this.StringBase.GetCleanValue(), !this.StringBase.CaseInsensitive);
                baseFactory   = ab => new AnyBase(ac, ab);
                caseSensitive = !StringBase.CaseInsensitive;
            }
            else
            {
                var cleanValue = this.NumericBase.GetCleanValue();
                baseFactory = baseCreator[(EncodeBase)cleanValue];
                switch (cleanValue)
                {
                case 8:
                case 16:
                case 18:
                case 27:
                case 36:
                    caseSensitive = false;
                    break;

                case 60:
                    caseSensitive = true;
                    break;
                }
            }

            Parallel.ForEach(originalStates, originalState =>
            {
                var targetState = onLookup[originalState];
                targetState.SetSources(originalState.Sources.ToDictionary(k => k.Item1, v => v.Item2));
                CreateBaseEncodedGraph(targetState, originalState, onLookup, baseFactory, caseSensitive, Digits.GetCleanValue());
                targetState.IsEdge = originalState.IsEdge;
            });
            this.state = onLookup[state];
            this.state.HandleRepeatCycle <RegularLanguageSet, RegularLanguageNFAState, RegularLanguageDFAState, ITokenSource, RegularLanguageNFARootState, IInlinedTokenItem>(this, thisReplacement, OilexerGrammarInliningCore.TokenRootStateClonerCache, OilexerGrammarInliningCore.TokenStateClonerCache);
        }