Esiste un algoritmo di analisi CFG non generale che riconosce EPAL?


23

EPAL, il linguaggio anche dei palindromi, è definito come il linguaggio generato dalla seguente inequivocabile grammatica senza contesto:

Sun'un'

SBB

Sun'Sun'

SBSB

L'EPAL è la 'rovina' di molti algoritmi di analisi: non ho ancora incontrato alcun algoritmo di analisi per CFG inequivocabili in grado di analizzare qualsiasi grammatica che descriva il linguaggio. Viene spesso usato per mostrare che ci sono CFG inequivocabili che non possono essere analizzati da un particolare parser. Questo ha ispirato la mia domanda:

Esiste un algoritmo di analisi che accetta solo CFG non ambigui che funziona su EPAL?

Ovviamente, si può progettare un parser ad hoc a due passaggi per la grammatica che analizza la lingua in tempo lineare. Sono interessato a analizzare i metodi che non sono stati progettati specificamente per EPAL.


1
Ho quasi paura di chiedere: cosa c'è che non va in LL (1) nella discesa ricorsiva?
Raffaello

3
La discesa ricorsiva senza backtrack non può gestire EPAL poiché la lingua non è LL (k) per nessun k. La discesa ricorsiva con il backtracking può gestire la grammatica nel tempo O(n2) , ma questo è un algoritmo generale con comportamento esponenziale nel caso peggiore, che non è quello che sto cercando.
Alex ten Brink

O(N2) non è esponenziale, è quadratico. è esponenziale. O(2N)
Victor Stafusa,

1
@Victor: il backtracking ha un comportamento esponenziale su alcune grammatiche, ma non su questa grammatica particolare. Tuttavia, essendo un algoritmo che funziona su grammatiche ambigue, lo sconta come una risposta alla mia domanda.
Alex ten Brink

1
@jmad: il mio intento non è di analizzare il linguaggio (puoi farlo in modo banale in tempo lineare), ma piuttosto di soddisfare la mia curiosità: l'ho visto essere usato come esempio di un linguaggio che non può essere analizzato da un metodo di analisi così tante volte che sono curioso di sapere se esiste un metodo di analisi che lo riconosce.
Alex ten Brink

Risposte:


14

Considera il seguente schizzo di una strategia di analisi a tuo rischio e pericolo.

Invece di leggere l'input solo da un'estremità, leggiamo da entrambi i lati e cerchiamo le regole corrispondenti. Possiamo farlo in uno stile di discesa ricorsivo; in una chiamata ad , trova il prefisso w e il suffisso v sull'input in modo che esista una regolaA()wv , scendi a B ( ) sulla parola rimanente. Se non esiste una regola corrispondente, rifiuta la parola.AwBvB()

Questo algoritmo analizza tutte le grammatiche lineari e non ambigue. Ci vuole tempo lineare se tutte le coppie di regole e A w B v hanno w p w o v s vAwBvAwBvwpw ¹. Questo include EPAL. Altrimenti dobbiamo guardare avanti, quindi potremmo impiegare Θ ( n 2 ) tempo.vsvΘ(n2)

L'idea non funziona affatto per le grammatiche non lineari. Le grammatiche lineari ma ambigue in generale non possono essere analizzate senza backtracking (almeno per input negativi).


  1. significa qui che w v e v wwpvwvvw , ovvero nessuna delle due parole è un prefisso dell'altra. è simile per i suffissi.s

1
Eccellente! Esattamente quello che stavo cercando. È fantastico che un linguaggio che non sia per qualsiasi k sia analizzabile con un algoritmo così semplice. NLR(k)k
Alex ten Brink

1
Dopo averci pensato un po 'di più, ho scoperto un piccolo errore nella tua descrizione: la grammatica lineare non è ambiguo, ma non esiste un prefisso univoco come lo descrivi. Esiste ancora un prefisso univoco, ma potrebbe essere necessario guardare all'interno del non terminale per ottenerlo e il tempo di esecuzione diventa O ( n 2 ) . Il tuo algoritmo funziona su E P A L però. SaAb|aBb,Aa,BbO(n2)EPAL
Alex ten Brink

@AlextenBrink Buona cattura. Ho modificato per tenere conto di questo.
Raffaello
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.