Dies ist ein PHP-Parser im Frühstadium, der von Anfang an für IDE-Nutzungsszenarien entwickelt wurde (weitere Einzelheiten finden Sie unter Designziele). Es gibt noch eine Menge Arbeit zu erledigen, daher dient dieses Repo an dieser Stelle hauptsächlich als Experiment und als Beginn eines Gesprächs.
Dies ist der v0.1-Zweig, der Datenstrukturen ändert, um die Syntax zu unterstützen, die nach der ersten Versionslinie 0.0.x hinzugefügt wurde.
Nachdem Sie Ihren Computer konfiguriert haben, können Sie den Parser verwenden, um über eine benutzerfreundliche API den Abstract Syntax Tree (AST) zu generieren und damit zu arbeiten.
<?php// Erforderliche Klassen automatisch ladenrequire __DIR__ . "/vendor/autoload.php";use MicrosoftPhpParser{DiagnosticsProvider, Node, Parser, PositionUtilities};// Neue Parser-Instanz instanziieren$parser = new Parser();// Einen AST aus dem String-Inhalt zurückgeben und drucken$astNode = $parser ->parseSourceFile('<?php /* comment */ echo "hi!"');var_dump($astNode);// Ruft Fehler vom AST-Knoten ab und gibt sie aus. Der Parser behandelt Fehler ordnungsgemäß,// sodass er in IDE-Verwendungsszenarien verwendet werden kann (wo der Code oft unvollständig ist).$errors = DiagnosticsProvider::getDiagnostics($astNode);var_dump($errors);// Alle Knotennachkommen von durchlaufen $astNodeforeach ($astNode->getDescendantNodes() as $descendant) {if ($descendant exampleof NodeStringLiteral) {// Den Knotentext drucken (ohne Leerzeichen oder Kommentare)var_dump($descendant->getText());// Alle Knoten verweisen auf ihre übergeordneten Knoten, sodass die Navigation im Baum einfacher ist.$grandParent = $descendant- >getParent()->getParent();var_dump($grandParent->getNodeKindName());// Der AST ist vollständig repräsentativ und Round-Trip-fähig zur Originalquelle.// Dadurch können Verbraucher zuverlässige Formatierungs- und Refactoring-Tools erstellen.var_dump($grandParent->getLeadingCommentAndWhitespaceText()); }// Zusätzlich zum Abrufen aller Kinder oder Nachkommen eines Knotens// stellen Knoten Eigenschaften bereit, die für den Knotentyp spezifisch sind.if ($descendant Instanz von NodeExpressionEchoExpression) {$echoKeywordStartPosition = $descendant->echoKeyword->getStartPosition();// Um den Speicherverbrauch zu reduzieren, werden Positionen als einzelner Integer//-Index im Dokument dargestellt, ihre Zeilen- und Zeichenpositionen sind jedoch einfach abgerufen.$lineCharacterPosition = PositionUtilities::getLineCharacterPositionFromPosition($echoKeywordStartPosition,$descendant->getFileContents() );echo "Zeile: $lineCharacterPosition->Zeile, Zeichen: $lineCharacterPosition->Zeichen"; } }
Hinweis: Die API ist noch nicht fertiggestellt. Melden Sie uns daher bitte bei Problemen und teilen Sie uns mit, welche Funktionalität Sie verfügbar machen möchten. Wir werden dann sehen, was wir tun können! Bitte melden Sie auch alle Fehler mit unerwartetem Verhalten im Parse-Baum. Wir befinden uns noch in einem frühen Stadium und wir freuen uns über Ihr Feedback.
Fehlertolerantes Design – in IDE-Szenarien ist Code per Definition unvollständig. Falls ungültiger Code eingegeben wird, sollte der Parser dennoch in der Lage sein, einen gültigen + vollständigen Baum sowie relevante Diagnosen wiederherzustellen und zu erstellen.
Schnell und leicht (sollte in der Lage sein, mehrere MB Quellcode pro Sekunde zu analysieren, um Platz für andere Funktionen zu lassen).
Speichereffiziente Datenstrukturen
Ermöglichen Sie inkrementelles Parsen in der Zukunft
Entspricht der PHP-Sprachspezifikation und unterstützt sowohl die PHP5- als auch die PHP7-Grammatik
Generiertes AST stellt Eigenschaften (vollständig repräsentativ usw.) bereit, die für semantische und transformative Operationen erforderlich sind, die auch leistungsfähig sein müssen.
Vollständig repräsentativ und umkehrbar auf den Text, aus dem es analysiert wurde (alle Leerzeichen und Kommentar-„Trivia“ sind im Analysebaum enthalten).
Es ist möglich, den Baum problemlos über übergeordnete/untergeordnete Knoten zu durchlaufen
< 100 ms UI-Antwortzeit, daher sollte jeder Sprachservervorgang < 50 ms dauern, um Platz für alle anderen Dinge zu lassen, die parallel ablaufen.
Einfach und im Laufe der Zeit wartbar – Parser neigen dazu, sehr verwirrend und sehr schnell zu werden, daher haben Lesbarkeit und Debug-Fähigkeit höchste Priorität.
Testbar – der Parser sollte nachweislich gültige Analysebäume erzeugen. Dies erreichen wir, indem wir eine Reihe von Invarianten für den Baum definieren und kontinuierlich testen.
Freundliche und beschreibende API, um es anderen zu erleichtern, darauf aufzubauen.
In PHP geschrieben – machen Sie es der PHP-Community so einfach wie möglich, sie zu nutzen und Beiträge zu leisten.
Um bei jedem Schritt ein ausreichendes Maß an Korrektheit zu gewährleisten, wird der Parser mit dem folgenden inkrementellen Ansatz entwickelt:
Phase 1: Schreiben Sie einen Lexer, der die PHP-Grammatik nicht unterstützt, aber EOF und unbekannte Token unterstützt. Schreiben Sie Tests für alle Invarianten.
Phase 2: Unterstützung der lexikalischen PHP-Grammatik, viele Tests
Phase 3: Schreiben Sie einen Parser, der die PHP-Grammatik nicht unterstützt, aber einen Baum mit Fehlerknoten erzeugt. Schreiben Sie Tests für alle Invarianten.
Phase 4: Unterstützung der syntaktischen PHP-Grammatik, viele Tests
Phase 5 (in Bearbeitung): Validierung und Optimierung in der Praxis
Korrektheit: Überprüfen Sie, ob bei Beispielcodebasen keine Fehler auftreten, vergleichen Sie sie mit anderen Parsern (untersuchen Sie etwaige Unstimmigkeiten), Fuzz-Tests
Leistung: Profil, Benchmark mit großen PHP-Anwendungen
Phase 6: Finalisieren Sie die API, um den Nutzern den Konsum so einfach wie möglich zu machen.
Einige der grammatikalischen Konstrukte von PHP (nämlich yield-expression und template strings) werden noch nicht unterstützt und es gibt auch andere verschiedene Fehler. Da der Parser jedoch fehlertolerant ist, werden diese Fehler ordnungsgemäß behandelt und der resultierende Baum ist ansonsten vollständig. Um einen ganzheitlicheren Eindruck davon zu bekommen, wo wir uns befinden, können Sie die Testsuite „Validierung“ ausführen (weitere Informationen zum Ausführen von Tests finden Sie in den Beitragsrichtlinien). Oder werfen Sie einfach einen Blick auf die aktuellen Validierungstestergebnisse.
Auch wenn wir noch nicht mit der Leistungsoptimierungsphase begonnen haben, haben wir bisher vielversprechende Ergebnisse erzielt und es gibt noch viel Raum für Verbesserungen. Weitere Informationen zu unserem aktuellen Ansatz finden Sie unter „Wie es funktioniert“ und führen Sie die Leistungstests auf Ihrem eigenen Computer durch, um sich selbst davon zu überzeugen.
Designziele – Erfahren Sie mehr über die Designziele des Projekts (Funktionen, Leistungsmetriken und mehr).
Dokumentation – Erfahren Sie, wie Sie den Parser Ihres Projekts referenzieren und Vorgänge am AST ausführen, um Fragen zu Ihrem Code zu beantworten.
Syntax Visualizer Tool – erhalten Sie ein greifbareres Gefühl für den AST. Werden Sie kreativ – sehen Sie, ob Sie es schaffen!
Aktueller Stand und Ansatz – wie viel der Grammatik wird unterstützt? Leistung? Erinnerung? API-Stabilität?
Wie es funktioniert – erfahren Sie mehr über die Architektur, Designentscheidungen und Kompromisse.
Lexer und Parser
Fehlertoleranzstrategie
Inkrementelles Parsen
Offene Fragen
Validierungsstrategie
Beitragen! - Erfahren Sie, wie Sie mitmachen können, sehen Sie sich einige Hinweise zu Bildungs-Commits an, die Ihnen dabei helfen, die Codebasis zu verbessern (auch wenn Sie noch nie zuvor an einem Parser gearbeitet haben), und empfehlen Sie Arbeitsabläufe, die die Iteration einfacher machen.
Dieses Projekt hat den Microsoft Open Source Verhaltenskodex übernommen. Weitere Informationen finden Sie in den FAQ zum Verhaltenskodex oder wenden Sie sich bei weiteren Fragen oder Kommentaren an [email protected].