Example #1
0
 public static Vertex UniformBy(this Vertex v, ProductionManager g)
 {
     if (v.GetType() == typeof(VertexTerminator))
     {
         return(g.VertexTerminatorSet.SingleOrDefault(c => c.Name == v.Name));
     }
     else if (v.GetType() == typeof(VertexNonterminal))
     {
         return(g.VertexNonterminalSet.SingleOrDefault(c => c.Name == v.Name));
     }
     return(null);
 }
Example #2
0
        /// <summary>
        /// 获取向前推导符
        /// </summary>
        /// <param name="proToExpand"></param>
        /// <param name="grammer"></param>
        /// <returns></returns>
        private List <VertexTerminator> GetFowardSearch(Item projToExpand, ProductionManager grammer)
        {
            List <VertexTerminator> ret = new List <VertexTerminator>();
            int    i        = 1;
            Vertex vCurrent = projToExpand.AfterDot(i);

            if (vCurrent == null)
            {
                return(new List <VertexTerminator>(projToExpand.FowardSearch));
            }

            while (vCurrent != null)
            {
                if (vCurrent.GetType() == typeof(VertexTerminator))
                {
                    ret.Add((VertexTerminator)vCurrent);
                    break;
                }
                else
                {
                    List <VertexTerminator> first = grammer.First[(VertexNonterminal)vCurrent];
                    ret.AddRange(first);
                    if (first.Contains(null) == false)
                    {
                        break;
                    }
                }
                vCurrent = projToExpand.AfterDot(++i);
            }
            return(ret);
        }
Example #3
0
 public static string VertexToString(Vertex v)
 {
     string ret = "V:";
         ret += " {P: " + v.Pos+"}";
     if (v.GetType().GetInterface("INormal") != null)
         ret += " {N: " + (v as INormal).Normal+"}";
     if (v.GetType().GetInterface("ITextured") != null)
         ret += " {T: " + (v as ITextured).TexCoord + "}";
     if (v.GetType().GetInterface("ITex3") != null)
         ret += " {T: " + (v as ITex3).TexCoord + "}";
     return ret;
 }
Example #4
0
 /// <summary>
 /// Finds ALL vertices of the same type as query vertex in the graph
 /// </summary>
 /// <param name="queryVertex">vertex of type you want to find</param>
 /// <returns>all vertices of type you want to find</returns>
 public IEnumerable <Vertex> FindVerticesLike(Vertex queryVertex)
 {
     System.Type type = queryVertex.GetType();
     return(Vertices.Where(v => queryVertex.SameType(v)));
 }
Example #5
0
        public VertexNonterminal Test(string input)
        {
            Stack <Vertex> inputStack = new Stack <Vertex>();

            inputStack.Push(VertexTerminator.End);
            for (int i = input.Length - 1; i >= 0; i--)
            {
                inputStack.Push(new VertexTerminator(input[i]));
            }

            Stack <ItemSet> statusStack = new Stack <ItemSet>();
            Stack <Vertex>  letterStack = new Stack <Vertex>();

            statusStack.Push(this.ItemFamily.FirstItemSet);
            letterStack.Push(VertexTerminator.End);

            while (true)
            {
                ItemSet currentStatus = statusStack.Peek();
                Vertex  currentInput  = inputStack.Peek().UniformBy(grammer);
                if (currentInput == null)
                {
                    throw new TestFailedException("输入'" + inputStack.Peek() + "'符号不合法", inputStack, statusStack, letterStack);
                }

                if (currentStatus.ActionTable.ContainsKey(currentInput) == false)
                {
                    throw new TestFailedException("无法找到合适的规约项或者移进项", inputStack, statusStack, letterStack);
                }

                Action action = currentStatus.ActionTable[currentInput];

                if (OnAnalysisProcess != null && currentInput.GetType() == typeof(VertexTerminator))
                {
                    OnAnalysisProcess(statusStack, letterStack, inputStack, action);
                }

                if (action.GetType() == typeof(GotoAction))
                {
                    letterStack.Push(inputStack.Pop());
                    statusStack.Push(((GotoAction)action).ItemSet);
                }
                else
                {       // AC 或者 规约
                    GrammerRule rule;

                    rule = ((ConvertionAction)action).Rule;
                    int length           = rule.Right.Count;
                    VertexNonterminal vn = new VertexNonterminal(rule.Left.Name);
                    vn.Children = new List <Vertex>();
                    while (length > 0)
                    {
                        Vertex child = letterStack.Pop();
                        child.Father = vn;
                        vn.Children.Add(child);
                        statusStack.Pop();
                        length--;
                    }
                    vn.Children.Reverse();
                    if (((ConvertionAction)action).Acceptable)
                    {
                        return(vn);
                    }
                    else
                    {
                        inputStack.Push(vn);
                    }
                }
            }
        }