Nel modding di un gioco a codice chiuso sto modificando il codice macchina in fase di esecuzione su jmp nel mio codice. Per fare questo in modo generico sto usando la corrispondenza dei modelli per trovare le posizioni del codice che voglio modificare. (I pattern consistono solo di caratteri/byte e caratteri jolly in cui i byte possono variare.) Costruendo un automa finito deterministico da tutti i miei schemi posso cercare in tempo lineare.il compilatore può calcolare facilmente un DFA da un'espressione regolare?
Tuttavia, ho scoperto che la creazione di DFA richiede più tempo rispetto all'esecuzione effettiva, in particolare nelle build di debug (che sicuramente desidero durante lo sviluppo) e peggiorerà solo quando aggiungo altri pattern. Ma questo potrebbe facilmente essere fatto offline. Attualmente sto pensando al come; può farlo il compilatore?
Per quanto ne so è impossibile con le funzioni constexpr
poiché non posso allocare memoria statica con esse. Ma ho la vaga sensazione che dovrebbe essere fattibile in un modo sicuro dal tipo con la meta-programmazione modello. O sono propenso a incorrere in limiti di ricorsione nella creazione di automi con centinaia o migliaia di stati?
E indipendentemente dalle possibilità tecniche, è ragionevole? O dovrei piuttosto, per esempio, calcolare un file sorgente in una fase di compilazione separata?
Un'altra cosa da considerare: è possibile creare DFA per l'espressione regolare mediante lo strumento personalizzato che si scrive e serializzarlo su un file binario. Quindi, in fase di esecuzione, dovrai solo importare DFA invece di crearlo da zero. Dovrebbe essere più veloce della semplice creazione di DFA in runtime. – bialpio
Immagino di essere solo ignorante, ma perché un DFA dovrebbe essere compilato in fase di compilazione e conoscere le sue dimensioni richiederebbe un'assegnazione di memoria? Certo, ogni costruzione produrrebbe un tipo diverso ma questo non dovrebbe essere un problema. Sospetto che la profondità di ricorsione sia il vincolo più probabile, tuttavia (non ho provato a creare un DFA durante la compilazione). –
Non sono sicuro che generi effettivamente un DFA o un NFA, ma [Boost Xpressive] (http: //www.boost.org/doc/libs/1_57_0/doc/html/xpressive.html) (per un solo esempio) converte almeno un'espressione regolare in * some * sort of FSM in fase di compilazione (e un certo numero di altre cose simili) . –