AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte PHP Inspection Unit

PHP Inspection Unit

Ein Thema von mirage228 · begonnen am 1. Nov 2004 · letzter Beitrag vom 19. Aug 2007
Antwort Antwort
Seite 10 von 14   « Erste     8910 1112     Letzte » 
Benutzerbild von mirage228
mirage228
Registriert seit: 23. Mär 2003
Hallo,

ich habe mich die letzter Zeit ein wenig mit regulären Ausdrücken beschäftigt. Daraus ist die folgende Unit entstanden.

Mit ihr ist es möglich eine PHP Datei zu analysieren. Dabei werden Klassen und Interfaces mit deren Methoden und Variablen aufgelistet, sowie Methoden ohne Klassenbezug und eingebundene Dateien (über include, require, etc.).
Ab Version 1.9 gibt es auch eine vollständige Unterstützung für Konstanten jeglicher Art (define oder PHP5-Klassenkonstanten).

Das ganze wird hierarchisch in einer Klassenstruktur zusammengefasst. Die für Benutzer relevante Klasse sollte die Klasse TPHPSource in der Unit uPHPInspector.pas sein. Ihr wird beim Konstruktor der PHP Quelltext übergeben und daraus werden die Klassen etc. herausgeparsed. Die anderen Klassen in der Unit sollten nicht direkt instanziert werden.
Die Verwendung der Eigenschaften der einzelnen Klassen sollte relativ einfach sein. Bei Rückfragen, bitte hier in den Thread schreiben.

Zum Parsen verwende ich, wie gesagt, reguläre Ausdrücke. Da die native Delphi Bibliothek Hier im Forum suchenTRegExpr in einem für mich wichtigem Punkt nicht ganz vollständig war, bin ich auf die Wrapperklasse von http://www.renatomancuso.com umgestiegen. Der einzige Nachteile daraus ist der größere overhead, da Anwendungen die PCRE.dll mitliefern müssen, die mit knapp 200 KB zu Buche schlägt.

Neu ab Version 1.2:
Es lässt sich nun eine Syntaxprüfung durchführen. Dazu muss man die Funktion SyntaxCheck der Klasse TPHPSource aufrufen. Dabei kann man zwischen reiner Syntaxprüfung und einer vollständigen Ausführung der Datei wählen. Bei der Syntaxprüfung werden nur rein syntaktische Fehler erkannt. Nicht vorhandene Include-Dateien oder undefinierte Funktionen werden nicht erkannt. Dazu muss der erste Parameter auf TRUE gesetzt werden.
Im Zweiten Parameter "FileName" kann noch eine Datei zur Syntaxprüfung übergeben werden (Die Datei wird nicht automatisch von TPHPSource geparsed!)
Wichtig beim Testen eurer Sources ist, dass ihr die <? und ?> nicht vergessen dürft, da die Syntaxprüfung ansonsten immer = TRUE ergibt (der Text wird dann einfach ausgegeben ohne geparsed zu werden). Zudem wird euer Source dann nicht vom PHP Inspector geparsed, wenn die PHP-Tags (<? .. ?>) fehlen (ab Version 1.6).
Das Verhalten kann durch die StrictPHPTagCheck Eigenschaft beeinflusst werden.

Im Anhang befinden sich nun:
  • PHPInspector.zip Der "PHP Inspector" in der Version 2.6 (PCRE.dll und Wrapper Units included; Version 5.0 vom 26. Oktober 2004)
  • sample_application.zip Eine Beispielanwendung, samt Source.
  • php_source_analyzer.jpg Ein Screenshot der Beispielanwendung.

Freue mich auf euer Feedback

mfG
mirage228
Miniaturansicht angehängter Grafiken
php_source_analyzer_685.jpg  
Angehängte Dateien
Dateityp: zip phpinspector_160.zip (130,1 KB, 272x aufgerufen)
Dateityp: zip sample_application_661.zip (334,9 KB, 300x aufgerufen)

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
 
Benutzerbild von Pr0g
Pr0g

 
Delphi 7 Personal
 
#91
  Alt 23. Jan 2005, 21:50
Zitat von DSeven:
Werde aber einige Sachen nicht übernehmen zum Beispiel das compilieren von PHP Code mittels php.exe. Das sollte jeder für sich machen.
Da denke ich auch, dass sowas nicht rein muss, könnte vielleicht als zweite/andere Unit veröffentlicht werden, falls überhaupt nötig.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#92
  Alt 24. Jan 2005, 06:22
Hi DSeven,

