分析
例如:
char *originalInput = "[23-9#][3-8]xx6 | [1234]xx";
如果输入是一个字符串的话,首先需要对这个字符串进行分析
在DigitMap匹配规则下,无非存在四种状态:
- 不匹配(起始状态,也可能是最终状态) 第四期望
- 部分匹配(可能的最终状态) 第三期望
- 超时匹配(可能的最终状态) 第二期望
- 完全匹配(可能的最终状态) 第一期望
对字符串进行分析
DigitMap是没有所谓通配符的,X或者x仅仅代表统配数字,而并不符合#*等DTFM字符
NFA生成
第一部分:[23-9#][3-8]xx6x
token读入第一个字符
- 生成一个起始节点;用于并联,节点0;
- 生成两个节点(节点1,节点2),起始节点和结束节点指针指分别指向他们;
- “[“,它表示一个Rnage
- 向后阅读查看在下一个”|”到来之前,是否出现过”]”,如果出现过,那么在语法上首先是说得过去的,否则就要返回error,这个规则从语法上就是错误的
- 进行了检查之后,先后生成规则
- 读取后一位内容,添加入inputSet中;(假设后一位不是”-“)
- 读取后一位内容,添加入inputSet中;(假设后一位不是”-“)
- 读取后一位内容,发现是”-“,进行处理:
- 检查”-“的前后是否为数字,如果前后有一方不是数字,则返回error,这不是一个正确的范围
- 如果检查通过,则使用循环,将范围中的数据都添加到inputSet中;
- 读取后一位内容,添加入inputSet中;(假设后一位不是”]”)
- 读取后一位内容,(假设后一位是”]”),表示这个范围结束,向后进行
- 在向后进行之前,首先需要构建 一条边和 一个指针
- 说明:边是匹配规则,也就是上文中的inputSet;
- 说明:指针是指向下一个节点的,作用是建立连接,在DigitMap匹配规则中,一个节点指向外侧的边数量并没有限制;因此需要一个类似于 链表 的结构,可扩展的去存储某个节点指向外侧的边
- 令:当前这个指针名叫next1;
- 让next1->当前的结束节点
- 向后阅读字符,再次申请两个节点(节点3,节点4),代表新一轮的起始节点和结束节点;
- 节点3的inputSet中也是一个范围字符集,重复对第一个范围的操作;然后让节点3的next->节点4;
- 串联(节点1,节点2)和(节点3,节点4);节点1-(ccl)->节点2-(epsilon)->节点3-(ccl)->节点4
- 继续向下进行,首先还是创建两个节点,节点5,节点6
- 下一个规则是”x”这也是一个CCL,节点5的inputSet应当是0123…9
- 节点5和节点6通过ccl链接起来;然后再和之前的内容串联;
- 继续向下,又是一个x,按照12-14步进行
- 继续向下,单字符匹配规则;
- 申请两个节点(7,8)
- 节点7的edge=”6”;通过这个”6”链接到节点8;
- 又是一个x,按照12-14步骤处理
- 向下阅读,发现了第一部分结束了,抛弃空格,在阅读到”|”之后;进入下一部分的阅读,此时需要将节点1连接到节点0上面,申请一个新的节点11,将节点11链接到节点10上;( 为了实现并联 )
-
第二部分:[1234]xx
申请节点(12,13)
- 阅读第一个(相对而言….)字符;是一个范围的起始符号
- 格式检查,如果没有通过直接返回error
- 如果通过,则节点8的inputSet挨个写进去1,2,3,4;链接8和9(使用ccl)
- 向后阅读,申请两个节点(14,15)
- 紧接着是一个x,10的inputSet内写入0123……9;链接10和11(使用ccl)
- 串联(12,13)和(14,15)
- 向后阅读,申请两个节点(16,17)
- 重复步骤6-7
- 向后阅读,digitmap字符串结束;
- 进行并联,将节点12连到节点0上;将节点17链接到节点11上;(完成并联)
