Bibliothèque d'analyse de phrases / syntaxe Python (première enquête 2014.11, ajout partiel 2019.10)

2019-10-06 PostScript

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.

Motivation de l'enquête

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.

Critère d'évaluation

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.

Nouveau

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/

Vieux / plus

Yapps (2.2.0) 2014/06
Analyseur LL (1) étendu. Apparemment, il n'y a pas d'anticipation, donc il ne convient pas à l'analyse dans des langages compliqués. Référence: https://github.com/mk-fg/yapps
jupyLR (0.3) 2012/06
Analyseur LR généralisé. Plusieurs arborescences de syntaxe peuvent être générées lorsque la syntaxe est ambiguë par la recherche de priorité de largeur. Cela permet de gérer les conflits de réduction / réduction qui ne peuvent pas être traités par l'analyseur LR. Siège social: http://bl0b.github.io/jupyLR/
plex
Outil d'analyse de phrases de type Flex. Le développement semble s'être arrêté à 2.0.0 dev: https://pythonhosted.org/plex/
SimpleParse
Non mis à jour depuis 2011: http://simpleparse.sourceforge.net/
SPARK
État de la mise à jour inconnu. Nom trompeur avec d'autres bibliothèques: http://pages.cpsc.ucalgary.ca/~aycock/spark/
PyLR
Cela ressemble à une célèbre bibliothèque d'avant 2000, mais elle n'y est plus maintenant.
FlexModule, BisonModule
Cela ne semble pas non plus exister maintenant. Cela semble avoir été un emballage pour Flex et Bison de C.
re.Scanner (intégré)
C'était une classe d'analyse de phrases utilisant des expressions régulières, mais il semble qu'elle ait disparu de Python 3.4.

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.


Est-ce le plus fort des ANTLR après tout?

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.

Recommended Posts

Bibliothèque d'analyse de phrases / syntaxe Python (première enquête 2014.11, ajout partiel 2019.10)
Bibliothèque standard Python: première moitié (mémo d'apprentissage Python ⑧)
Bibliothèque de messagerie Python 3.6
Premier Python
Bibliothèque Python AST
Premier Python 3 ~ Première comparaison ~
Premier Python
Note sur la bibliothèque Python
Premier Python ~ Codage 2 ~
Premier python [O'REILLY]
Utiliser l'analyse contrainte MeCab (analyse partielle) en Python via natto-py