Le espressioni regolari non lo sono


36

Chiedi anche a qualcuno con un background nell'informatica quale sia un'espressione regolare e la risposta probabilmente andrà oltre il vincolo di essere alla portata di un automa a stati finiti.

Ad esempio, l '"espressione regolare"

/^1?$|^(11+?)\1+$/

creato dalla nota personalità del Perl Abigail (e parte della suite di test del Perl dal 2002) descrive una macchina che accetta solo numeri unari compositi, ma l' esercizio 4.5 (b) nella terza edizione di An Introduction to Formal Languages ​​and Automata di Peter Linz ha l'uso del lettore il lemma del pompaggio per dimostrarlo

L={un'n:n ioS not un' priome numBer}

non è una lingua normale.

In contesti in cui la distinzione è importante, come dovremmo chiamare espressioni strettamente più potenti?

Risposte:


46

Larry Wall ha proposto di usare "espressione regolare" per il formalismo proposto da Kleene e "regex" per espressioni per le estensioni ampiamente utilizzate. È una convenzione abbastanza ampiamente seguita. Se vuoi chiarire che stai parlando di espressioni regolari nel senso delle lingue formali, di solito non è difficile tradurre in parlare di lingue regolari.

Il potere dei regex deriva dal backtracking e sono stati fatti lavori sugli automi per le lingue regolari con backtracking. Vedi, in particolare, Becchi & Crowley, 2008, Estensione degli automi finiti per abbinare in modo efficiente le espressioni regolari compatibili con Perl .


5
Sono d'accordo, qualcosa come "Perl regex" ("POSIX regex", ecc.) Vs. "linguaggio normale" dovrebbe essere abbastanza chiaro da prevenire qualsiasi possibilità di interpretazione errata.
Jukka Suomela,

Le regex del Perl hanno molte più funzioni aggiuntive rispetto al semplice backtracking.
reinierpost,

@reinierpost Vero, ma penso che il backtracking sia il più importante dal punto di vista dei linguaggi formali. Le regex di Perl hanno caratteristiche come l'esecuzione di codice Perl arbitrario, ma penso che le regex debbano essere interpretate liberamente come copertura dei PCRE. I PCRE contengono stranezze come schemi ricorsivi, ma si tratta di arti oscure che ti portano molto al di fuori del regno delle lingue normali. Potrei aggiornare la mia risposta per coprire questi, però.
Charles Stewart,

18

Queste espressioni sono state esaminate da Aho (Handbook of Theoretical Computer Science, Vol. A, Chp. 5) e Campeanu, Salomaa, Yu ("Uno studio formale di espressioni regolari pratiche", International Journal of Foundations of Computer Science, 14: 1007 –1018, 2003), nonché alcuni documenti di follow-up.

Aho chiama le espressioni più potenti "rewbr" (espressione regolare con riferimenti secondari), Campeanu et al. usa "espressione regolare estesa" e "espressione regolare pratica". A quanto pare, "espressione regolare estesa" è il termine più comunemente usato nella letteratura recente.

Basandomi sul termine "espressione razionale" della scuola francese, e considerando il fatto che quelle espressioni sono usate nel mondo reale, mi piace "espressione reale".

