/// <summary> /// 分析输入串 /// 若输入串能构成正确语法树,返回True,否则返回False /// </summary> /// <param name="TokenList">输入串</param> /// <param name="Root">语法树根节点</param> /// <returns>若输入串能构成正确语法树,返回True,否则返回False</returns> public bool Analyse(List <Token> TokenList, out TINYNode Root, out Token ErrorToken) { if (TokenList.Count == 0) { throw new Exception("输入穿中不不包含任何token"); } if (TokenList.Any(token => token.Type == TokenType.Error)) { throw new Exception("请先处理词法分析中发现的错误"); } Stack <NTVTType> NTVTStack = new Stack <NTVTType>(); Stack <TINYNode> NodeStack = new Stack <TINYNode>(); NTVTStack.Push(toNTVT(Start)); Root = new TINYNode(Start.ToString()); ErrorToken = null; NodeStack.Push(Root); int index = 0; NTVTType X; //栈顶元素 TINYNode curNode; //栈顶节点 VTType a; //当前输入 while (NTVTStack.Count != 0) { X = NTVTStack.Peek(); //栈顶元素 curNode = NodeStack.Peek(); //栈顶节点 if (index < TokenList.Count) { a = toVT(TokenList[index].Type.ToString()); } else { a = VTType.θ; } if (X.ToString() == a.ToString()) //当前元素等于栈顶元素 { NTVTStack.Pop(); NodeStack.Pop(); index++; } else if (isNT(X)) //当前元素不等于栈顶元素X,但是栈顶元素X是非终结符 { LL1Item L = find(toNT(X), a); if (L == null) //没有找到[X,a] { if (existX(toNT(X))) //X可以归结为ε { curNode.Children.Add(new TINYNode("ε")); NTVTStack.Pop(); NodeStack.Pop(); } else { curNode.Children.Add(new TINYNode(string.Format("Error"))); ErrorToken = TokenList[index]; return(false); } } else //L!=null { NTVTStack.Pop(); NodeStack.Pop(); if (L.Rule.Contains(NTVTType.ε)) // A -> ε { curNode.Children.Add(new TINYNode("ε")); continue; } for (int i = L.Rule.Count - 1; i >= 0; i--) { NTVTStack.Push(L.Rule[i]); TINYNode newNode = new TINYNode(L.Rule[i].ToString()); NodeStack.Push(newNode); curNode.Children.Insert(0, newNode); } } } else { ErrorToken = TokenList[index]; return(false); } } //#if DEBUG // Root.Show(1); //#endif return(true); }
private void makeLL1List() { LL1ItemList = new List <LL1Item>(); foreach (var rule in TINYRules) { if (rule.Words.Contains(NTVTType.ε)) //规则包含ε,即 A -> ε { foreach (var word in followSet[rule.Start]) { LL1Item cell = new LL1Item(); cell.NT = rule.Start; cell.meet = word; cell.Rule.AddRange(rule.Words); LL1ItemList.Add(cell); } } else if (isNT(rule.Words[0])) // A -> BC { foreach (var word in firstSet[toNT(rule.Words[0])].Where(v => v != VTType.ε)) { LL1Item cell = new LL1Item(); cell.NT = rule.Start; cell.meet = word; cell.Rule.AddRange(rule.Words); LL1ItemList.Add(cell); } if (firstSet[toNT(rule.Words[0])].Contains(VTType.ε)) { foreach (var word in followSet[rule.Start]) { LL1Item cell = new LL1Item(); cell.NT = rule.Start; cell.meet = word; cell.Rule.AddRange(rule.Words); LL1ItemList.Add(cell); } } } else // A -> bC { LL1Item cell = new LL1Item(); cell.NT = rule.Start; cell.meet = toVT(rule.Words[0]); cell.Rule.AddRange(rule.Words); LL1ItemList.Add(cell); } } //#if DEBUG // Debug.WriteLine("-----------------以下展示LL1List------------------------"); // Debug.WriteLine("LL1List共有{0}条记录", LL1ItemList.Count); // foreach (var item in LL1ItemList) // { // Debug.Write(string.Format("[{0},{1}] -> ", item.NT.ToString(), item.meet.ToString())); // foreach (var subitem in item.Rule) // { // Debug.Write(subitem); // Debug.Write(" "); // } // Debug.Write(Environment.NewLine); // } // Debug.WriteLine("-----------------结束展示LL1List------------------------"); //#endif }