Dove cadono la maggior parte delle implementazioni REGEX nella scala della complessità?


19

Le implementazioni più moderne di espressioni regolari, come quelle in perl o .NET, vanno oltre la classica definizione informatica di REGEX con caratteristiche come lookahead e lookbehind. Queste funzionalità consentono loro di analizzare le istruzioni che non possono essere descritte con un automa finito e senza pushdown? Quanto più vicino al turing completo questo li rende se possono?


2
Una domanda strettamente correlata: abbiamo qualcosa di interessante tra "regexes with backreferences" e "regexes che possono contenere codice di programma arbitrario"? Ad esempio, le regex con backreferences e lookahead / lookbehind sono più espressive delle regex con backreferences ma senza lookahead / lookbehind? Che dire di "Verbi di controllo backtracking speciali" in Perl?
Jukka Suomela,

Risposte:


18

Non penso che il vero problema sia la questione di cosa significhi illimitato; questo non è peggio di qualsiasi altra situazione di analisi.

Il problema risiede nel caratterizzare i riferimenti indietro, che sono sia molto potenti che molto limitati: consentono la descrizione di alcune lingue senza contesto, senza consentire alcune lingue senza contesto. Ad esempio, il regex (a*)b\1b\1corrisponde alle stringhe del modulo anbanban , e puoi usare il lemma di pompaggio per mostrare che questo non è un linguaggio privo di contesto. Tuttavia, d'altra parte, le regex con backreferences non sembrano essere sufficienti per abbinare il linguaggio parentesi bilanciato, che è il linguaggio prototipo senza contesto.

È abbastanza facile dare una semantica denotazionale dicendo che le stringhe in un linguaggio sono regex, ma dare una buona caratterizzazione degli automi-teorici sembra molto più impegnativo. È qualcosa di simile a una macchina di registro, nei cui registri è possibile copiare sottostringhe dell'input e su cui è possibile verificare la stringa corrente, ma per la quale non si ha la possibilità di modificare questi registri.

Le persone che fanno la teoria dei modelli finita hanno un sacco di modelli di macchine funky, e sarebbe interessante sapere se questo corrisponde a uno dei loro modelli.


9

Il problema con la risposta a questa domanda è catturare la nozione di "illimitato" in un'implementazione effettiva. Ad esempio, il regex /(.*)\1/acquisirà la lingua , che non è privo di contesto. In pratica potrebbero esserci dei limiti sullo stack utilizzato (cioè forse w non può essere più lungo di un numero grande K ), che trasformerebbe effettivamente la lingua in L K = { w w | w Σ , w K }L={ww|wΣ}wKLK={ww|wΣ,w∣≤K}, che per ogni fisso è di nuovo un'espressione regolare.K

Ma in linea di principio, le regexps come specificato sono più potenti delle lingue normali, poiché questa domanda correlata discute in modo molto più dettagliato (anche con un esempio ingegnoso).


{Ww | w ∈ Σ ∗, ∣w∣≤K} non sarebbe riconoscibile come CSL o TM ??
Dhruvbird,

Arggh. avrebbe dovuto fare ww ^ R. risolverà. grazie
Suresh Venkat

In realtà, avevo una domanda a riguardo. Ww è un CSL o Turing è riconoscibile? Non ero (ancora) in grado di
inventare

1
{ww:wΣ}

5

Un risultato interessante, tratto da questa altra domanda , collegata anche da Suresh Venkat, è che le regexps "Pratiche" sono NP-complete, e quindi dovrebbero essere equivalenti in potenza a SAT.

Essendo un non esperto, mentre concordo sul fatto che intuitivamente "regexes con backreferences non sembrano essere sufficienti per abbinare il linguaggio delle parentesi equilibrato", sta succedendo qualcosa di strano. La completezza NP implica che qualsiasi problema NP può essere ridotto polinomialmente a una regexp, quindi probabilmente c'è solo una riduzione polinomiale dal linguaggio "parentesi bilanciate" a una riconoscibile con regexps. Ma di nuovo, potrebbe esserci un assurdo regexp per analizzare un CFL, dal momento che possono anche analizzare numeri unari non primi!

Probabilmente, la lezione è che le classi di complessità e le lezioni di lingua non sono comparabili, in generale. Il che suggerisce anche di riformulare la tua domanda, di fare riferimento alla gerarchia di Chomsky piuttosto che alla "scala della complessità" (anche se, per essere onesti, non ne ero confuso).

Charles Stewart scrive:

Aho, 1990, "Algoritmi per trovare schemi nelle stringhe" mostra che il problema dell'appartenenza a linguaggi regolari con backtracking è NP completo.

Un'anteprima parziale (almeno dell'affermazione) è disponibile su Google Libri , a pagina 289, e un riferimento bibliografico al documento è disponibile qui . Si noti che nel documento, rewbr sta per Regular Expression With BackReferences.


3

PCRE, l'implementazione più popolare di "espressioni regolari" implementa anche schemi ricorsivi, che vanno oltre i riferimenti. Una domanda sulla loro complessità è stata posta a Stackoverflow. Secondo la risposta pratica e approfondita di Perl guru brian d foy, questo rende PCRE potente quanto le grammatiche senza contesto. Tuttavia la sintassi è terribile rispetto alla forma di Backus-Naur.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.