Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
С точки зрения регулярных выражений задача проста — ищем во входной строке подстроку «ACDA».Если ваша задача звучит именно таким образом, то не очень понятно, зачем вам здесь регулярные выражения или собственная реализация конечного автомата. Задача поиска подстроки в строке является классической, известно множество алгоритмов её решения, в вашем случае, если строка-образец действительно такая короткая, подойдет тривиальный алгоритм, работающий за O(nm), где n — длина строки, в которой ищем, а m — длина образца.
Если экономить память — то нужно хранить последние m символов в кольцевом буфереНе обязательно, можно банально каждый раз сдвигать символы на 1 элемент влево. Вообще, если дело обстоит так, как вы описали выше, и у вас всего 4 возможных символа, то любую строку длины 4 можно представить просто числом от 0 до 15 и сравнение строк свести к сравнению двух чисел.
В принципе всё это решаемо, но по итогам я подумал что собственный ДКА будет компактнее.Мне кажется, тут вы ошиблись, тривиальный алгоритм займет меньше строк, чем одно лишь описание автомата для вашей строки.
Не обязательно, можно банально каждый раз сдвигать символы на 1 элемент влево. Вообще, если дело обстоит так, как вы описали выше, и у вас всего 4 возможных символа, то любую строку длины 4 можно представить просто числом от 0 до 15 и сравнение строк свести к сравнению двух чисел.Это уже посоветовали в комментариях ниже.
Нет ничего такого что регулярные выражения не могли бы сделать хуже.
BEGIN_STATE_MASHINE(SM_Name)
ADD_BRANCH(OldState, Event, NewState, CallBack)
END_STATE_MASHINE(SM_Name)
Двумерный массив переходов — оригинально :)
current_signal = getSignal();
current_state = (current_state&0xffffffff << 8) + current_signal;
if (current_signal==valid_state)
// установлено нужное состояние
if (DEBUG_ECHO && (debug_flags & DEBUG_ECHO)) полностью эквивалентна более компактной if (debug_flags & DEBUG_ECHO)?читаем символ, если он А и стейт «начало», идем в стейт «ждем С». Читаем символ, если он С — идем в стейт «ждем D», иначе откатываемся в начало
иначе откатываемся в начало
switch (argument)
{
case 0x10: ... break;
case 0x20: ... break;
case 0x50: ... break;
default: ...
}
switch (argument >> 4)
{
case 0x1: ... break;
case 0x2: ... break;
case 0x5: ... break;
default: ...
}
...
int start();
int state1();
int stateN();
...
parse = &TParser::start;
...
while( getByte() != END){
if((this->*parse)() < 0)
break;
}
if (blah-blah-blah) {// коммент
GOTO_STATE(POWER_OFF);
} else if (nah-nah-nah) {// коммент
GOTO_STATE(POWER_ON);
}
или наплодить состояний, оптимизировать автомат и потом пытаться понять, что же там не взлетело
а если надо вывод сделать в половине состояний? А в другой половине состояний писать в UART?
Конечный автомат (он же машина состояний) на чистом С