/// <summary> /// 计算文法的所有单个的结点的FIRST /// </summary> /// <param name="grammar"></param> /// <param name="nullableDict"></param> /// <returns></returns> private static void GetFirstCollection4Node( this RegulationList grammar, out FIRSTCollection firstCollection, Dictionary <TreeNodeType, bool> nullableDict = null) { // 初始化FIRST firstCollection = new FIRSTCollection(); // 初始化非叶结点的FIRST foreach (var item in grammar.GetAllTreeNodeNonLeaveTypes()) { if (nullableDict[item]) { firstCollection.TryInsert(new FIRST(item, TreeNodeType.NullNode)); } else { firstCollection.TryInsert(new FIRST(item)); } } // 初始化叶结点的FIRST(叶结点的FIRST实际上已经完工) foreach (var item in grammar.GetAllTreeNodeLeaveTypes()) { firstCollection.TryInsert(new FIRST(item, item)); } bool changed = false; do { changed = false; foreach (var regulation in grammar) { FIRST first = FindFirst(firstCollection, regulation.Left); int rightPartCount = regulation.RightPart.Count(); for (int checkCount = 0; checkCount < rightPartCount; checkCount++) { // 如果前面checkCount个结点都可为null, // 就说明RightPart[checkCount]的FIRST是此regulation.Left的FIRST的一部分。 if (Nullable(regulation.RightPart, 0, checkCount, nullableDict)) { FIRST refFirst = FindFirst(firstCollection, regulation.RightNode(checkCount)); if (refFirst == null) { throw new Exception("algorithm error!"); } if (refFirst != first) { foreach (var value in refFirst.Values) { if (value != TreeNodeType.NullNode) { changed = first.TryInsert(value) || changed; } } } } } } } while (changed); }
/// <summary> /// 计算文法的FOLLOW集 /// </summary> /// <param name="grammar"></param> /// <param name="nullableDict"></param> /// <param name="firstList4Node"></param> /// <returns></returns> private static void DoGetFollowList( this RegulationList grammar, out FOLLOWCollection followCollection, Dictionary <TreeNodeType, bool> nullableDict, FIRSTCollection firstList4Node) { // 初始化Follow list followCollection = new FOLLOWCollection(); foreach (var item in grammar.GetAllTreeNodeNonLeaveTypes()) { followCollection.TryInsert(new FOLLOW(item)); } // 迭代到不动点 bool changed = false; do { changed = false; foreach (var regulation in grammar) { int count = regulation.RightPart.Count(); for (int index = 0; index < count; index++) { // 准备为target添加follow元素 TreeNodeType target = regulation.RightNode(index); if (target.IsLeave) { continue; } // 叶结点没有follow FOLLOW follow = FindFollow(followCollection, target); // 找到follow对象 for (int checkCount = 0; checkCount < count - (index + 1); checkCount++) { if (Nullable(regulation.RightPart, index + 1, checkCount, nullableDict)) { // nullable之后的FIRST是target的follow的一部分 FIRST first = FindFirst( firstList4Node, regulation.RightNode(index + 1 + checkCount)); foreach (var value in first.Values) { if (value != TreeNodeType.NullNode) { changed = follow.TryInsert(value) || changed; } } } } { // 如果target之后的全部结点都是nullable,说明此regulation.Left的folow也是target的一部分。 if (Nullable(regulation.RightPart, index + 1, count - (index + 1), nullableDict)) { // 找到此regulation.Left的folow FOLLOW refFollow = FindFollow(followCollection, regulation.Left); if (refFollow != follow) { foreach (var item in refFollow.Values) { changed = follow.TryInsert(item) || changed; } } } } } } } while (changed); }