Пример #1
0
        private DFANode DFANodeClone_DFS(Dictionary <DFANode, DFANode> NodeMap, DFANode CurNode)
        {
            if (NodeMap.ContainsKey(CurNode))
            {
                return(NodeMap[CurNode]);
            }

            var newnode = new DFANode {
                ID = CurNode.ID, IsEndNode = CurNode.IsEndNode, Edge = new List <DFAEdge>()
            };

            NodeMap[CurNode] = newnode;

            foreach (var item in CurNode.Edge)
            {
                var newedge = new DFAEdge {
                    Condition = item.Condition, NextNode = null
                };

                if (item.NextNode != null)
                {
                    newedge.NextNode = DFANodeClone_DFS(NodeMap, item.NextNode);
                }

                newnode.Edge.Add(newedge);
            }

            return(newnode);
        }
Пример #2
0
        public Token ReadToken()
        {
            if (_Index == _Str.Length)
            {
                return(new Token(TokenState.End, null, null, _Line, _Col));
            }

            var index      = _Index;
            var startIndex = index;

            var    state        = _Egt.DFAStateGroup[0];
            Symbol acceptSymbol = null;
            int    accpetIndex  = -1;

            while (true)
            {
                DFAEdge edge = null;

                if (index <= _Str.Length - 1)
                {
                    var cha = _Str[index];
                    edge = state.GetEdge(cha);
                }

                if (edge != null)
                {
                    state = edge.TargetState;

                    if (state.AcceptSymbol != null)
                    {
                        acceptSymbol = state.AcceptSymbol;
                        accpetIndex  = index;
                    }

                    index++;
                }
                else
                {
                    if (acceptSymbol != null)
                    {
                        var token = new Token(TokenState.Accept, acceptSymbol,
                                              _Str.Substring(startIndex, accpetIndex - startIndex + 1),
                                              _Line, _Col);
                        Consumn(token.Value);
                        return(token);
                    }
                    else
                    {
                        var token = new Token(TokenState.Error, null, _Str[startIndex].ToString(),
                                              _Line, _Col);
                        Consumn(token.Value);

                        return(token);
                    }
                }
            }
        }
Пример #3
0
        private bool MatchDFA(string Code, int StartIndex, DFANode StartNode, out int Length)
        {
            var succlength = 0;
            var curnode    = StartNode;
            var curlength  = 0;

            while (true)
            {
                if (curnode.IsEndNode)
                {
                    succlength = curlength;
                }

                if ((StartIndex + curlength) >= Code.Length)
                {
                    break;
                }

                var matchedge = new DFAEdge();

                foreach (var edge in curnode.Edge)
                {
                    if (edge.Condition == Code[StartIndex + curlength])
                    {
                        matchedge = edge;
                        break;
                    }
                }

                if (matchedge.NextNode == null)
                {
                    Length = succlength;
                    break;
                }

                curnode = matchedge.NextNode;
                curlength++;
            }

            Length = succlength;
            return(succlength == 0 ? false : true);
        }