/// <summary> /// Expression -> <ExpressionOr> <Expression> | <ExpressionOr> | <epsilon>; /// </summary> /// <param name="WordInfo"></param> /// <returns></returns> private ResultItem Analysis_Expression(NFAGenerator_Lexer.WordInfo[] WordInfo) { var startnode = new NFANode { Edge = new NFAEdge[0] }; var curnode = startnode; while (true) { if (CurIndex >= WordInfo.Length) { break; } var r = Analysis_ExpressionOr(WordInfo); curnode.Edge = new NFAEdge[1] { new NFAEdge { Epsilon = true, NextNode = r.StartNode } }; curnode = r.EndNode; if (CurIndex < WordInfo.Length && WordInfo[CurIndex].Type == NFAGenerator_Lexer.WordType.RightBrace) { break; } } return(new ResultItem { StartNode = startnode, EndNode = curnode }); }
/// <summary> /// ExpressionStar -> <ExpressionChar> <Star> | <ExpressionChar> /// </summary> /// <param name="WordInfo"></param> /// <returns></returns> private ResultItem Analysis_ExpressionStar(NFAGenerator_Lexer.WordInfo[] WordInfo) { var r = Analysis_ExpressionChar(WordInfo); if (CurIndex < WordInfo.Length && WordInfo[CurIndex].Type == NFAGenerator_Lexer.WordType.Star) { var endnode = new NFANode { Edge = new NFAEdge[0] }; var startnode = new NFANode { Edge = new NFAEdge[2] { new NFAEdge { Epsilon = true, NextNode = r.StartNode }, new NFAEdge { Epsilon = true, NextNode = endnode } } }; r.EndNode.Edge = new NFAEdge[1] { new NFAEdge { Epsilon = true, NextNode = startnode } }; CurIndex++; return(new ResultItem { StartNode = startnode, EndNode = endnode }); } return(r); }
/// <summary> /// ExpressionPart -> <ExpressionStar> <ExpressionPart> | <ExpressionStar> /// </summary> /// <param name="WordInfo"></param> /// <returns></returns> private ResultItem Analysis_ExpressionPart(NFAGenerator_Lexer.WordInfo[] WordInfo) { var startnode = new NFANode { Edge = new NFAEdge[0] }; var curnode = startnode; var empty = true; while (true) { var beginindex = CurIndex; try { var r = Analysis_ExpressionStar(WordInfo); curnode.Edge = new NFAEdge[1] { new NFAEdge { Epsilon = true, NextNode = r.StartNode } }; curnode = r.EndNode; empty = false; } catch (NFAParserAnalysisException ex) { CurIndex = beginindex; break; } if (CurIndex < WordInfo.Length && WordInfo[CurIndex].Type == NFAGenerator_Lexer.WordType.RightBrace) { break; } } if (empty) { if (CurIndex >= WordInfo.Length) { GenerateError("期望表达式但遇到了文本结束标记"); } else { GenerateError("期望表达式", ((char)WordInfo[CurIndex].AdditionInfo) + ""); } } return(new ResultItem { StartNode = startnode, EndNode = curnode }); }
/// <summary> /// ExpressionOr -> <ExpressionPart> <Or> <ExpressionOr> | <ExpressionPart>; /// </summary> /// <param name="WordInfo"></param> /// <returns></returns> private ResultItem Analysis_ExpressionOr(NFAGenerator_Lexer.WordInfo[] WordInfo) { var rlist = new List <ResultItem>(); while (true) { var r = Analysis_ExpressionPart(WordInfo); rlist.Add(r); if (CurIndex >= WordInfo.Length || WordInfo[CurIndex].Type != NFAGenerator_Lexer.WordType.Or) { break; } if (CurIndex < WordInfo.Length && WordInfo[CurIndex].Type == NFAGenerator_Lexer.WordType.RightBrace) { break; } CurIndex++; } if (rlist.Count == 0) { GenerateError("表达式选择列表为空"); } var beginnode = new NFANode(); var endnode = new NFANode { Edge = new NFAEdge[0] }; var beginlist = new List <NFAEdge>(); foreach (var item in rlist) { beginlist.Add(new NFAEdge { Epsilon = true, NextNode = item.StartNode }); item.EndNode.Edge = new NFAEdge[1] { new NFAEdge { Epsilon = true, NextNode = endnode } }; } beginnode.Edge = beginlist.ToArray(); return(new ResultItem { StartNode = beginnode, EndNode = endnode }); }
/// <summary> /// ExpressionChar -> "(" <Expression> ")" | <Char> /// </summary> /// <param name="WordInfo"></param> /// <returns></returns> private ResultItem Analysis_ExpressionChar(NFAGenerator_Lexer.WordInfo[] WordInfo) { if (CurIndex >= WordInfo.Length) { GenerateError("期望字符或表达式但遇到了文本结束标记"); } switch (WordInfo[CurIndex].Type) { case NFAGenerator_Lexer.WordType.LeftBrace: var beginindex = CurIndex; CurIndex++; var r = Analysis_Expression(WordInfo); if (CurIndex >= WordInfo.Length || WordInfo[CurIndex].Type != NFAGenerator_Lexer.WordType.RightBrace) { CurIndex = beginindex; GenerateError("该左括号无对应右括号", "("); } CurIndex++; return(r); case NFAGenerator_Lexer.WordType.Char: var node = new NFANode { Edge = new NFAEdge[1] { new NFAEdge { Condition = (char)WordInfo[CurIndex].AdditionInfo, Epsilon = false, NextNode = new NFANode { Edge = new NFAEdge[0] } } } }; CurIndex++; return(new ResultItem { StartNode = node, EndNode = node.Edge[0].NextNode }); default: GenerateError("无效的词,期望\"(\"或字符", ((char)WordInfo[CurIndex].AdditionInfo) + ""); break; } //Here is unreachable return(new ResultItem()); }
private static void DFS(NFANode CurNode) { var curname = StateNameMap[CurNode]; foreach (var item in CurNode.Edge) { if (!StateNameMap.ContainsKey(item.NextNode)) { var newname = "Q" + (NewStateID++); StateNameMap.Add(item.NextNode, newname); VertexList.Add(newname); EdgeList.Add(new string[3] { curname, newname, item.Epsilon ? "" : item.Condition + "" }); DFS(item.NextNode); } else { EdgeList.Add(new string[3] { curname, StateNameMap[item.NextNode], item.Epsilon ? "" : item.Condition + "" }); } } }