/// <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); }
public Analyzer(ProductionManager grammer) { if (grammer == null) { throw new ArgumentNullException("grammer"); } this.grammer = grammer; }
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); }
public ItemFamily(ProductionManager grammer) { AllItemSet = new List <ItemSet>(); this.Grammer = grammer; }