C'è un modo per distinguere tra la grammatica LL (k) e LR (k)?


12

Di recente sto studiando la progettazione di compilatori. Sono venuto a conoscenza di due tipi di grammatica uno è la grammatica LL e l'altro è la grammatica LR.

Sappiamo anche che ogni grammatica LL è LR, ovvero la grammatica LL è un sottoinsieme proprio della grammatica LR. Il primo viene utilizzato nell'analisi top-down e il secondo nell'analisi bottom-up.

Ma c'è un modo per poter dire che una determinata grammatica è LL o LR?


3
Che ne dici di usare le tecniche canoniche per generare le tabelle e L R ( k ) e verificare se contengono conflitti? L L ( 1 ) e L R ( 1 ) sono di solito trattati in qualsiasi libro di testo standard sull'analisi; le tecniche L L ( k ) e L R ( k ) sono un po 'più difficili da trovare, ma sono anche ben note. LL(K)LR(K)LL(1)LR(1)LL(K)LR(K)
Alex ten Brink,

@AlextenBrink Sembra che tu possa dare una risposta! (Bentornato, ti sei perso!)
Raffaello

L'uso della tecnica canonica per verificare se una grammatica è LL o LR è giusto ma lungo. Sto cercando un piccolo modo di trovare ciò che ho trovato nel libro dei compilatori di Aho-Lam-Sethi-Ullman.
Deb

Risposte:


11

grammatiche L L ( k ) e L R ( k ) sono utili non solo perché possono essere analizzate in modo efficiente, ma anche perché possiamo verificare se una grammatica è L L ( k ) o L R ( k )LL(K)LR(K)LL(K)LR(K)e poiché possiamo generare tabelle per loro (le tabelle di analisi vengono utilizzate per analizzare le stringhe di input). Si noti che per queste due classi, avere la tabella di analisi consente immediatamente di verificare se le grammatiche sono nelle classi, perché è così se e solo se le tabelle non contengono errori. Inoltre, sì, ci sono classi di grammatiche che possiamo analizzare in modo efficiente se abbiamo una tabella di analisi, ma per la quale non possiamo generare la tabella se esiste.

Qualsiasi libro di testo sui metodi di analisi ti insegnerà come generare le tabelle per i metodi e possibilmente anche per L R ( 1 ) (sebbene S L R ( 1 ) sia più comune). Libri di testo come Parsing Theory di Sippu e Soisalon-Soininen trattano anche la generazione della tabella di analisi per le grammatiche L L ( k ) e L R ( k ) .LL(1)LR(1)SLR(1)LL(K)LR(K)

Sfortunatamente, per grammatiche davvero strane, le tabelle di analisi per e L R ( k ) (sebbene non per L L ( 1 ) ) possono saltare in aria e diventare enormi; lo faranno anche per grammatiche normali se k è abbastanza alto. Sono disponibili test che possono verificare se una grammatica è L L ( k ) o L R ( k )LL(K)LR(K)LL(1)KLL(K)LR(K)oppure no, eseguito in tempo polinomiale (la generazione della tabella è esponenziale). Per i dettagli, leggi il libro sopra. Si noti che in molti casi, la tabella è di dimensioni ragionevoli, quindi il test non è necessario.

Se non vuoi provare i valori di per vedere se il tuo programma funziona, ma vuoi che il tuo computer capisca se esiste un valore di k tale che la tua grammatica sia L L ( k ) o L R ( k ) , sfortunatamente sei sfortunato, poiché questo è indecidibile. Se la tua grammatica è L R ( k ) per qualche k , puoi decidere se la tua grammatica è L L ( c ) per qualche c , possibilmente diversa da kKKLL(K)LR(K)LR(K)KLL(c)cK(vedi qui per i dettagli).


Ti capita di sapere dove posso trovare i dettagli dell'algoritmo del tempo polinomiale per testare se una lingua è LR (k) (oltre all'acquisto del libro di testo)?
user541686,

2

Dobbiamo solo verificare che una grammatica sia LL o meno perché ogni grammatica LL è LR ovvero LL è il sottoinsieme proprio di LR. Quindi se una grammatica è LL allora deve essere LR ma ogni LR non è LL.

Una grammatica G è in LL iff ogni volta che A-> C | D, la seguente condizione dovrebbe valere:

  1. Primo (C) e Primo (D) sono insiemi disgiunti.
  2. Se empty è in First (D), First (C) e Follow (A) sono insiemi disgiunti, così come empty è in First (C).
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.