Ich arbeite viel daran, PHP-Code zu manipulieren und zu analysieren. Normalerweise benutze ich dazu nur den Tokenizer . Für die meisten Anwendungen ist dies ausreichend. Aber manchmal ist das Parsen mit einem Lexer (offensichtlich) einfach nicht zuverlässig genug.
Daher suche ich nach einem in PHP geschriebenen PHP-Parser. Ich habe hnw / PhpParser und kumatch / stagehand-php- parser gefunden . Beide werden durch eine automatisierte Konvertierung von zend_language_parser.y in eine .y-Datei mit PHP anstelle von C erstellt (und dann in einen LALR (1) -Parser kompiliert). Mit dieser automatisierten Konvertierung kann jedoch nicht gearbeitet werden.
Gibt es einen anständigen PHP-Parser, der in PHP geschrieben ist? (Ich brauche eine für PHP 5.2 und eine für 5.3. Aber nur eine davon wäre auch ein guter Ausgangspunkt.)
Antworten:
Nachdem hier kein vollständiger und stabiler Parser gefunden wurde, habe ich beschlossen, selbst einen zu schreiben. Hier ist das Ergebnis:
Das Projekt unterstützt Parsing-Code, der für jede PHP-Version zwischen PHP 5.2 und PHP 7.1 geschrieben wurde.
Neben dem Parser selbst bietet die Bibliothek einige verwandte Komponenten:
Eine Übersicht über die Verwendung finden Sie im Abschnitt "Verwendung grundlegender Komponenten" in der Dokumentation .
quelle
Dies wird keine großartige Option für Sie sein, da es die reine PHP-Einschränkung verletzt, aber:
Vor einiger Zeit beschlossen die PHP-Interna-Leute, auf Lemon als Parsing-Technologie umzusteigen. Es gibt einen Zweig im PHP-SVN-Repo , der die erforderlichen Änderungen enthält.
Sie beschlossen, damit nicht fortzufahren , da sie feststellten, dass ihre Zitronenlösung etwa 10-15% langsamer ist. Aber die Niederlassung ist immer noch da.
Es gibt einen älteren Lemon-Parser , der als PHP-Erweiterung geschrieben wurde. Möglicherweise können Sie damit arbeiten. Es gibt auch dieses PEAR-Paket . Es gibt auch dieses andere Zitronenpaket (über diesen Blog-Beitrag über PGN ).
Selbst wenn Sie es zum Laufen bringen, bin ich mir natürlich nicht sicher, was Sie mit den Daten machen würden oder wie die Daten überhaupt aussehen.
Eine andere verrückte Option wäre ein Blick auf Quercus , eine PHP-Implementierung in Java. Sie müssten einen Parser geschrieben haben, vielleicht lohnt es sich, ihn zu untersuchen.
quelle
Das Metrik-Tool PHP Depend enthält Code zum Generieren eines AST aus einer vollständig in PHP geschriebenen PHP-Quelle. Für die Tokenisierung wird jedoch PHPs eigenes token_get_all verwendet.
Der Quellcode ist auf github verfügbar: https://github.com/manuelpichler/pdepend/tree/master/src/main/php/PHP/Depend
Die Implementierung des AST für einige Teile wie mathematische Ausdrücke war bei meiner letzten Überprüfung noch nicht abgeschlossen, aber laut dem Autor ist dies das Ziel.
quelle
Nun, das ist nicht in PHP, sorry, aber das Erstellen dieser Art von Maschinen ist schwierig, und PHP ist nicht besonders für die Aufgabe der Sprachverarbeitung geeignet.
Unser PHP-Frontend bietet vollständiges Parsen von PHP 4.x und 5.x (EDIT 9/2016: behandelt jetzt PHP 7), erstellt automatisch ASTs mit allen Details einer vollständigen PHP-Grammatik und kann aus den ASTs kompilierbaren Quelltext generieren. Dies ist schwieriger, als es sich anhört, wenn Sie alle verrückten Details berücksichtigen, einschließlich seltsamer String-Literale, erfasster Kommentare, Zahlen mit Radix usw.
Aber ASTs sind kaum genug (Sie haben bereits beobachtet, dass Token nicht einmal genug sind).
Das DMS Software Reengineering Toolkit, auf dessen Grundlage es aufgebaut ist, bietet Unterstützung für Analysen und willkürliche Transformationen der ASTs. Es werden auch große Dateisätze gleichzeitig gelesen, was Analysen und Transformationen über PHP-Dateien hinweg ermöglicht.
quelle
Es gibt einen Port von ANTLR zu PHP: http://code.google.com/p/antlrphpruntime/w/list
Es ist aufgegeben, aber ich denke, es sollte immer noch funktionieren.
quelle