Sto usando Bison per generare un parser. Ho uno spostamento/riduzione dei conflitti in cui ho davvero bisogno che Bison utilizzi GLR piuttosto che LALR per affrontarlo. Ma ho passato la direttiva %glr-parser
e il file sorgente afferma ancora che si tratta di un parser LALR. Ho anche trovato uno scheletro "glr.cc" che suggerisce che si tratta di un parser GLR C++ e che l'utilizzo di %skeleton "glr.cc"
non ha modificato l'output. Bison non spedisce tutti gli algoritmi per tutte le lingue di destinazione?parser C++ GLR con Bison
risposta
Hai solo bisogno di %glr-parser
per ottenere un parser GLR. Si noti che i parser GLR possono ANCORA avere conflitti (shift/reduce o reduce/reduce), è solo che il parser generato proverà entrambe le alternative e unificherà il risultato.
Se si desidera arrestare i messaggi relativi ai conflitti, è possibile utilizzare %expect
e %expect-rr
. Hoever, usando ciecamente un parser GLR in cui non si capiscono quali sono tutti i conflitti è pericoloso - il parser risultante potrebbe impiegare esponenzialmente a lungo per analizzare alcuni input se non si presta attenzione, o potrebbe darvi errori di ambiguità in fase di esecuzione.
Questo non risponde alla domanda- Ho detto che ho tentato '% glr-parser' – Puppy
@DeadMG: quindi hai un parser GLR. Solo che i parser GLR hanno lo stesso spostamento/riduzione e riducono/riducono i conflitti come parser LALR, ma li gestiscono in un modo diverso. –
Non ho detto che non ne avevo uno perché riportava ancora conflitti, ho detto che ne avevo ancora uno perché i commenti del file sorgente lo dicevano ancora. – Puppy
Non so cosa intendi con "%skeleton "glr.cc"
non ha modificato l'output", perché lo fa! Sei sicuro di aver davvero rigenerato l'output? Se l'hai fatto, ti preghiamo di fornire maggiori dettagli.
$ echo "%% exp: '0'" > /tmp/f.y
$ bison -S lalr1.cc /tmp/f.y -o f1.cc
$ bison -S glr.cc /tmp/f.y -o f2.cc
$ ls -l f1.cc f2.cc
-rw-r--r-- 1 akim wheel 28373 30 oct 09:29 f1.cc
-rw-r--r-- 1 akim wheel 82767 30 oct 09:29 f2.cc
bison è un software gratuito, quindi è possibile studiare e migliorare il suo codice soruce. A proposito, hai pensato di usare un altro generatore di parser, come ANTLR? –
@Basile: la mia grammatica non è LL. Per quanto riguarda il miglioramento del codice sorgente, intendi, se volessi trasportare oltre sei miliardi di utilità di supporto. – Puppy
ANTLR ha diversi hack per gestire alcuni tipi di grammatiche non LL. –