当指定的NFA节点是1的时候,如果要获取 使用一个条件a 可以到达的节点的集合,肉眼的答案是node2和node3;但是要怎么样使用代码实现?

节点的性质

  1. 每个节点至多可以拥有两个子节点,允许只拥有一个子节点或者根本不拥有节点;
  2. epsilon链接的个数不受限制,但是其他的链接个数只能出现1次,例如指定节点1和条件a,得到的结果集合中,将只有节点2,3,6,但是不会出现节点4和节点7;

    查找逻辑

    实际上可以把NFA图理解成一个二叉树,不同的是这个二叉树可能会存在环,不过实际上并不影响其使用;NFA中存在一种特殊的链接,epsilon链接,这种链接纯粹是为了方便生成NFA链接而存在的…如果节点1与节点2之间存在一个epsilon链接,那么从节点1出发,即使没有输入也能够到达节点2;所以如果两个节点之间存在epsilon链接,就可以将这两个节点理解为一个节点;
    再来说搜索,如果给定一个节点和一个条件,查找从给定节点出发,能够通过条件到达的目标节点;
    如果将NFA图看作一个二叉树的话,可以使用深度优先搜索进行…可以很方便的便利分叉;

    递归

    1. void GetNextNFANodes(struct DFANODE *currentDFA,struct NFANODE * currentNFA,int conditionCode)
    2. {
    3. /*if(currentNFA->edge1 != NIL)
    4. {
    5. if(currentNFA->edge1==EPSILON_MATCH_DEGE)
    6. {
    7. //check duplication
    8. if(CheckRepeatOfNFANode(currentDFA->NFACollection,currentNFA->next1)==0)
    9. {
    10. PushNFANodeToDFANode(currentDFA,currentNFA->next1);
    11. //recursion call
    12. GetNextNFANodes(currentDFA,currentNFA->next1,conditionCode);
    13. //check state
    14. if(currentNFA->position == ENDPOSITION)
    15. currentDFA->position = ENDCOLLECTION;
    16. }
    17. return;
    18. }
    19. if(currentNFA->matchArray == conditionCode || conditionCode==currentNFA->edge1)
    20. {
    21. //check duplicaiton
    22. if(CheckRepeatOfNFANode(currentDFA->NFACollection,currentNFA->next1)==0)
    23. {
    24. PushNFANodeToDFANode(currentDFA,currentNFA->next1);
    25. currentDFA->matchArray = currentDFA->matchArray | currentNFA->matchArray;
    26. }
    27. return;
    28. }
    29. }
    30. if(currentNFA->edge2 != NIL)
    31. {
    32. if(currentNFA->edge2 == EPSILON_MATCH_DEGE)
    33. {
    34. //ckeck duplication
    35. if(CheckRepeatOfNFANode(currentDFA->NFACollection,currentNFA->next2)==0)
    36. {
    37. PushNFANodeToDFANode(currentDFA,currentNFA->next2);
    38. //recusrion call
    39. GetNextNFANodes(currentDFA,currentNFA->next2,conditionCode);
    40. //check state
    41. if(currentNFA->position == ENDPOSITION)
    42. currentDFA->position = ENDCOLLECTION;
    43. }
    44. return;
    45. }
    46. if(currentNFA->matchArray == conditionCode || conditionCode==currentNFA->edge2)
    47. {
    48. //check duplication
    49. if(CheckRepeatOfNFANode(currentDFA->NFACollection,currentNFA->next2)==0)
    50. {
    51. PushNFANodeToDFANode(currentDFA,currentNFA);
    52. currentDFA->matchArray = currentDFA->matchArray | currentNFA->matchArray;
    53. }
    54. return;
    55. }
    56. return;
    57. }
    58. if(currentNFA->edge1 == NIL && currentNFA->edge2 == NIL)
    59. return;*/
    60. if(currentNFA->edge1 != NIL)
    61. {
    62. if(currentNFA->edge1 == EPSILON_MATCH_DEGE)
    63. {
    64. GetNextNFANodes(currentDFA,currentNFA->next1,conditionCode);
    65. }
    66. else
    67. {
    68. if(currentNFA->edge1 == conditionCode)//char collection
    69. {
    70. if(CheckRepeatOfNFANode(currentDFA->NFACollection,currentNFA->next1)==0)
    71. {
    72. PushNFANodeToDFANode(currentDFA,currentNFA->next1);
    73. currentDFA->matchArray = currentDFA->matchArray | currentNFA->matchArray;
    74. }
    75. }
    76. else//single char matching condition
    77. {
    78. if(currentNFA->matchArray == conditionCode)
    79. {
    80. if(CheckRepeatOfNFANode(currentDFA->NFACollection,currentNFA->next1)==0)
    81. {
    82. PushNFANodeToDFANode(currentDFA,currentNFA->next1);
    83. currentDFA->matchArray = currentDFA->matchArray | currentNFA->matchArray;
    84. }
    85. }
    86. }
    87. }
    88. }
    89. if(currentNFA->edge2 != NIL)
    90. {
    91. if(currentNFA->edge2 == EPSILON_MATCH_DEGE)
    92. {
    93. GetNextNFANodes(currentDFA,currentNFA->next2,conditionCode);
    94. }
    95. else
    96. {
    97. if(currentNFA->edge2 == conditionCode)//char collection
    98. {
    99. if(CheckRepeatOfNFANode(currentDFA->NFACollection,currentNFA->next2)==0)
    100. {
    101. PushNFANodeToDFANode(currentDFA,currentNFA->next2);
    102. currentDFA->matchArray = currentDFA->matchArray | currentNFA->matchArray;
    103. }
    104. }
    105. else//single char matching condition
    106. {
    107. if(currentNFA->matchArray == conditionCode)
    108. {
    109. if(CheckRepeatOfNFANode(currentDFA->NFACollection,currentNFA->next2)==0)
    110. {
    111. PushNFANodeToDFANode(currentDFA,currentNFA->next2);
    112. currentDFA->matchArray = currentDFA->matchArray | currentNFA->matchArray;
    113. }
    114. }
    115. }
    116. }
    117. }
    118. return;
    119. }

    特殊应用场景

    在NFA构建过程中,会出现如下场景:
    这种图形的主要是由于重复匹配引起的(在digitMap规则中,由”.”引起,在正则表达式中则由”*”引起);这种存在环的路线,也可以使用递归;