web-dev-qa-db-fra.com

Tout décent PHP analyseur écrit en PHP?

Je fais beaucoup de travail en manipulant et en analysant PHP. Normalement, j'utilise juste le Tokenizer pour ce faire. Pour la plupart des applications, cela suffit. Mais parfois, l'analyse à l'aide d'un lexer n'est tout simplement pas assez fiable (évidemment).

Je recherche donc un PHP écrit en PHP. J'ai trouvé hnw/PhpParser et kumatch/stagehand-php-parser . Both sont créés par une conversion automatisée de zend_language_parser.y en un fichier .y avec PHP au lieu de C (puis compilé en un analyseur LALR (1)). Mais cette conversion automatisée ne peut tout simplement pas être utilisée.

Donc, y a-t-il un PHP analyseur écrit en PHP? (J'ai besoin d'un pour PHP 5.2 et un pour 5.3. Mais un seul d'entre eux serait un bon point de départ aussi.)

78
NikiC

Après qu'aucun analyseur complet et stable n'ait été trouvé ici, j'ai décidé d'en écrire un moi-même. Voici le résultat:

PHP-Parser: A PHP parser écrit en PHP

Le projet prend en charge l'analyse de code écrit pour toute version PHP entre PHP 5.2 et PHP 7.1.

Outre l'analyseur lui-même, la bibliothèque fournit certains composants connexes:

  • Compilation du AST retour en PHP ("jolie impression")
  • Infrastructure pour traverser et changer l'AST
  • Sérialisation vers et depuis XML (ainsi que le vidage sous une forme lisible par l'homme)
  • Résolution des noms d'espaces de noms (alias, etc.)

Pour une vue d'ensemble de l'utilisation, voir la section "Utilisation des composants de base" de la documentation .

126
NikiC

Cela ne va pas être une excellente option pour vous, car cela viole la contrainte pure-PHP, mais:

Il y a quelque temps, les gens de php-internals ont décidé de passer à Lemon comme technologie d'analyse. Il y a une branche dans le repo PHP svn qui contient les modifications requises.

Ils ont décidé de ne pas continuer , car ils ont constaté que leur solution au citron était environ 10 à 15% plus lente. Mais, la succursale est toujours là.

Il y a un ancien analyseur de citron écrit comme une extension PHP. Vous pourrez peut-être travailler avec. Il y a aussi ce package PEAR . Il y a aussi cet autre paquet de citron (via ce billet de blog sur [~ # ~] pgn [~ # ~] ).

Bien sûr, même si vous le faites fonctionner, je ne sais pas ce que vous feriez des données, ni à quoi elles ressemblent.

Une autre option farfelue serait de jeter un œil à Quercus , une implémentation PHP en Java. Ils devraient avoir écrit un analyseur, peut-être que cela pourrait valoir la peine d'être étudié.

9
Charles

L'outil de métrique PHP Depend contient du code pour générer une AST à partir de PHP source écrite entièrement en PHP. Il utilise des PHP cependant token_get_all pour la tokenisation.

Le code source est disponible sur github: https://github.com/manuelpichler/pdepend/tree/master/src/main/php/PHP/Depend

L'implémentation du AST pour certaines parties comme les expressions mathématiques n'était pas encore terminée la dernière fois que j'ai vérifié, mais selon son auteur, c'est l'objectif.

7
naderman

Eh bien, ce n'est pas en PHP, désolé, mais construire ce genre de machinerie est difficile, et PHP n'est pas particulièrement adapté à la tâche de traitement du langage.

Notre PHP Front End il fournit la pleine PHP 4.x et 5.x (EDIT 9/2016: gère désormais PHP 7 ) l'analyse syntaxique, crée automatiquement des AST avec tous les détails d'une grammaire complète PHP, peut générer du texte source compilable à partir des AST. C'est plus difficile que cela puisse paraître quand on considère tous les détails délirants, y compris bizarre littéraux de chaîne, commentaires capturés, nombres avec radix, etc.

Mais les AST sont à peine suffisants (vous avez déjà observé que les jetons ne sont même pas à peine suffisants).

La base sur laquelle il est construit, le DMS Software Reengineering Toolkit fournit un support pour l'analyse et les transformations arbitraires des AST. Il lira également de grands ensembles de fichiers à la fois, permettant l'analyse et les transformations à travers PHP fichiers.

4
Ira Baxter

Il existe un port ANTLR vers PHP: http://code.google.com/p/antlrphpruntime/w/list

C'est abandonné, mais je pense que ça devrait encore marcher.

0