Hallo,
Heute habe ich mal ein ganz anderes Problem. Wie vielleicht der ein oder andere weiß (oder auch nicht) kann man sich in Notepad++ eine Funktionsliste der gerade geöffneten Quelltextdatei anzeigen lassen.
Das funktioniert standardmäßig allerdings nicht mit .pas Dateien.
Nun gibt es bei Notepad++ eine
XML Datei in der man für andere Sprachen reguläre Ausdrücke hinterlegen kann die den Anfang einer function/procedure erkennen.
Erkannt werden sollen aber nur die wirklichen Implementierungen, nicht die Deklaration im interface-Teil, weswegen ich meine RegEx vom Prinzip her so aufgebaut habe. (Sie funktioniert auch soweit gut, aber dazu gleich mehr):
1) "procedure" oder "function" finden
2) Danach ein Bezeichner
3) Ggf. Klammern mit beliebig vielen "Parameter: Typ;" Vorkommen
4) Ggf. ": FunktionsResultTyp"
5) beliebig viele Modifier in der Form "Modifier;"
5.1) Leerzeichen/Zeilenumbrüche
6) "begin" oder "
asm" oder "var"/"const"
Der Algorithmus ist auf keinen Fall wasserdicht aber er reicht für meine Zwecke.
Die RegEx dazu:
Code:
1) ((function|procedure)\b)
2) [\s]+[\w]+
3) (\((([\s]*[\w]+[\s]*,?)*:[\s]*[\w]+;?)*\))?
4) ([\s]*:[\s]*[\w]*)?;
5) ([\s]*[\w]+;)*
5.1) [\s]*[\n]*
6) (begin|var|const|
asm)\b
Das klappt wie gesagt ganz gut. Folgende einfache
Unit (ich habe es mal aufs Minimum runtergeschraubt):
Delphi-Quellcode:
unit cga;
interface
procedure pic_init(slaveIRQ: Byte; IRQStartIndex: Byte);
procedure cga_setattr(color: Cardinal; flags: Byte);
implementation
end.
Dort wird natürlich letztendlich nichts gefunden weil das ja nur die interface-Definitionen der Prozeduren sind. Allerdings braucht Notepad++ und auch einige online RegEx Parser sehr sehr lange (10-20 Sekunden) für das parsen der Datei. Notepad++ hängt sich dabei fast auf.
Es scheint an der Zeile
procedure pic_init(slaveIRQ: Byte; IRQStartIndex: Byte);
zu hängen. Genauer: An den Parametern. Der Prozedurname kann so bleiben. Wenn
ich der Prozedur die Parameter von cga_setattr gebe, dann dauert das parsen < 1 Sekunde.
Habe auch große .pas Dateien mit 20+ Prozeduren inkl. interface Deklarationen die in < 1 Sekunde durchlaufen. Nur diese eine Prozedur macht aus irgendwelchen Gründen Probleme.
Kann mir irgendjemand vielleicht helfen und sagen warum meine RegEx bei dieser Zeile so ins Stolpern kommt?
(regexe.de meldet "Regulärer Ausdruck ist zu tief verschachtelt. Bitte vereinfachen Sie den Ausdruck.")