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
- 1. LALR (1) o GLR su Windows - Alternative a Bison ++/Flex ++ che sono attuali?
- 2. LLVM JIT Parser scrittura con Bison/Antlr/Packrat/Elkhound/
- 3. Simple Flex/Bison C++
- 4. Weird C code in Bison (yyerror)
- 5. Chi è più veloce: PEG o GLR?
- 6. Funzionalità Flex/Bison in PHP
- 7. Flex ++ BisonC++ parser
- 8. Problemi con reentrant Flex e Bison
- 9. C++ qual è il vantaggio di lex e bisonte per un tokenizzatore self-parser/parser
- 10. Integrazione di Bison/Flex/Yacc in XCode
- 11. LISP Parser C++
- 12. C# ASP.NET QueryString parser
- 13. Can Bison analizza i caratteri UTF-8?
- 14. Flex/Bison: cattiva gestione dei token?
- 15. avviso compilazione Bison
- 16. C Parser codice per .NET
- 17. Multiple parser di bisello/flex
- 18. Parser di opzioni per C/C++?
- 19. parser C++ SAX XML leggero
- 20. ricorsivo Descent Parser per C
- 21. OpenSouce C/C++ Math Library espressione parser
- 22. Jsoup come parser per C++/C?
- 23. Perché alcuni compilatori preferiscono il parser fatto a mano sui generatori di parser?
- 24. gcc C++ command line error-message parser
- 25. Riferimento indefinito a yyparse (flex & bison)
- 26. Includi struct nel DEF% unione con Bison/Yacc
- 27. Parser generato da GNU Bison getta un errore di segmentazione 11 quando somministrato un file non vuoto
- 28. Analisi dell'html con parser SAX
- 29. Scrittura parser ricorsivo con pyparsing
- 30. Esiste un parser CSS per C#?
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. –