From 94c5765bec23cbaab698cae3782eb22b700a195c Mon Sep 17 00:00:00 2001 From: DanilaKn Date: Fri, 10 Nov 2023 20:43:18 +0300 Subject: [PATCH] =?UTF-8?q?(#290)=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D0=BC=20=D0=A2=D0=BE=D0=BC=D0=BF=D1=81=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82=D1=80=D0=B8=D1=86=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/Objects/src/Regex.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libs/Objects/src/Regex.cpp b/libs/Objects/src/Regex.cpp index dbc91a0f..4d473dd4 100644 --- a/libs/Objects/src/Regex.cpp +++ b/libs/Objects/src/Regex.cpp @@ -131,6 +131,8 @@ pair, int> Regex::get_thompson(int max_index) const { pair, int> al; // для левого автомата относительно операции pair, int> ar; // для правого автомата относительно операции Language* alp; // Новый язык для автомата + FiniteAutomaton fa; // автомат для отрицания, строится обычный томпсон и перется дополнение + switch (type) { case Type::alt: // | al = Regex::cast(term_l)->get_thompson(max_index); @@ -272,8 +274,20 @@ pair, 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};