分析

例如:

  1. char *originalInput = "[23-9#][3-8]xx6 | [1234]xx";

如果输入是一个字符串的话,首先需要对这个字符串进行分析
在DigitMap匹配规则下,无非存在四种状态:

  1. 不匹配(起始状态,也可能是最终状态) 第四期望
  2. 部分匹配(可能的最终状态) 第三期望
  3. 超时匹配(可能的最终状态) 第二期望
  4. 完全匹配(可能的最终状态) 第一期望

对字符串进行分析
DigitMap是没有所谓通配符的,X或者x仅仅代表统配数字,而并不符合#*等DTFM字符

NFA生成

第一部分:[23-9#][3-8]xx6x

token读入第一个字符

  1. 生成一个起始节点;用于并联,节点0;
  2. 生成两个节点(节点1,节点2),起始节点和结束节点指针指分别指向他们;
  3. “[“,它表示一个Rnage
  4. 向后阅读查看在下一个”|”到来之前,是否出现过”]”,如果出现过,那么在语法上首先是说得过去的,否则就要返回error,这个规则从语法上就是错误的
  5. 进行了检查之后,先后生成规则
    1. 读取后一位内容,添加入inputSet中;(假设后一位不是”-“)
    2. 读取后一位内容,添加入inputSet中;(假设后一位不是”-“)
    3. 读取后一位内容,发现是”-“,进行处理:
      1. 检查”-“的前后是否为数字,如果前后有一方不是数字,则返回error,这不是一个正确的范围
      2. 如果检查通过,则使用循环,将范围中的数据都添加到inputSet中;
    4. 读取后一位内容,添加入inputSet中;(假设后一位不是”]”)
    5. 读取后一位内容,(假设后一位是”]”),表示这个范围结束,向后进行
  6. 在向后进行之前,首先需要构建 一条边一个指针
    1. 说明:边是匹配规则,也就是上文中的inputSet;
    2. 说明:指针是指向下一个节点的,作用是建立连接,在DigitMap匹配规则中,一个节点指向外侧的边数量并没有限制;因此需要一个类似于 链表 的结构,可扩展的去存储某个节点指向外侧的边
    3. 令:当前这个指针名叫next1;
  7. 让next1->当前的结束节点

  8. 向后阅读字符,再次申请两个节点(节点3,节点4),代表新一轮的起始节点和结束节点;
  9. 节点3的inputSet中也是一个范围字符集,重复对第一个范围的操作;然后让节点3的next->节点4;
  10. 串联(节点1,节点2)和(节点3,节点4);节点1-(ccl)->节点2-(epsilon)->节点3-(ccl)->节点4

  11. 继续向下进行,首先还是创建两个节点,节点5,节点6
  12. 下一个规则是”x”这也是一个CCL,节点5的inputSet应当是0123…9
  13. 节点5和节点6通过ccl链接起来;然后再和之前的内容串联;

  14. 继续向下,又是一个x,按照12-14步进行

  15. 继续向下,单字符匹配规则;
  16. 申请两个节点(7,8)
  17. 节点7的edge=”6”;通过这个”6”链接到节点8;

  18. 又是一个x,按照12-14步骤处理

  19. 向下阅读,发现了第一部分结束了,抛弃空格,在阅读到”|”之后;进入下一部分的阅读,此时需要将节点1连接到节点0上面,申请一个新的节点11,将节点11链接到节点10上;( 为了实现并联
  20. 此时,起始节点指向节点0,终止节点指向节点11;

    第二部分:[1234]xx

  21. 申请节点(12,13)

  22. 阅读第一个(相对而言….)字符;是一个范围的起始符号
  23. 格式检查,如果没有通过直接返回error
  24. 如果通过,则节点8的inputSet挨个写进去1,2,3,4;链接8和9(使用ccl)

  25. 向后阅读,申请两个节点(14,15)
  26. 紧接着是一个x,10的inputSet内写入0123……9;链接10和11(使用ccl)
  27. 串联(12,13)和(14,15)

  28. 向后阅读,申请两个节点(16,17)
  29. 重复步骤6-7

  30. 向后阅读,digitmap字符串结束;
  31. 进行并联,将节点12连到节点0上;将节点17链接到节点11上;(完成并联)