Autor Beitrag
mirage228
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 338

Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
BeitragVerfasst: So 20.03.05 14:14 
Hallo,

Ich möchte an dieser Stelle meine "PHP Inspection Unit" vorstellen.
Sie ist entstanden, als ich mich etwas mit regulären Ausdrücken auseinandergesetzt habe.

Mit ihr ist es möglich eine PHP Datei zu analysieren. Dabei werden Klassen mit deren Methoden und Variablen aufgelistet, sowie Methoden ohne Klassenbezug und eingebundene Dateien (über include, require, etc.) - Eine komplette Featureliste gibt es weiter unten.

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 Suche in: Delphi-Forum, Delphi-Library TREGEXPR in einem für mich wichtigem Punkt nicht ganz vollständig war, bin ich auf die Wrapperklasse von 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.

Es lässt sich auch 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. Das Verhalten kann durch die StrictPHPTagCheck Eigenschaft beeinflusst werden.

Eine Liste aller Features:

  • Schnelles parsen von PHP4, PHP5 und gemischten (HTML und PHP z.B.) Dateien
  • Aufzählen von Klassen im Quelltext mitsamt alles Methoden und Variablen. Bei den Methoden wird angegeben, ob die statisch, final oder abstrakt sind. Es gibt auch eine vollständige Parameterliste. Dann gibt es dort noch die Möglichkeit sich den kompletten Funktionskopf bzw. -körper zurückgeben zu lassen, sowie den Anfang und das Ende der Brackets {}. Ahja, und die Sichtbarkeit wird auch angegeben (private, protected, public). Bei Variablen kann man neben den Namen und der Sichtbarkeit den Wert herausfinden, mit dem die Variable ggf. initialisiert wurde. Auch werden Klassenkonstanten aufgelistet, die die Eigenschaften für den Namen und den Wert haben. Des weiteren kann man abfragen, welches Interface von der Klasse implementiert ist bzw. von welcher Klasse die Klasse abgeleitet ist.
  • Aufzählung aller per include, include_once, require und require_once eingebundenen Dateien (+ Namen der Datei)
  • Aufzählung für globale Konstanten (defines)
  • Auflistung aller Funktionen, die nicht zu einer Klasse gehören. Der Funktionsumfang ist der selbe, wie bei den Funktionen einer Klasse, jedoch gibt es hier keine Angabe, ob diese final etc. sind.
  • Auch gibt es eine Auflistung aller Interfaces samt ihrer Methoden (und den zugehörigen Eigenschaften)
  • Man kann abfragen, was für ein PHP-Element sich an welcher Position im Text befindet.
  • Möglichkeit eines Syntax- bzw. Errorchecks mit der PHP.exe
  • Umschaltung auf PHP4-Only Mode möglich. Das gibt einen großen Geschwindigkeitsschub, jedoch werden dann keinerlei PHP5 Konstrukte mehr erkannt.


Zum Download gibt es nun:

PHPInspector.zip (125 KB) - Der "PHP Inspector" in der Version 2.3 (PCRE.dll und Wrapper Units included; aktuelle Version vom 26. Oktober 2004)

sample_application.zip (350 KB) - Eine Beispielanwendung, samt Source.

php_source_analyzer.jpg (100 KB) - Ein Screenshot der Beispielanwendung.


Freue mich auf euer Feedback

mfG
mirage228

_________________
May the source be with you, stranger.


Zuletzt bearbeitet von mirage228 am So 27.03.05 16:04, insgesamt 1-mal bearbeitet
chrisdrury
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184

WinXP
D5 Prof
BeitragVerfasst: Mo 21.03.05 09:00 
Scheint eine sehr interessante Sache zu sein.
Nur leider habe ich nur D5, und der Compiler stolpert immer an dieser Stelle:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TRegex.RetrieveNames;

var
  NameCount     : Integer;
  NameEntrySize : Integer;
  Ptr           : PByte;    //hier hält der Compiler an!!
  Idx           : Word;
  i             : Integer;

begin
  FNames := TNameIndexLookup.Create();


mit der Fehlermeldung:
Undefinierter Bezeichner: 'PByte'

Leider sagt mir PByte nun auch überhaupt nichts, gibt's da vielleicht ne Möglichkeit, das in D5 lauffähig zu kriegen?
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Mo 21.03.05 09:23 
PByte entspricht einem Pointer auf einem Byte also, PByte = ^Byte. Was auch der Delphi typischen Typenbenennung entspricht.

Gruß
KidPaddle
chrisdrury
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184

