GLR è ottimo se si desidera un albero/foresta di analisi e non si preoccupa delle scatole nere. Ti consente di digitare qualsiasi cosa CFG a costo di verificare le ambiguità in fase di analisi tramite test approfonditi, invece di risolvere i conflitti LR/LALR in modo statico. Alcuni dicono che è un buon compromesso. Lo strumento DMS di Ira Baxter o Elkhound, che ha una grammatica C++ libera, è utile per questa classe di problemi. ANTLR è utile anche per un'ampia classe di applicazioni linguistiche, ma utilizza un approccio top-down, generando parser di discesa ricorsivi chiamati LL (*) che consentono i predicati semantici. Qui dichiarerò senza prove che i predicati consentono di analizzare i linguaggi sensibili al contesto oltre i CFG. Ai programmatori piace inserire azioni in grammatiche, come una buona gestione degli errori, e come il debug in un unico passaggio.LL è buono a tutti e tre. LL è ciò che facciamo a mano, quindi è più facile da capire. Non credere allo wikipedia nonsense about LR being better at handling errors. Detto questo, se si esegue un backtrack molto con ANTLR, gli errori sono effettivamente peggiori con LL (*) (i PEG hanno questo problema).
Re backtracking. GLR specula (vale a dire backtrack) anche, proprio come PEG, ANTLR e qualsiasi altra strategia non deterministica. In qualsiasi stato LR non deterministico, i sotto-parser GL "forks" consentono di provare qualsiasi percorso percorribile. Ad ogni modo, LL ha un buon contesto per la gestione degli errori. Dove LR sa che corrisponde ad un'espressione, LL sa che è un'espressione in un compito o IF
-conditional; LR sa che potrebbe essere in entrambi ma non è sicuro - e che l'incertezza è dove ottiene il suo potere.
GLR è O(n^3)
caso peggiore. packrat/PEG è il peggior caso O(n)
. Le ANTLR sono O(n^2)
a causa del DFA lookahead ciclico ma in pratica O(n)
. Non importa davvero GLR è abbastanza veloce.
ANTLR è AN altro T ool per L ang R eCognition non anti-LR, ma mi piace anche quello;)
Francamente, come un sacco di giovani programmatori negli anni '80, non capivo LALR e non mi piacevano le scatole nere (ora scavo la bellezza del motore GLR ma preferisco comunque LL). Ho costruito un compilatore commerciale basato su LL (k) e ho deciso di creare uno strumento per generare ciò che avevo costruito a mano. ANTLR non è per tutti e casi limite come C++ potrebbero essere meglio gestiti con GLR ma molte persone trovano ANTLR adatto alla loro zona di comfort. Dal gennaio 2008, ci sono stati 134.000 download del barattolo binario di ANTLR, all'interno di ANTLRWorks, e il totale delle zips di origine (secondo Google Analytics). Vedi our paper su LL (*) con molti dati empirici.
fonte
2010-11-04 21:00:59
Parlando * parser * (e non grammatiche): LL (*) può essere scritta in modo semplice ricorsiva -approccio decente. Questo è un +1 nel mio libro. –
@pst: true, stavo solo sperando che "perché sono più facili da implementare" non era il vantaggio principale. :) –
Nota che "LR" in ANTLR sta semplicemente per "Language Recognition", non qualcosa sulla classe di grammatica che accetta. –