Je voudrais faire un peu d'analyse et de tokenisation en C++ à des fins d'apprentissage. Maintenant, je suis souvent tombé sur bison/yacc et lex en lisant ce sujet en ligne. Y aurait-il un avantage pour le maire d'utiliser ceux-ci, par exemple un tokenizer/parser écrit en utilisant STL ou boost :: regex ou peut-être même juste C?C++ quel est l'avantage de lex et bison pour un tokenizer/parser selfmade
Répondre
J'ai récemment entrepris l'écriture d'un simple lexeur et analyseur.
Il s'est avéré que le lexer était plus simple à coder à la main. Mais l'analyseur était un peu plus difficile. Mon parser généré par Bison a fonctionné presque immédiatement, et il m'a donné beaucoup de messages utiles sur l'endroit où j'avais oublié les états. Plus tard, j'ai écrit le même parseur à la main, mais il a fallu beaucoup plus de débogage avant de le faire fonctionner parfaitement. L'intérêt de générer des outils pour les lexers et les analyseurs syntaxiques est que vous pouvez écrire la spécification dans un langage propre et facile à lire qui se rapproche le plus possible d'un rendu de votre spécification. Un analyseur écrit à la main est généralement au moins deux fois plus grand. En outre, l'analyseur syntaxique automatique (/ lexer) est livré avec beaucoup de code de diagnostic et de logique pour vous aider à obtenir la chose déboguée.
Une spécification parser/lexer en langage BNF est également beaucoup plus facile à changer si votre langage ou vos exigences changent. Si vous utilisez un analyseur/lexier écrit à la main, vous devrez peut-être creuser profondément dans votre code et apporter des modifications importantes. Enfin, comme ils sont souvent implémentés en tant que machines à états finis sans retour arrière (des millions d'options sur Bison, ce n'est pas toujours une donnée), il est tout à fait possible que votre code généré soit plus efficace que votre main produit codé.
Quelqu'un d'autre a déjà écrit et DEBUGGED pour vous?
C'est plus facile et ils sont plus généraux. Bison/Lex peut tonkenize et analyser grammaire arbitraire et le présenter dans ce qui peut être un format plus facile. Ils peuvent aussi être plus rapides, selon la façon dont vous écrivez votre regex.
Je ne voudrais pas écrire mon propre analyseur en C car la langue n'a pas une grande intuition à propos des chaînes. Si vous écrivez votre propre, je recommanderais perl pour la facilité de regex (ou peut-être python).
Il est probablement plus rapide d'utiliser des outils existants, mais cela peut être amusant ou pas. Si vous avez du temps et que c'est juste pour apprendre, allez-y. C++ est un bon langage pour commencer.
Ils ne peuvent certainement pas analyser une "grammaire arbitraire". –
Différents mouvements pour différentes personnes. Personnellement, j'aime les analyseurs de descente récursifs - je les trouve faciles à comprendre et vous pouvez les faire produire des messages d'erreur d'utilisateur final supérieur à ceux produits par des outils comme bison.
Je trouve également qu'ils ont tendance à être un peu plus robustes face aux cas de bords difficiles dans certaines langues où l'analyse et le lexage se chevauchent. – Kylotan
- 1. Quelle est la différence entre Flex/Lex et Yacc/Bison?
- 2. Erreur Handing avec Flex (LEX) et Bison (yacc)
- 3. Existe-t-il un bon mode ou méthode Emacs pour les fichiers lex/flex/yacc/bison?
- 4. Gestion des macros #define dans yacc/bison lex
- 5. Installation de LEX/YACC ou de flex/bison sous Windows, Visual C++ 2008
- 6. Simple Flex/Bison C++
- 7. Quel est le problème avec ce fichier lex?
- 8. Conventions de codage Bison (et flex)
- 9. Lex et Yacc pour les automates finis
- 10. Une alternative au duo flex et bison?
- 11. défaut de segmentation avec bison et flex
- 12. Comment programmer Lex et Yacc pour analyser un fichier partiel
- 13. Regex pour lex
- 14. Existe-t-il un outil pour faire un compilateur c dans win7 avec yacc et lex?
- 15. Fonctionnalité Flex/Bison dans PHP
- 16. Erreur de compilation Flex/bison sous Windows
- 17. Quel est le meilleur générateur d'analyseur LALR pour C++ pouvant générer des messages d'erreur significatifs?
- 18. Partage de la mémoire entre les fichiers YACC, Lex et C
- 19. Essayer de construire une grammaire C# pour bison/wisent
- 20. lex/yacc et parser/scanner
- 21. Plugins de l'onglet jQuery - avantages sur selfmade?
- 22. Comment écrire son propre analyseur pour (f) lex?
- 23. Confusion d'inclusion Yacc et Lex
- 24. faute de segmentation flex/bison avant main()
- 25. Comment initialiser la valeur d'union de Bison%?
- 26. comment installer Lex et Yacc dans Ubuntu?
- 27. Quel est le meilleur programme linux pour un programmeur C++?
- 28. Quel est l'équivalent de l'objet en C# pour l'objectif C?
- 29. question Typedef avec bison et flex
- 30. Quel est le problème avec ce Makefile?
merci pour votre réponse détaillée, je suppose que je vais essayer les deux juste pour la comparaison, car c'est juste pour s'amuser de toute façon! – moka