Question

J'ai récemment écrit un analyseur en Python avec Ply (c'est une réimplémentation de yacc en python). Quand j'ai presque fini avec l'analyseur, j'ai découvert que la grammaire que je dois analyser exige que je vérifie pendant l'analyse afin d'informer le lexer. Sans consulter le lexer, je ne parviens pas à analyser correctement les chaînes dans la langue.

Étant donné que je peux contrôler l'état du lexer à partir des règles de grammaire, je pense que je vais résoudre mon cas d'utilisation à l'aide d'une table de consultation dans le module d'analyse, mais il peut devenir trop difficile de maintenir / tester. Je souhaite donc connaître certaines des autres options.

En Haskell, j'utilisais Parsec, une bibliothèque de fonctions d'analyse syntaxique (appelée combinateurs). Existe-t-il une implémentation de Parsec en Python? Ou peut-être une autre bibliothèque de qualité de production pleine de fonctionnalités d’analyse permettant de créer un analyseur contextuel en Python?

EDIT: Toutes mes tentatives d'analyse sans contexte ont échoué. Pour cette raison, je ne pense pas que ANTLR soit utile ici.

Était-ce utile?

La solution

Une option que vous pouvez envisager, si un analyseur LL vous convient, est de donner ANTLR à essayer, il peut aussi générer du python (en fait, il s’agit de LL (*) comme ils l’appellent, * correspond à la quantité de données de recherche qu’il peut gérer).

Autres conseils

Je pense que la la recherche par passe est basée sur les mêmes principes que la parsec.

PySec est un autre analyseur syntaxique monadique. Je ne connais pas grand chose à ce sujet, mais cela vaut la peine de regarder ici

Il y a ANTLR, qui est LL (*), il y a PyParsing, qui est plus convivial et ressemble un peu à un DSL, et puis il y a Analyse qui ressemble au menhir d’OCaml.

Rien ne vous empêche de détourner votre analyseur du fichier "sans contexte". chemin en utilisant PLY. Vous pouvez transmettre des informations au lexer lors de l'analyse et ainsi obtenir une flexibilité totale. Je suis presque sûr que vous pouvez analyser tout ce que vous voulez avec PLY de cette façon.

Pour un exemple pratique, considérez - il s'agit d'un analyseur syntaxique pour ANSI C écrit en Python avec PLY. Il résout le problème classique de C typedef - identifiant (qui rend la grammaire de C non sensible au contexte) en renseignant une table de symboles dans l’analyseur utilisé dans le lexer pour résoudre les noms de symboles sous forme de types ou non.

ANTLR est fantastique et offre l'avantage supplémentaire de fonctionner dans plusieurs langues.

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