В модерировании игры с закрытым исходным кодом я изменяю машинный код во время выполнения до jmp в свой собственный код. Чтобы сделать это в общем виде, я использую сопоставление шаблонов, чтобы найти коды, которые я хочу изменить. (Шаблоны состоят только из символов/байтов и подстановочных знаков, где байты могут меняться.) Путем построения детерминированного конечного автомата из всех моих шаблонов я могу искать в линейном времени.Может ли компилятор правильно вычислить DFA из регулярного выражения?
Однако я обнаружил, что для создания DFA требуется больше времени, чем при его запуске, особенно в отладочных сборках (что я, конечно, хочу, во время разработки), и это только ухудшится, когда я добавлю больше шаблонов. Но это легко можно было сделать в автономном режиме. Я сейчас думаю о том, как; может ли компилятор сделать это?
Насколько я знаю, это невозможно с функциями constexpr
, поскольку я не могу выделить им статическую память. Но у меня есть смутное ощущение, что это должно выполняться безопасным типом с мета-программированием шаблонов. Или я могу столкнуться с ограничениями при рекурсии при создании автоматов с сотнями или тысячами государств?
И независимо от технической возможности, разумно ли это? Или я должен, скажем, рассчитать исходный файл на отдельном этапе сборки?
Другое дело: вы можете создать DFA для регулярного выражения с помощью специального инструмента, который вы пишете и сериализуете его в некоторый двоичный файл. Затем во время выполнения вам просто нужно импортировать DFA вместо того, чтобы строить его с нуля. Он должен быть быстрее, чем просто строить DFA во время выполнения. – bialpio
Я предполагаю, что я просто незнаю, но почему DFA, построенный во время компиляции, и зная, что его размер потребует распределения памяти? Конечно, каждая конструкция будет иметь другой тип, но это не должно быть проблемой. Я подозреваю, что глубина рекурсии является более вероятным ограничением (хотя я не пробовал создавать DFA во время компиляции). –
Я не уверен, действительно ли он генерирует DFA или NFA, но [Boost Xpressive] (http: //www.boost.org/doc/libs/1_57_0/doc/html/xpressive.html) (только для одного примера), по крайней мере, преобразует регулярное выражение в * некоторый * вид FSM во время компиляции (а также ряд других аналогичных вещей) , –