Addendum: un capitolo della mia tesi di dottorato si occupa di questa classe di linguaggi formali (l'articolo corrispondente dovrebbe apparire allo STACS 2011). Mentre scrivevo quel capitolo e l'articolo, ho sperimentato vari termini. Alla fine, ho deciso di utilizzare espressioni regolari estese per il modello con riferimenti indietro e espressioni regolari adeguate per le espressioni regolari normali e gradevoli. Poiché è abbastanza fastidioso cambiare la terminologia in un documento che è già completamente (o principalmente) scritto, penso che alcuni potrebbero essere interessati alle esperienze che hanno portato alla mia scelta:

In primo luogo, regex e rewbr non riescono davvero a muovere la lingua, e usarli ancora e ancora nel corso di un intero documento è diventato davvero noioso da scrivere e leggere, in particolare quando si utilizza una delle possibili forme plurali. Anche le espressioni regolari tipo PERL erano piuttosto ingombranti. Certo, non sono madrelingua, quindi YMMV.

In secondo luogo, non appena si vuole parlare di entrambi i modelli, è conveniente usare termini che sono una variazione dell'espressione regolare , in quanto ciò consente di enfatizzare la somiglianza o le differenze secondo necessità (ad esempio, "un'espressione regolare, sia essa corretta o esteso "). Inoltre, ciò consente di enfatizzare facilmente il caso speciale di "espressioni regolari estese senza riferimenti arretrati", quando si parla di casi speciali nell'intera classe, anziché confrontare diversi modelli.

In terzo luogo, ho preferito usare un termine che è già usato in letteratura su un termine appena coniato, che mi ha lasciato la scelta tra espressioni regolari estese ed espressioni regolari pratiche . La seconda scelta implicava (almeno implicitamente) che le espressioni regolari appropriate sono in qualche modo poco pratiche, il che sembrava piuttosto strano (specialmente perché RE2 di Google non usa backref e sembra essere abbastanza pratico).

Naturalmente, questa scelta è solo il mio "massimo personale locale" e, a seconda delle esigenze, altre scelte potrebbero essere più appropriate.


7
Sfortunatamente, il termine espressione regolare estesa è già assunto da POSIX, che distingue tra espressione regolare di base (BRE) ed espressione regolare estesa (ERE) , entrambe le quali sono espressioni regolari estese secondo la tua definizione.
Jörg W Mittag,

@Jörg: in realtà secondo questo né le espressioni regolari POSIX estese né quelle di base sono più potenti delle espressioni regolari regolari. E il BRE puro (non GNU) sembra effettivamente essere meno potente delle espressioni regolari (manca un operatore di alternanza).
sepp2k,

Vedere "Sulle espressioni regolari estese" di Carle e Narendran (2009) per i risultati più recenti su questo "rewbr": portal.acm.org/citation.cfm?id=1533235
Jakob

Ulteriori risultati recenti su questa classe linguistica: "Sull'intersezione delle lingue regex con le lingue regolari" di Campeanu e Santean (TCS 410, 2009) "Un test di corrispondenza temporale polinomiale per grandi classi di espressioni regolari estese" di Reidenbach e Schmid (CIAA 2010 ) e "Extended Regular Expressions: Succinctness and Decidability" (a mio avviso, apparirà allo STACS 2011).
Dominik D. Freydenberger,

6

È noto che il cosiddetto regexp di perl è abbastanza potente da essere Turing completo; c'è persino un compilatore dal solito programma a perl regexp.

Quindi dubito che abbia senso cercare un nome per questo tipo di "regexps".

Guarda ad esempio http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm


Hai qualche puntatore?
András Salamon,

5
@ András: Penso che Arthur stia parlando della ?{CODE}direttiva di Perl , che consente alle espressioni pattern di intercalare il codice del programma in espressioni regolari. Comprendo che i PCRE sono generalmente definiti come la parte "dichiarativa" della lingua, l'intera lingua viene chiamata la lingua modello. Secondo WP, Aho, 1990, "Algorithms for find pattern in string" mostra che il problema dell'appartenenza a linguaggi regolari con backtracking è NP completo. Non ci sono altre caratteristiche difficili per i PCRE dichiarativi.
Charles Stewart,

Ho aggiunto il link; Non ho guardato il codice sorgente, quindi non so davvero come funzioni e se ci sono prove che la compilazione sia davvero corretta.
Arthur MILCHIOR,

1
Ci dispiace, ma secondo il tuo argomento, dato che lambda-calculus è Turing-completo, non ha senso cercare un nome per esso. Lo stesso per tutti gli altri formalismi e linguaggi di calcolo completi di Turing. Più precisamente, la completezza di Turing non descrive quanto sia espressiva una lingua, quindi non ha senso identificare le lingue solo perché sono complete di Turing. Il mio esempio sul lambda-calcolo era ovviamente estremo.
Blaisorblade,

2

Penso che il termine migliore per "espressione regolare nel contesto degli automi" sia "espressione razionale", come usato, diciamo, in Elements of Automata Theory di Sakarovitch, o nel Manuale degli automi ponderati.


1
Non molto usato, IMHO.
Blaisorblade,

È / è / ampiamente usato nella teoria degli automi ponderati, vedi en.wikipedia.org/wiki/Rational_language . L'ho visto un sacco di volte anche nel campo delle lingue rispetto ai gruppi.
Michaël Cadilhac,

1

Date le altre risposte, suggerirei che le "lingue regolari" sono sicure e, dopo aver brevemente osservato la differenza, parlare di "espressioni regolari pratiche" per regex (con backtracking).

Si noti inoltre che la stessa regexp, come espressioni regolari e pratiche, può avere una semantica diversa, poiché in quest'ultimo caso la semantica è definita in termini di backtracking, con risultati diversi. I dettagli sarebbero fuori tema, ma risponderò se farai un'altra domanda su questo (forse su SO piuttosto che qui, non so) e avvisami attraverso un commento.


0

Potremmo chiamarli espressioni modello . Ciò potrebbe introdurre confusioni con i linguaggi di pattern, ma almeno questi sono meno comuni.


2
In linea di principio, sono d'accordo con il tuo ragionamento, ma Campeanu, Santean e Yu hanno già usato il termine espressioni modello per indicare una classe simile di linguaggi con una definizione "più pulita" (vedi "Espressioni modello e automi modello", IPL 92 (2004 ).
Dominik D. Freydenberger
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.