コード例 #1
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);
        }
コード例 #2
0
 public Analyzer(ProductionManager grammer)
 {
     if (grammer == null)
     {
         throw new ArgumentNullException("grammer");
     }
     this.grammer = grammer;
 }
コード例 #3
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);
 }
コード例 #4
0
 public ItemFamily(ProductionManager grammer)
 {
     AllItemSet   = new List <ItemSet>();
     this.Grammer = grammer;
 }