Quali lingue riconoscono le espressioni regolari compatibili con Perl?


23

Come dice il titolo, ho trascorso un paio d'ore lo scorso fine settimana cercando di concludere la classe di linguaggi corrispondenti alle espressioni regolari compatibili con Perl, escludendo qualsiasi operatore di corrispondenza che consenta di eseguire codice arbitrario all'interno del modello .

Se non sai cosa sono i PCRE, leggi questo e questo .

Il problema è che le risorse disponibili su Internet si fermano praticamente in lingue senza contesto e i PCRE possono corrispondere a più di quelli (vedi sotto); ma non so davvero dove trovare altri teoremi o documenti su questo tipo di cose.

In particolare: i PCRE sono ovviamente un superset di lingue regolari (poiché la sintassi PCRE ha tutti gli operatori linguistici regolari).

Qualsiasi CFG può essere messo nella forma normale di Greibach, che rimuove la ricorsione sinistra. Penso che questo possa essere usato per mezzo di (?(DEFINE)...)gruppi per "tradurre" la grammatica in corrispondenti subroutine, evitando di soffocare sulla ricorsione sinistra, traducendo:

  • il non terminale alla testa di ogni produzione diventa una subroutine (?<HEAD>...)
  • il corpo di ogni produzione viene inserito nella subroutine; i terminali sono lasciati così come sono, i non terminali diventano invocazioni di procedure (cioè (?&NONTERMINAL));
  • tutte le produzioni con lo stesso non-terminale della testa sono OR insieme per mezzo |dell'operatore (più un ulteriore raggruppamento con (?:...), se necessario)
  • il modello diventa quindi un (?(DEFINE)...)gruppo contenente tutte le produzioni "tradotte" e un richiamo per la procedura del simbolo iniziale, per abbinare l'intera stringa, ovvero^(?(DEFINE)...)(?&START)$

Questo dovrebbe riguardare qualsiasi CFG. Pertanto, i PCRE dovrebbero essere in grado di abbinare qualsiasi CFL.

C'è di più: prendiamo il linguaggio semplice ovvero la lingua delle stringhe ripetuta due volte. Questo linguaggio non è un CFL - il lemma di pompaggio per i CFL fallisce. (Prestare particolare attenzione a che | v x w |p deve essere mantenuto, quindi non si può semplicemente pompare l'inizio o la fine delle due stringhe ripetute.)

L={ww|wΛ*}
|vXw|p

Tuttavia, questo linguaggio è facilmente accompagnata da un PCRE: ^(.*)\1$. Pertanto, siamo rigorosamente al di sopra dei CFL.

Quanto sopra? Bene, come ho detto, non ne ho idea. Non sono riuscito a trovare risorse sulle CSL o su tutte le altre classi intermedie per prendere una decisione. Qualche esperto disposto a discuterne?

Addendum: mi è stato chiesto di specificare esattamente quale sottoinsieme della sintassi PCRE deve essere consentito. Come ho scritto all'inizio del post, volevo escludere qualsiasi operatore che consentisse di eseguire codice arbitrario all'interno del modello, come ad esempio ??{}.

Per amor dell'argomento, penso che possiamo attenerci alla sintassi definita dalla pagina man pcresyntax (3) , che è un sottoinsieme ragionevole di ciò che offre Perl 5.10-5.12, meno i callout (poiché non sono all'interno del modello). Non sono sicuro che l'aggiunta o la rimozione di verbi di controllo di backtracking cambi la lingua che possiamo riconoscere; in tal caso, sarebbe bello capire quali classi prenderemo con e senza quelle.


2
Includi la definizione di PCRE che hai scelto nella tua domanda, poiché è cambiata tra le versioni. Le reali regex del Perl possono contenere codice Perl arbitrario, rendendole Turing complete.
Gilles 'SO- smetti di essere cattivo'

Ho aggiunto una nota alla fine, spero che questo punto sia più chiaro.
peppe,

Risposte:


7

Ho anche trovato questo post sul blog estremamente interessante http://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.html . Fornisce la stessa prova che ho dato in precedenza sul fatto che regexps riconosce i CFL (riscrivendo la grammatica attraverso i DEFINEblocchi) e persino alcuni CSL (come il linguaggio delle stringhe ripetute); si basa su questo e continua, fornendo una prova che regexps con backreferences sono NP-hard (riducendo il 3-SAT a regexp).


2
Quando l'autore dice "NP-complete" dovrebbero dire "NP-hard". Non forniscono alcuna prova del fatto che la classe di linguaggi PCRE sia contenuta in NP.
András Salamon,

È vero, è anche notato nei commenti.
peppe,

5

Decidono al massimo le lingue sensibili al contesto (che, come lei sottolinea, è un superset delle lingue senza contesto). Vedi questo post sui monaci perl .

L'intuizione di base è che la "memoria" della macchina è il numero di gruppi di acquisizione, che è limitato in modo lineare.


5
L'argomento che fornisci nel secondo paragrafo spiega perché PCRE non può accettare più di CS, ma non perché questa inclusione sia esatta (cosa che suggerisci nel tuo primo paragrafo). Non sembra nemmeno che l'articolo collegato ne abbia dato una prova.
Raffaello

Bene, non puoi raggruppare più di quello che c'è nella stringa di input e il numero di gruppi è fissato in un dato modello, quindi hai un limite superiore (lineare) alla memoria che usa un modello. Tuttavia, mi manca una prova formale di un PCRE -> trasformazione dell'automa lineare limitato ...
peppe

Sì, voi due avete ragione. Ho modificato la risposta.
Xodarap,

Vedi anche perlmonks.org/?node_id=406253 per una discussione precedente.
András Salamon,
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.