Как я могу определить состояние ошибки моего DFA? - PullRequest
1 голос
/ 01 ноября 2019

Шаблон ввода: 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 и сохраняются в двумерной матрице (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 не выполняет повторную инициализацию, где по логике он должен достигать состояния ошибки. Может кто-нибудь сказать мне, где я иду не так?

...