WinXP
D5 Prof
BeitragVerfasst: Mo 21.03.05 10:49 
@ KidPaddle:
Vielen Dank für die Hilfe.
Hab's entsprechend geändert, Demo läuft jetzt.
mirage228 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 338

Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
BeitragVerfasst: Fr 25.03.05 20:45 
Hallo,

heute gibts eine neue Version - 2.2

Neue Features gibts diesmal nicht, dafür habe ich einige Fehler behoben :)

Liste aller Änderungen:

  • Unnötigen Aufruf von ParseEntityData beim Setzen der SourceText Eigenschaft von TPHPSource entfernt.
  • Fehler behoben, dass wenn ein PHP Konstrukt auf mehrere PHP-Tag Paare verteilt war, es nicht erkannt wurde
  • Fehler beim Herausfinden der Basisklasse im PHP4-Only Modus behoben
  • TextPos Eigenschaft lieferte in einigen Fällen nicht korrekte Resultate (Die von TextPos angegebene Position war ein Zeichen vor der eigentlichen Position)


Die Downloads auf dem Server habe ich bereits aktualisiert und die neue Version kann heruntergeladen werden :)

mfG
mirage228

_________________
May the source be with you, stranger.
mirage228 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 338

Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
BeitragVerfasst: So 27.03.05 16:06 
Hi ho,

bereits heute gibts die neue Version 2.3 ist fertig. Sie behebt, wie die Version 2.2, hauptsächlich Fehler, neue Features gibts leider keine :-(

Die neue Version enthält insgesamt folgende Änderungen:

  • Include-Dateien werden nicht mehr aufgeführt, falls kein Dateiname dahinter angegeben wird (wenn z.B. nur "include" schreibt)
  • Fehler behoben, dass Variablen fälschlicher Weise als Include-Dateien erkannt wurden (wenn man z.B. "$to_require = "file.php"" schrieb.)
  • Zugriffsverletzung behoben, die auftrat, wenn ein Include, Require, Include_Once oder Require_Once Befehl als letztes in einer Datei stand.
  • Fehler beim Parsen der Werte für Define()-Konstanten behoben
  • "placeholder" Methoden aus TPHPEntity und TPHPConstant entfernt (als "abstract" deklariert)


Der Download ist bereits aktualisiert und die Version 2.3 kann heruntergeladen werden.

mfG
mirage228

_________________
May the source be with you, stranger.
mirage228 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 338

Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
BeitragVerfasst: Mo 23.05.05 16:39 
Hallo,

heute gibt es eine (kleine ;) ) neue Version - Version 2.4.

Es gab u.U. einen Fehler bei den Positionen eines Konstrukts.

Die gesamte Liste der Änderungen:

  • Fehler bei Entity-Positionen behoben, falls Text vor einem PHP-Tag war
  • Fehler bei Entity-Positionen behoben, falls es mehrere PHP-Tag Paare gab
  • Einige kleinere Optimierungen an der FindEntity() Routine


Die Downloadlinks gibts im ersten Beitrag :)

mfG
mirage228

_________________
May the source be with you, stranger.
mirage228 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 338

Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
BeitragVerfasst: Mo 03.10.05 10:40 
Hallo,

nach einer kleinen Pause gibt es nun wieder eine neue Version. Es ist die Version 2.5. :)

Folgende Änderungen gibt es:

  • Fehler in der Kommentarerkennung behoben, falls ein \" oder \' Escape-Zeichen im Kommentar eingebunden war. In diesem Fall hatte der Parser das Parsing ab diesem Punkt abgebrochen.
  • Fehler bei der Erkennung von Include-Dateien behoben, wenn diese kein Semikolon oder Zeilenende am Ende hatte, wie z.B. <? include "somefile.htm" ?>
  • Es werden nun auch "Unix-Shell" style Kommentare akzeptiert (# <Kommentar>)
  • Neuer Compilerschalter: $NODUPLICATES (Standardmäßig aus). Wenn dieser eingeschaltet wird, dann fügt der Parser Klassen, Interfaces und Methoden nicht mehr dem Ergebnis hinzu, falls es diese bereits gefunden wurde. Sprich, es gibt keine doppelten Klassen, Interfaces oder Methoden mehr. Dies beschleunigt die Parsing-Zeit bei mehreren doppelten Klassen um einiges, ansonsten liget die Parsing-Zeit minimal über dem normalen Niveau.


Den Download gibts im ersten Beitrag ;)

mfG
mirage228

_________________
May the source be with you, stranger.