2010-07-13 3 views
7

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

13

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é.

+0

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

4

Quelqu'un d'autre a déjà écrit et DEBUGGED pour vous?

1

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.

+4

Ils ne peuvent certainement pas analyser une "grammaire arbitraire". –

0

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.

+0

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

Questions connexes