47 votes

Exemple d'analyseurs pour apprendre comment les écrire

Je recherche des codes sources de parseurs et/ou de générateurs de parseurs qui pourraient être étudiés afin de développer davantage mes compétences acquises lors d'un cours à l'école. Connaissez-vous des parseurs recommandables de n'importe quel type?

25voto

Ira Baxter Points 48153

Vous devez savoir comment construire des analyseurs descendants récursifs à la main. Voici un lien SO vers une leçon rapide sur comment faire cela : https://stackoverflow.com/a/2336769/120163

Si vous voulez comprendre comment les analyseurs descendants récursifs peuvent être construits automatiquement, vous pouvez lire un article (et voir un tutoriel) sur MetaII à ce lien : https://stackoverflow.com/a/1142034/120163

10voto

Escualo Points 12584
  • Bison est un exemple classique (C/C++).
  • Pyparsing est un excellent module, et il est très facile à utiliser (Python) .
  • Lemon est très facile à utiliser (C++).

Vérifiez les exemples et bonne chance.

Éditer :

Je suppose que je devrais commenter. Un parser est un programme qui traite une entrée et la "comprend". Un générateur de parser est un outil utilisé pour écrire des analyseurs. Je suppose que vous voulez en apprendre plus sur la génération d'analyseurs, auquel cas, vous devriez vous référer à la documentation des générateurs de parser (tout ce qui précède).

6voto

Dervall Points 4085

Les parseurs eux-mêmes ne sont généralement pas si intéressants, ce sont les générateurs de parseurs qui sont davantage un sujet d'étude.

  • ANTLR génère des parseurs LL qui sont facilement lisibles une fois générés. (Java)
  • Bison génère des parseurs LALR(1) qui sont impossibles à lire. (C)

Si LALR(1) vous intéresse, j'ai une bibliothèque disponible sur github qui tente de faire du neuf avec l'analyse LALR. N'hésitez pas à jeter un œil. C'est en C# et j'ai fait de mon mieux pour rendre le code compréhensible. Cela a été un projet d'apprentissage pour moi, mais c'est plus petit que les grands outils et un peu plus facile à pénétrer. Et n'hésitez pas à contribuer, il y a encore beaucoup de fonctionnalités à ajouter.

Sinon, jetez un œil au code généré par ces outils pour voir comment ils construisent les parseurs réels qui font le travail.

5voto

Je vous suggérerais ce livre : http://www.cs.nott.ac.uk/~gmh/book.html. Il est très utile pour commencer avec Haskell et comprend un chapitre entier sur les parsers.

Si vous parvenez à comprendre cela, créer un parser en utilisant Haskell est assez simple. Prenez également en considération que Haskell est assez rapide et bon pour la programmation multi-core, il pourrait bien être l'avenir.

De plus.

Voici un parser en Haskell : Happy - http://www.haskell.org/happy/.

4voto

Chet Points 680

Je viens de traverser les mêmes batailles et je sens enfin que j'ai une bonne prise sur vos options.

Beaucoup de parseurs sont construits pour les grammaires sans contexte. Vous pouvez lire la définition formelle de la grammaire sans contexte mais mon intuition est que cela signifie essentiellement que les jetons / règles de syntaxe ne peuvent pas changer en fonction d'un contexte. Je pourrais me tromper à ce sujet, mais je pense que cela signifie aussi que vous n'avez pas besoin de faire de la prévisualisation.

Par exemple, le markdown n'est pas sans contexte, et je pense qu'à peu près toute langue basée sur l'indentation n'est pas sans contexte sans devoir effectuer un prétraitement pour envelopper les blocs avec des jetons de début et de fin. C est un exemple parfait d'une grammaire sans contexte.

Si vous traitez avec une grammaire sans contexte, BNF est un moyen formel de spécifier le compilateur. Cet article a été extrêmement utile pour expliquer comment fonctionnent les grammaires BNF, leur performance et les extensions courantes aux grammaires BNF.

Certaines de vos options dans cette catégorie sont ANTLR, Bison, Yacc, Jison et Peg.js.

Cependant, après avoir lutté contre ANTLR pendant un certain temps, j'ai trouvé ce que je pense être la meilleure solution : les "parsers combinators". C'est essentiellement des regex surpuissants et très populaires dans le monde de la programmation fonctionnelle.

Je n'ai pas encore de bonnes ressources d'apprentissage pour vous, mais cherchez sur Google et vous les trouverez pour à peu près n'importe quel langage. Je viens du monde JavaScript et en regardant le code source de cette toute petite bibliothèque m'a vraiment aidé à comprendre de quoi il s'agit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X