65 votes

Ressources pour la lexie, la tokénisation et l'analyse syntaxique en python

Peut-on m'indiquer des ressources sur la lexie, l'analyse syntaxique et la tokénisation avec Python ?

Je fais un peu de piratage sur un projet open source ( hotwire ) et je souhaitais apporter quelques modifications au code qui lexiques , analyse syntaxique et tokenisation les commandes qui y sont introduites. Comme il s'agit d'un véritable code de travail, il est assez complexe et un peu difficile à comprendre.

Je n'ai jamais travaillé sur du code pour lex/parse/tokenise avant, donc je pensais qu'une approche serait de travailler à travers un ou deux tutoriels sur cet aspect. J'espère en apprendre suffisamment pour naviguer dans le code que je veux réellement modifier. Existe-t-il quelque chose d'approprié ? (Idéalement, cela pourrait se faire en un après-midi sans avoir à acheter et à lire le livre du dragon d'abord...)

Edit : (7 Oct 2008) Aucune des réponses ci-dessous ne donne tout à fait ce que je veux. Avec elles, je pourrais générer des parseurs à partir de zéro, mais je veux apprendre à écrire mon propre parseur de base à partir de zéro, sans utiliser lex et yacc ou des outils similaires. Cela fait, je pourrai alors mieux comprendre le code existant.

Quelqu'un pourrait-il m'indiquer un tutoriel me permettant de construire un analyseur syntaxique de base à partir de zéro, en utilisant uniquement python ?

38voto

Eli Bendersky Points 82298

Je suis un heureux utilisateur de PLY . Il s'agit d'une implémentation purement Python de Lex & Yacc, avec de nombreuses petites subtilités qui la rendent très pythonique et facile à utiliser. Comme Lex et Yacc sont les outils de lexage et d'analyse syntaxique les plus populaires et qu'ils sont utilisés dans la plupart des projets, PLY a l'avantage de se tenir sur les épaules des géants. De nombreuses connaissances existent en ligne sur Lex & Yacc, et vous pouvez librement les appliquer à PLY.

PLY a également un bon page de documentation avec quelques exemples simples pour vous aider à démarrer.

Pour une liste de nombreux outils d'analyse syntaxique de Python, voir ce .

2 votes

J'appuie la recommandation pour PLY, c'est génial.

31voto

Saad Points 381

Cette question est assez ancienne, mais ma réponse pourra peut-être aider quelqu'un qui souhaite apprendre les bases. Je trouve cette ressource très bonne. Il s'agit d'un simple interpréteur écrit en python sans l'utilisation d'aucune bibliothèque externe. Cela aidera donc toute personne souhaitant comprendre le fonctionnement interne de l'analyse syntaxique, de la lexie et de la tokénisation :

"Un simple interpréteur à partir de zéro en Python :" Partie 1 , Partie 2 , Partie 3 y Partie 4 .

5 votes

Très belle série d'articles qui mettent l'accent sur l'objectif plutôt que sur les outils !

19voto

Torsten Marek Points 27554

Pour les grammaires moyennement complexes, PyParsing est brillant. Vous pouvez définir des grammaires directement dans le code Python, sans avoir besoin de générer du code :

>>> from pyparsing import Word, alphas
>>> greet = Word( alphas ) + "," + Word( alphas ) + "!" # <-- grammar defined here
>>> hello = "Hello, World!"
>>>> print hello, "->", greet.parseString( hello )
Hello, World! -> ['Hello', ',', 'World', '!']

(Exemple tiré de la page d'accueil de PyParsing).

Avec les actions d'analyse (fonctions qui sont invoquées lorsqu'une certaine règle de grammaire est déclenchée), vous pouvez convertir les analyses directement en arbres syntaxiques abstraits, ou toute autre représentation.

Il existe de nombreuses fonctions d'aide qui encapsulent des motifs récurrents, comme les hiérarchies d'opérateurs, les chaînes citées, les imbrications ou les commentaires de style C.

4 votes

Pour ce que ça vaut, j'ai toujours eu des problèmes avec PyParsing. J'ai essayé de l'utiliser à plusieurs reprises et je n'ai jamais été pleinement satisfait du résultat (par exemple, cela a pris beaucoup de temps, a été difficile à déboguer, a nécessité plus de code que prévu, etc). Je ne peux pas dire si c'est dû à mon ignorance ou à une défaillance de PyParsing, cependant

1 votes

Le lien est mort, ce serait bien si vous pouviez le mettre à jour.

6voto

nilamo Points 1341

pygmes est un surligneur syntaxique de code source écrit en python. Il possède des lexers et des formateurs, et il peut être intéressant de jeter un coup d'oeil à la source.

6voto

Tony Arkles Points 1435

Voici quelques éléments pour vous aider à démarrer (en gros, du plus simple au plus complexe, du moins puissant au plus puissant) :

http://en.wikipedia.org/wiki/Recursive_descent_parser

http://en.wikipedia.org/wiki/Top-down_parsing

http://en.wikipedia.org/wiki/LL_parser

http://effbot.org/zone/simple-top-down-parsing.htm

http://en.wikipedia.org/wiki/Bottom-up_parsing

http://en.wikipedia.org/wiki/LR_parser

http://en.wikipedia.org/wiki/GLR_parser

Quand j'ai appris tout ça, c'était dans le cadre d'un cours universitaire de niveau 400 d'un semestre. Nous avons fait un certain nombre de travaux pratiques où nous faisions l'analyse syntaxique à la main ; si vous voulez vraiment comprendre ce qui se passe sous le capot, je vous recommande la même approche.

Ce n'est pas le livre que j'ai utilisé, mais il est plutôt bon : Principes de conception des compilateurs .

J'espère que c'est suffisant pour vous permettre de commencer :)

10 votes

En quoi cela aide-t-il quelqu'un qui connaît tout cela, mais qui recherche des implémentations en python ?

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