Du kannst die Unit gerne nach C# portieren, wenn Du magst
Ich könnte auch mal versuchen, dass ganze in Delphi.NET als Assembly zu kompilieren. Das kannste dann ja auch in C# verwenden.
Mich würde auch mal der Geschwindigkeitsunterschied zwischen den aktuellen RegExes und den .NET RegExes interessieren

Nun gut, wenn ihr das nicht möchtet, lasse ich das mit den Includes parsen weg. Das ist vielleicht wirklich etwas, was der Benutzer selbst erledigen sollte.
Das mit dem PHP Syntax Check war aber eigentlich dazu gedacht, dem Benutzer die Möglichkeit zu geben um zu überprüfen, ob sein Code richtig ist. Falls dieser nämlich Syntaxfehler enthält, können beim Parsen auch unerwartete Resultate auftreten. Und bevor das passiert, kann man halt überprüfen, lassen ob alles so läuft, wie es soll. Aber das könnte man auch auslagern, das stimmt schon.

mfG
mirage228

P.S.: Bald gibts wieder was Neues
David F.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#93
  Alt 25. Jan 2005, 20:47
Abend,

heute ist es endlich so weit
Die Version 2.0 ist endlich fertig.

Es gibt massig Bugfixes und natürlich wieder einige neue Features.

Hier die komplette Liste aller Änderungen:
  • Fehler behoben, dass einige IRegEx Interfaces im finalization Abschnitt nicht auf "nil" gesetzt wurden.
  • Fehler beim Erkennen von Default-Parametern von Methoden, die ein Komma enthielten, behoben.
  • Fehler behoben, dass eine Include-Dateie nicht erkannt wurde, falls Sie das letzte Element im
    Quelltext waren und kein Komma am Ende besaß. Bitte beachten, dass in diesem Fall unter gewissen Umständen das gematchte Resultat etwas länger sein kann, als erwartet, da in diesem Fall bis zum Ende der Zeile gematched wird.
  • Fehler behoben, dass das Parsen fortgesetzt wurde, auch wenn keine korrekten PHP-Tags gefunden wurden. Dieser Fehler trat auf, falls wenn der PHP-Tag auskommentiert war und der PHP Inspector versucht hat, den nächsten korrekten Tag zu finden.
  • Fehler behoben, dass define()-Konstanten nicht erkannt wurden, falls der Wert der Konstante
    mit einer Variable initialisert wurde.
  • Fehler behoben, dass define()-Konstanten nicht erkannt wurden, falls der letzte Parameter (der Dritte) keine Zahl war.
  • Fehler behoben, dass die temporäre Datei, die beim SyntaxCheck() evtl. erstellt wurde, nicht gelöscht worden ist, falls der Syntaxcheck keine Fehler aufwies.
  • Endlosschleifen in TPHPSource.FindInterface(), TPHPSource.FindClass() und TPHPSource.FindMethod() behoben.
  • Die Deklaration von TPHPSource.FindMethod() wurde nun wieder so eingerichtet, dass auch Interfaces in den AClass Parameter übergeben werden können.
  • Fehler behoben, dass ein implementiertes Interface einer Klasse nicht erkannt wurde, falls die Klasse bereits eine andere Klasse erweiterte.
  • Option zum Aufsuchen aller lokal referenzierten Variablen einer Methode hinzugefügt.
    Dieses Feature ist standardmäßig deaktivert. Man kann es aber durch den $FUNCTIONVARIABLES
    Compilerschalter aktivieren.
  • Unterstützung für Klassen-Konstanten nun auch für Interfaces hinzugefügt.
  • Neue Eigenschaft ExtendsInterface für TPHPInterface. Es enthält den Namen des Interfaces,
    dass von dem jeweiligen TPHPInterface erweitert wird.
  • Mehrfachvererbung bei Interfaces wird nun unterstützt. Es werden alle implementierten (TPHPClass) und erweiterten (TPHPInterface) Interfaces erkannt.
  • RegEx Konstanten sind nun als resourcestrings deklariert.

Auch wenn es so viel Neues gibt, hat sich die Parsinggeschwindigkeit dabei nur minimal verlangsamt.

Ich habe mir Mühe gegeben so gut wie alles zu testen. Solltet ihr dennoch Fehler finden, sagt mir bitte bescheid

Den Download findet ihr, wie bereits zuvor, im ersten Beitrag des Threads.

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

 
Delphi 7 Personal
 
#94
  Alt 26. Jan 2005, 14:00
Werde das Update in Webweaver integrieren und auch genauer testen, wenn ich wieder weitermache
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#95
  Alt 29. Jan 2005, 18:51
Hiho,

