2011-12-15 8 views
5

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

+0

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? –

+1

@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

+0

ANTLR ha diversi hack per gestire alcuni tipi di grammatiche non LL. –

risposta

1

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.

+0

Questo non risponde alla domanda- Ho detto che ho tentato '% glr-parser' – Puppy

+0

@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. –

+0

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

1

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