用Pike VM实现正则表达式分组捕获时为啥只需要保留一条thread

刚刚在stackoverflow上描述问题时,写着写着突然想通了,于是便来回答自己的提问:正则表达式中没有用到backreference,即submatching对后面的状态不影响,自动机的所有状态是固定的,既然不同的thread能同时运行至相同状态,即所有这些thread往后同时经历的状态都是相同的,假如当中有一条失配则全部失配,若有一条匹配则全部匹配,且匹配结果完全相同,不同thread之间只有submatching不同,相当于(ab)b与(a)(bb)的区别,而我们只需要得到一种submatching,所以只保留一条thread
■网友
VM 匹配其实本质上和 NFA 模拟是相同的,再深入一点,其实二者都是宽度优先的图遍历算法,其中用 state 的 listid/pc 是否等于当前的那个 listid/pc 来作为普通宽度优先搜索中的 color/is_visited 判断(这里不需要区分黑白灰三种情况,只有黑白两种)。


    推荐阅读