habe eben noch einen klein Fehler berichtigt, der verursachte, dass die TextPos von Entitites in einer Klasse, die ein Interface implementierte nicht korrekt waren.

Die verbesserten Archive sind im ersten Beitrag zu finden

Wer sich die Datei eben selbst patchen möchte, der ändere bitte folgende Zeile (befindet sich hinter dem "implementation")
Delphi-Quellcode:
  CLASSSTR = '((((\s+)(extends)(\s+)(\w+?)|)(((\s+)(implements)(\s+)' +
    '(.*)(\s*)(?:\{))|))|)';
zu

Delphi-Quellcode:
  CLASSSTR = '((((\s+)(extends)(\s+)(\w+?)|)(((\s+)(implements)(\s+)' +
    '(.*)(\s*)(?=\{))|))|)';
mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#96
  Alt 5. Mär 2005, 17:04
Hi ho,

Heute gibts wieder eine Version des PHP Inspektors: Es ist die Version 2.1

Sie enthält nicht viele neue Features, sie berichtigt hauptsächlich einen Fehler, der mir aufgefallen ist.

Hier also die Liste der Änderungen:
  • Fehler behoben, dass Funktionen, die eine Referenz zurücklieferten (Funktionsname begann mit "&"), nicht erkannt wurden.
  • Neue Boolean-Eigenschaft ReturnsReference für TPHPMethod und alle seine Nachfahren. Damit kann bestimmt werden, ob eine Funktion eine Referenz zurückgibt oder nicht.

Auch habe ich eine (englische) Readme-Datei im HTML Format geschrieben, die einen kurzen Überblick über die Features des PHP Inspektors gibt und kurz erläutert, wie man ihn verwendet.

Den Download gibts, wie immer, im ersten Beitrag

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#97
  Alt 5. Mär 2005, 18:06
Danke für die neue Version.

Werde sie gleich mal testen.

cya
  Mit Zitat antworten Zitat
DSeven
 
#98
  Alt 13. Mär 2005, 23:35
Hallo,

So habe mir mal die Mühe gemacht und einen PHPDoc Parser geschrieben. Bin aber noch nicht dazu gekommen ihn in deine Unit einzubauen.
Der Parser geht folgender massen vor: Wenn deine Unit nach einer Klasse, Funktion Parst bzw. eine gefunden hat dann schaltet sich mein Parser ein und sucht ein PHPDoc Comment.

Das Problem ist jetzt nur, ich weis nicht wirklich wie ich das in meinen Editor (denn ich weiter mache) einbauen kann.

Wenn ich Fertig bin werde ich die unit mal posten.

cya
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#99
  Alt 14. Mär 2005, 16:35
Zitat von DSeven:
Hallo,

So habe mir mal die Mühe gemacht und einen PHPDoc Parser geschrieben. Bin aber noch nicht dazu gekommen ihn in deine Unit einzubauen.
Der Parser geht folgender massen vor: Wenn deine Unit nach einer Klasse, Funktion Parst bzw. eine gefunden hat dann schaltet sich mein Parser ein und sucht ein PHPDoc Comment.
Hi,

das ist ja echt klasse
Ich denke Deine Parsing Funktion / Klasse sollte sich ganz gut mit der TPHPComment(s) zusammenbringen lassen, da die ja beim finden eines Entities sowieso prüft, ob dieser in Kommentaren ist. Danach könntest Du ja Dich ja der bereits gefundenen Kommentare bedienen.

Zitat:
Das Problem ist jetzt nur, ich weis nicht wirklich wie ich das in meinen Editor (denn ich weiter mache) einbauen kann.
Also von der GUI aus könntest Du ja unter jede Klasse einen bearbeitbaren Kommentar-Node ins TreeView einfügen oder so...

Zitat:
Wenn ich Fertig bin werde ich die unit mal posten.
Ah gut, mich würde besonders die genau technische Realisierung (Regexe etc.) interessieren

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#100
  Alt 14. Mär 2005, 18:41
Zitat von mirage228:
Zitat:
Wenn ich Fertig bin werde ich die unit mal posten.
Ah gut, mich würde besonders die genau technische Realisierung (Regexe etc.) interessieren
Naja da hab ich es nicht so mit Regexe. Deswegen weis ich ja auch nicht wie sich das in deine Unit einbringen liesse weil mein Code ohne Regexe arbeitet. Aber er arbeitet ohne Fehler.
Kann sein das meine Methode auch ein wenig umständlich ist da ich zeichen für zeichen durchgehe. Aber eigentlich hab ich damit noch keine wirklichen probleme was speed oder funktionalität angeht.

cya
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf