2012-08-29 13 views
12

Ho usato lex/yacc e ora sto cercando di passare a ANTLR. La principale preoccupazione è che ANTLR è un parser LL (*) a differenza di yacc che è LALR. Sono abituato a pensare dal basso e non so esattamente quale sia il vantaggio delle grammatiche LL. La gente dice che le grammatiche LL sono più facili da capire e più popolari in questi giorni. Ma sembra che i parser LR siano più potenti per es. I parser LL non sono in grado di gestire le ricorsioni a sinistra, anche se sembrano esserci alcuni rimedi.parser LALR vs LL

Quindi la domanda è qual è il vantaggio delle grammatiche LL su LALR? Lo apprezzerei se qualcuno potesse darmi qualche esempio. Anche i collegamenti ad articoli utili sarebbero fantastici.

Grazie per il vostro aiuto in anticipo!

(vedo questa è una grande risorsa:. What advantages do LL parsers have over LR parsers?, ma sarebbe stato meglio con alcuni esempi)

risposta

9

Il più grande vantaggio che vedo a LL parser è che sono così facili da capire e da implementare! Puoi scrivere a mano i parser recursive descent con codice che corrisponde strettamente alla grammatica.

LR sono generalmente considerati più potente e anche molto più veloce, ma ci sono alcuni compromessi che conosco:

  • parser LR possono utilizzare solo attributi sintetizzati; non possono passare attributi ereditati.
  • Le azioni in una grammatica LR possono causare non determinismo grammaticale ma non in LL.

Tuttavia, troverete che LL (*) sono anche molto potenti.

+1

Se qualcuno ti dà il generatore di parser, per definizione quello che fa è "facile da implementare". In tal caso, scegli il generatore di parser che gestisce facilmente la più ampia classe di lingue, per ridurre al minimo i tuoi sforzi. Dal punto di vista, IMHO, LR vince abbastanza bene su LL. GLR vince abbastanza bene su LR. –

+0

Sono d'accordo, ma tuttavia LL è ancora facile da implementare. Stavo rilevando che LR di solito richiede l'uso di uno strumento. Trovo molto interessante il fatto che tu possa scrivere a mano una discesa ricorsiva e che il codice e la grammatica vadano di pari passo. –

+3

Sì, i suoi intriganti e parser che costruiscono le persone dovrebbero conoscerli. Man mano che le tue grammatiche diventano grandi, è scomodo forzarle in LL, e in alcuni punti (piuttosto piccoli) la convenienza di LR vince sulla semplicità concettuale nella tua testa. LR è abbastanza facile da capire se non stai costruendo il generatore di parser, e non è come se non ce ne fossero molti in giro. –

9

I parser LR sono molto più potenti dei parser LL e inoltre, i parser LALR possono essere eseguiti in O (n) come i parser LL. Quindi non troverai alcun vantaggio funzionale di LL su LR.

Quindi, l'unico vantaggio di LL è che le macchine a stati LR sono un po 'più complesse e difficili da comprendere, e gli analizzatori LR non sono particolarmente intuitivi. D'altra parte, il codice parser LL che viene generato automaticamente può essere molto facile da capire e correggere.

+0

Grazie per l'opinione, DeadMG. –

Problemi correlati