Question

Quelle est la meilleure façon de créer un analyseur en C ++ à partir d'un fichier avec la grammaire?

Était-ce utile?

La solution

Vous pouvez également jeter un oeil à ces liens:

Autres conseils

Il dépend fortement de la grammaire. J'ai tendance à parseurs descente récursive, qui sont normalement écrits à la main (mais il est possible de générer un à partir d'une description de la grammaire).

Si vous allez utiliser un générateur d'analyseur, il y a vraiment deux bons choix: byacc et Antlr. Si vous voulez quelque chose qui est (raisonnablement) compatible avec YACC, byacc est (de loin) le meilleur choix. Si vous commencez dès le début, ni avec le code existant, ni l'expérience qui favorise en utilisant quelque chose compatible avec YACC, alors Antlr est certainement votre meilleur pari.

Comme il a été mentionné, je vais aussi parler un peu de Bison. Il faut éviter comme la peste Bison qu'il est. les conseils de Brooks au « Plan de jeter un loin » applique ici. Robert Corbett (l'auteur de byacc) a écrit Bison comme sa première tentative d'un générateur d'analyseur. Malheureusement, il a donné GNU au lieu de le jeter. Dans un cas classique de commercialisation battre l'excellence technique, Bison est largement utilisé (et même recommandé, par ceux qui ne connaissent pas mieux), alors que byacc reste relativement obscure.

Edit: Je déteste de le faire, mais comme il est également mentionné, je vais aussi commenter Boost.spirit. Bien que cela puisse être le plus cool exemple de modèle de programmation méta autour, il a quelques problèmes qui me conduisent à recommander de ne pas essayer de le mettre à usage sérieux.

  1. Compiler fois avec elle peut obtenir atroce - 10 minutes est commun, et une grammaire plus grande / plus complexe peut prendre encore plus longtemps (en supposant qu'il ne tombe pas en panne le compilateur).
  2. Si vous faites une erreur du tout, il peut et souvent produire des messages longs insensément d'erreur qui sont pratiquement impossibles à déchiffrer. Messages d'erreur de code du modèle lourd sont notoirement mauvais de toute façon, et l'Esprit insiste sur le système plus que tout le reste.

Croyez-moi: le fait que vous pouvez écrire quelque chose comme Esprit du tout est juste à la frontière entre impressionnant et étonnant - mais je l'utilise encore que si j'étais sûr la grammaire que je traitait était (et je toujours rester) tout à fait petite et simple.

Il y a flex et bison . cousines Lex & Yacc qui ne prennent c ++ existence en compte.

Avez-vous regardé Lex et Yacc ? Voici un extrait de l'article 5 du document lié:

  

ma façon préférée de faire un analyseur C ++   est d'avoir Lex générer un C plaine   fichier, et permettent de générer YACC C ++   code. Lorsque vous liez alors votre   application, vous pouvez rencontrer quelques-uns   problèmes parce que le code du C par   par défaut ne sera pas en mesure de trouver C   fonctions, à moins que vous avez dit que ce que   ces fonctions sont extern "C".

Je l'ai utilisé bison , a trouvé les exemples juste pour mon niveau. A été en mesure de créer une simple calculatrice avec elle, bien sûr, il peut faire beaucoup plus.

La calculatrice a 1 + 2 * 3 par exemple, et construit un arbre de syntaxe. La documentation ne décrit pas comment construire l'arbre, cependant, et qui m'a pris un peu de temps pour travailler.

Si je vais à nouveau je regarde dans « antlr », comme il avait l'air bien et bien pris en charge.

Martin.

La meilleure façon de créer un analyseur est d'utiliser LEX et YACC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top