Wykonuję dużo pracy, manipulując i analizując kod PHP. Zwykle używam do tego Tokenizera . W większości zastosowań jest to wystarczające. Ale czasami parsowanie przy użyciu leksera po prostu nie jest wystarczająco niezawodne (oczywiście).
Dlatego szukam parsera PHP napisanego w PHP. Znalazłem hnw / PhpParser i kumatch / stagehand-php-parser . Oba są tworzone przez automatyczną konwersję zend_language_parser.y do pliku .y z PHP zamiast C (a następnie skompilowane do parsera LALR (1)). Ale z tą automatyczną konwersją po prostu nie można pracować.
Czy jest jakiś przyzwoity parser PHP napisany w PHP? (Potrzebuję jednego dla PHP 5.2 i jednego dla 5.3. Ale tylko jeden z nich też byłby dobrym punktem wyjścia).
Odpowiedzi:
Ponieważ nie znaleziono tu kompletnego i stabilnego parsera, zdecydowałem się napisać go samodzielnie. Oto wynik:
Projekt obsługuje parsowanie kodu napisanego dla dowolnej wersji PHP od PHP 5.2 do PHP 7.1.
Oprócz samego parsera biblioteka zawiera kilka powiązanych komponentów:
Przegląd użycia można znaleźć w sekcji „Użycie podstawowych składników” w dokumentacji .
źródło
To nie będzie dla ciebie świetna opcja, ponieważ narusza ograniczenie czystego PHP, ale:
Jakiś czas temu ludzie z php-internals zdecydowali, że przejdą na Lemon jako technologię parsowania. W repozytorium svn PHP znajduje się gałąź, która zawiera wymagane zmiany.
Postanowili nie kontynuować tego , ponieważ stwierdzili, że ich roztwór Lemon jest o około 10-15% wolniejszy. Ale gałąź wciąż tam jest.
Istnieje starszy parser Lemon napisany jako rozszerzenie PHP. Możesz z tym pracować. Jest też ten pakiet PEAR . Jest też ta inna paczka z cytryną (za pośrednictwem tego wpisu na blogu o PGN ).
Oczywiście, nawet jeśli sprawisz, że to zadziała, nie jestem pewien, co zrobiłbyś z danymi, ani jak one w ogóle wyglądają.
Inną zwariowaną opcją byłoby zajrzenie do Quercus , implementacji PHP w Javie. Musieliby napisać parser, może warto to zbadać.
źródło
Narzędzie pomiarowe PHP Depend zawiera kod do generowania AST ze źródła PHP napisanego w całości w języku PHP. Jednak korzysta z własnego token_get_all PHP do tokenizacji.
Kod źródłowy jest dostępny na github: https://github.com/manuelpichler/pdepend/tree/master/src/main/php/PHP/Depend
Implementacja AST dla niektórych części, takich jak wyrażenia matematyczne, nie była jeszcze zakończona, kiedy ostatnio sprawdzałem, ale według jego autora jest to cel.
źródło
Cóż, to nie jest w PHP, przepraszam, ale budowanie tego rodzaju maszyn jest trudne, a PHP nie jest szczególnie przystosowane do przetwarzania języka.
Nasz PHP Front End to zapewnia pełną 4.x PHP 5.x (EDIT 9/2016: teraz obsługuje PHP 7) analizowania, automatycznie buduje ASTs ze wszystkimi szczegółami pełnej gramatyki PHP, może generować compilable tekst źródłowy z ASTs. Jest to trudniejsze, niż mogłoby się wydawać, biorąc pod uwagę wszystkie skomplikowane szczegóły, w tym dziwne literały ciągów, przechwycone komentarze, liczby z podstawą itp.
Ale AST to za mało (zauważyłeś już, że tokeny nie są nawet wystarczające).
Podstawa, na której jest zbudowany, DMS Software Reengineering Toolkit zapewnia wsparcie dla analizy i arbitralnych przekształceń AST. Odczytuje również duże zestawy plików naraz, umożliwiając analizę i transformacje w plikach PHP.
źródło
Istnieje port ANTLR na PHP: http://code.google.com/p/antlrphpruntime/w/list
Jest opuszczony, ale myślę, że powinien nadal działać.
źródło