Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Regulärer Ausdruck - Unerwartetes Verhalten

  Alt 28. Sep 2014, 12:46
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.")
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat