Skip to content

Commit

Permalink
(#290) реализовал алгоритм Томпсона для отрицания
Browse files Browse the repository at this point in the history
  • Loading branch information
dak151449 committed Nov 10, 2023
1 parent 713c8f3 commit 94c5765
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion libs/Objects/src/Regex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ pair<vector<State>, int> Regex::get_thompson(int max_index) const {
pair<vector<State>, int> al; // для левого автомата относительно операции
pair<vector<State>, int> ar; // для правого автомата относительно операции
Language* alp; // Новый язык для автомата
FiniteAutomaton fa; // автомат для отрицания, строится обычный томпсон и перется дополнение

switch (type) {
case Type::alt: // |
al = Regex::cast(term_l)->get_thompson(max_index);
Expand Down Expand Up @@ -272,8 +274,20 @@ pair<vector<State>, int> Regex::get_thompson(int max_index) const {
s.push_back(State(1, {}, str, true, p));

return {s, max_index + 2};
case Type::negative:
// строим автомат для отрицания
fa = FiniteAutomaton(0, Regex::cast(term_l)->get_thompson(-1).first, Regex::cast(term_l)->alphabet);
fa = fa.determinize();
// берем дополнение автомата
fa = fa.complement();
// нумеруем состояния
for (int index = 0; index < fa.states.size(); index++) {
fa.states[index].identifier = "q" + to_string(max_index);
max_index++;
}
// возвращаем состояния и макс индекс
return {fa.states, max_index};
default:

str = "q" + to_string(max_index + 1);
// m[char_to_alphabet_symbol(value.symbol)] = {1};
m[value.symbol] = {1};
Expand Down

0 comments on commit 94c5765

Please sign in to comment.