如何检测DFA的错误状态?

时间:2019-11-01 10:31:08

标签: java logic dfa

输入模板:0+ [0-9] +1 +

输入事件:A,B,C

输入字符串:C7584A7584AC7584A

我试图在输入字符串中找到所有模式(遵循模板)。 “ 0+”和“ 1+”是占位符,可以是事件(A,B,C)中的任何字母。因此模式可以是A + [0-9] + A +,A + [0-9] + B +,A + [0-9] + C +,B + [0-9] + A +,B + [0-9] + B +, B + [0-9] + C +,C + [0-9] + A +,C + [0-9] + B +,C + [0-9] + C +。所有这些正则表达式都对应于DFA,并存储在2D矩阵(3行x 3列)中。

每次找到样式时,都会记录该样式的计数器。同样,每次使用输入字符串中的元素时,DFA只会提供当前状态是否成功。

for (int i = 0; i < input.length; i++) {
            int _index = this.events.indexOf((char) input[i]);

            if (_index == -1) {
                for (int j = 0; j < this.events.length(); j++) {
                    for (int k = 0; k < this.events.length(); k++) {
                        dfaMatrix[j][k].startTraversal(input[i]);
                        dfaMatrix[k][j].startTraversal(input[i]);
                    }
                }
            } 
            else {
                for (int j = 0; j < this.events.length(); j++) {
                    dfaMatrix[_index][j].startTraversal(input[i]);
                    dfaMatrix[j][_index].startTraversal(input[i]);

                    if (dfaMatrix[_index][j].isSuccess()) {
                        count[_index][j] += 1;
                        flag = true;
                        break;
                    } else if (dfaMatrix[j][_index].isSuccess()) {
                        count[j][_index] += 1;
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                    for (int k = 0; k < this.events.length(); k++) {
                        for (int m = 0; m < this.events.length(); m++) {
                            dfaMatrix[k][m].reinitialize();
                            dfaMatrix[m][k].reinitialize();
                        }
                    }
                    flag = false;
                    for (int j = 0; j < this.events.length(); j++) {
                        dfaMatrix[_index][j].startTraversal(dfaMatrix[_index][j].getDfat(), input[i]);
                        dfaMatrix[j][_index].startTraversal(dfaMatrix[j][_index].getDfat(), input[i]);
                    }
                }
            }
        }

我的预期结果是:

[A][A] : 1
[A][B] : 0
[A][C] : 0
[B][A] : 0
[B][B] : 0
[B][C] : 0
[C][A] : 2
[C][B] : 0
[C][C] : 0

但是我得到了

[A][A] : 2
[A][B] : 0
[A][C] : 0
[B][A] : 0
[B][B] : 0
[B][C] : 0
[C][A] : 1
[C][B] : 0
[C][C] : 0

出于某种原因,当DFA使用第二个C时,DFA不会在逻辑上应该到达错误状态的地方重新初始化。谁能告诉我我要去哪里错了?

0 个答案:

没有答案