Mi piacerebbe fare un po 'di analisi e di tokenizzazione in C++ per scopi di apprendimento. Ora mi capita spesso di incontrare bison/yacc e lex quando leggo su questo argomento online. Ci sarebbe qualche beneficio di primo piano nell'usarli, ad esempio un tokenizzatore/parser scritto usando STL o boost :: regex o forse anche solo C?C++ qual è il vantaggio di lex e bisonte per un tokenizzatore self-parser/parser
risposta
Recentemente ho iniziato a scrivere un semplice lexer e parser.
Si è scoperto che il lexer era più semplice da codificare a mano. Ma il parser era un po 'più difficile. Il parser generato da Bison ha funzionato quasi subito e mi ha dato molti messaggi utili su dove avevo dimenticato gli stati. In seguito scrissi lo stesso parser a mano ma ci volle molto più debug prima che funzionasse perfettamente.
L'attrattiva di generare strumenti per i parser e parser è che è possibile scrivere le specifiche in un linguaggio pulito e di facile lettura che si avvicina ad una resa più breve possibile delle specifiche. Un parser scritto a mano è solitamente almeno due volte più grande. Inoltre, il parser automatico (/ lexer) viene fornito con un sacco di codice diagnostico e logica per aiutarti a ottenere il debug della cosa.
Una specifica del parser/lexer in linguaggio simile a BNF è anche molto più semplice da modificare, nel caso in cui la lingua o le esigenze cambino. Se hai a che fare con un parser/lexer scritto a mano, potresti aver bisogno di approfondire il tuo codice e apportare modifiche significative.
Infine, poiché sono spesso implementati come macchine a stati finiti senza retrocessione (migliaia di miliardi di opzioni su Bison, quindi non è sempre un dato), è possibile che il codice generato automaticamente sia più efficiente della tua mano prodotto codificato.
Qualcun altro ha già scritto e DEBUGGATO loro per te?
Più facile e più generale. Bison/Lex può tonkenize e analizzare la grammatica arbitraria e presentarlo in quello che potrebbe essere un formato più semplice. Potrebbero essere anche più veloci, a seconda di quanto bene scrivi la tua espressione regolare.
Non vorrei scrivere il mio parser in C poiché la lingua non ha grandi intuizioni riguardo le stringhe. Se scrivi il tuo, ti consiglierei perl per la facilità di regex (o forse python).
È probabilmente più veloce utilizzare gli strumenti esistenti, ma può essere divertente o meno. Se hai tempo e dal momento che è solo per l'apprendimento, provaci. C++ è un buon linguaggio per cominciare.
Certamente non possono analizzare "grammatica arbitraria". –
Diverse corse per persone diverse. A me personalmente piacciono i parser di discendenza ricorsiva, li trovo facili da capire e puoi farli produrre messaggi di errore utente superiore a quelli prodotti da strumenti come il bisonte.
Trovo anche che tendano ad essere un po 'più robusti di fronte ai complicati casi limite in alcune lingue dove l'analisi e il lexing si sovrappongono. – Kylotan
- 1. Lex/Yacc per C#?
- 2. Qual è il vantaggio di Jikes RVM
- 3. Spark Transformation - Perché è pigro e qual è il vantaggio?
- 4. Qual è il vantaggio dell'utilizzo di NginX per Node.js?
- 5. Qual è la differenza tra lex/yacc e fslex/fsyacc?
- 6. Qual è il vantaggio delle "espressioni lambda"?
- 7. Qual è il vantaggio dell'utilizzo di un HyperlinkedModelSerializer in DRF?
- 8. Qual è il vero vantaggio degli ambiti
- 9. qual è la differenza tra lex e yacc
- 10. Qual è la differenza tra Flex/Lex e Yacc/Bison?
- 11. Qual è il vantaggio del contenitore Docker per un'istanza memcached?
- 12. bisonte fine del file
- 13. Qual è il vantaggio del modello di modulo Javascript?
- 14. Qual è il vantaggio di XML-RPC su XML semplice?
- 15. Qual è il vantaggio di rompere un codice in diverse piccole funzioni in C++?
- 16. Qual è il vantaggio dell'utilizzo di epoll_create1() invece di epoll_create()
- 17. Qual è il vantaggio di questa chiamata di funzione indiretta?
- 18. PHP: qual è il vantaggio di spl_autoload_register? Prestazioni di include
- 19. Qual è il vantaggio degli avanzi di conduit?
- 20. Qual è il vantaggio di version.rb in Ruby gemma
- 21. Qual è il vantaggio della modalità DI rigorosa AngularJS?
- 22. qual è il vantaggio di usare supervisord su monit
- 23. Qual è il vantaggio di scrypt su bcrypt?
- 24. Qual è il vantaggio di Class.new in questo Rspec
- 25. qual è il vantaggio di utilizzare FutureTask su Callable?
- 26. Qual è il vantaggio per un algoritmo di ordinamento per essere stabile?
- 27. Qual è il vantaggio di WSDualHttpBinding in WCF?
- 28. Qual è il vantaggio di avere una sezione .bss?
- 29. Qual è il vantaggio dell'uso di async con MVC5?
- 30. Qual è il vantaggio di apklib dal jar?
grazie per la tua risposta dettagliata, credo che proverò sia per il confronto, dal momento che è solo per divertimento in ogni caso! – moka