Je ne peux pas gérer la gauche récursive, mais les analyseurs PEG sont très populaires ces jours-ci. Pour Python, il existe https://github.com/erikrose/parsimonious et https://github.com/KuramitsuLab/pegpy.
Je voulais analyser la formule utilisée dans le système de support de preuve de théorème appelé Coq https://coq.inria.fr/. J'ai donc jeté un coup d'œil à certains des outils d'analyse de phrase / syntaxe de Python.
La grammaire des expressions de Coq est assez compliquée (selon la définition de la grammaire, il s'agit d'une grammaire récursive gauche [^ 1] et nécessite un regard vers l'avenir). Par conséquent, les points suivants ont été utilisés lors de la sélection. Si vous souhaitez gérer d'autres grammaires, bien sûr, ce sera un critère différent.
Voici les résultats de l'enquête.
[^ 1]: ʻexpr :: = expr Une grammaire avec des règles comme "+" terme`. Il est théoriquement possible de réécrire dans une grammaire qui ne soit pas restée récursive, mais je ne veux pas le faire avec une grammaire énorme comme Coq, et je ne veux pas faire d'erreurs humaines.
pyparsing (2.2.0) 2017/03 Bibliothèque d'analyse de syntaxe. Un mécanisme qui crée des règles d'analyse syntaxique en combinant des classes telles que «OneOf», «Facultatif» et «Groupe» avec une approche basée sur un combinateur d'analyseur. Il est très facile de définir des «commentaires imbriqués», ce qui est gênant dans la conception grammaticale des langages de programmation. Il est très facile de spécifier la classe de langage, mais comme la grammaire récursive de gauche ne peut pas être gérée telle quelle, une certaine ingéniosité est requise. Comment utiliser Pyparsing: http://masato.github.io/2014/07/01/python27-etl-pyparsing-syntactic-analysis/
PLY (Python Lex-Yacc) (3.11) 2018/02 Version Python de Lex / Yacc, un outil d'analyse de syntaxe / phrase C bien connu. Cela signifie qu'une syntaxe de définition grammaticale similaire peut être utilisée. L'analyse syntaxique LALR (1) est essentiellement utilisée pour l'analyse. Siège social: http://www.dabeaz.com/ply/ Référence: http://blog.livedoor.jp/shf0811/archives/7346881.html
parse (1.6.6; 2014/11)
Une bibliothèque de correspondance de modèles qui fonctionne à l'opposé de String.format ()
.
Référence: http://coreblog.org/ats/python-parse/
Résumé,
--Parse si une simple correspondance de motif est suffisante --PLY si vous voulez coder des règles de grammaire / écriture récursives de gauche en tant que document indépendant et que vous n'avez pas besoin d'une analyse compliquée --Pyparsing si vous souhaitez définir des règles par codage
Semble être bon.
De plus, PLY ne regarde vers l'avant qu'un seul jeton. Si vous voulez écrire une grammaire compliquée, c'est presque une option de ANTLR (outil Java) qui utilise l'analyse syntaxique LL (*). Par exemple, la grammaire de Coq, qui est un système de support de preuve de théorème, peut être facilement analysée par ANTLR. ANTLR v4 a la capacité de générer un analyseur pour Python 2/3. De plus, le wrapper Python d'ANTLR semble être dans PyPI.