POSIX BRE può esprimere tutte le lingue regolari?


13

Sembra che le "Espressioni regolari di base" come definite da POSIX.1-2008 non supportano l'alternanza a|b(sebbene alcune implementazioni grep riconoscano la versione con escape, \|).

Dato che le lingue normali sono chiuse in unione per definizione, ciò significa che POSIX BRE ha meno potere espressivo di un automa finito? O c'è un modo per simulare l'alternanza usando altri costrutti?

Risposte:


17

In effetti il ​​linguaggio POSIX BRE non può esprimere tutte le espressioni regolari perché manca di alternanza. Non può nemmeno riconoscere tutte le lingue finite, figuriamoci tutte le lingue normali.

Ad esempio, non è riconoscibile come BRE. Per dimostrarlo, considera quale potrebbe essere la forma sintattica di livello superiore:{ab,ba}

  • Non può essere una delle forme a carattere singolo poiché la lingua ha parole di lunghezza .>1
  • Non può essere perché corrisponderebbe alla stringa vuota.R
  • Non può essere se non con m = n = 1 (nel qual caso torniamo al problema originale) perché corrisponderebbe a stringhe di diversa lunghezza o stringa vuota.R{m,n}m=n=1
  • Quindi deve essere concatenazione: . Ora considera come viene riconosciuta una b : R1R2ab
    • Se riconosce un b allora R 2 non deve riconoscere niente altro che la stringa vuota. Quindi R 1 deve riconoscere { a b , b a } e torniamo al problema originale.R1abR2R1{ab,ba}
    • Se riconosce a ma non a b, allora R 2 deve riconoscere b . Ma poi R 1 R 2 riconosce tutte le parole della forma u b dove R 1 riconosce u , quindi R 1 non deve riconoscere altro che a . Non c'è modo di riconoscere b a .R1aabR2bR1R2ubR1uR1aba
    • Se non riconosce né a ba, l'unico modo per R di riconoscere una b è se R 1 riconosce la stringa vuota, nel qual caso torniamo al problema originale come sopra, ma per R 2 questa volta.R1abaRabR1R2

Quando "torniamo al problema originale", ciò significa che l'unica soluzione per trovare un BRE riconosce la lingua è quella di trovare un BRE più piccolo che abbia la stessa proprietà. Questa è una discesa infinita , quindi non c'è BRE che abbia la proprietà desiderata.

Non penso che ci sia una "simpatica" caratterizzazione di linguaggi riconoscibili BRE, ad esempio come lingue riconoscibili da una "simpatica" classe di automi.

Si noti che le lingue riconoscibili da BRE non sono in realtà una sottoclasse di lingue normali, poiché i riferimenti secondari aggiungono potere espressivo. Ad esempio è riconosciuto dal BRE ma notoriamente non è regolare. BRE senza backreferences è solo zucchero sintattico rispetto alle espressioni regolari, quindi le lingue che possono riconoscere sono una sottoclasse delle lingue normali.{www{a,b}}\(.*\)\1


1
Se stai usando uno strumento come grep in grado di accettare più espressioni separate da una nuova riga, sta prendendo il prodotto cartesiano di tutte le possibili alternative (es. {Ab, ba} {ab, ba} diventando {abba, abba, baab, baba}) sufficiente per essere equivalente a qualsiasi data "BRE-plus-alternation" e quindi a qualsiasi linguaggio regolare?
Casuale 832,

1
@ Random832: prova a fare (abc|bac)*.
rici,
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.