2009-08-10 17 views
0

Ich habe einen pascal Code-Datei zu erhalten und müssen es analysieren (mit C#) und zeigt alle öffentlichen Funktionen, sieht meine Datei so etwas wie, dass (nicht unbedingt Code):Regular Expression pascal Funktionen

public 
    function Test(str: string):bool; 
    function Test1(str: string):bool; 
    function Test2(str,str1,str2,str3 
       str4: string):bool; 
    function Test3(str: string):bool; 
published 

Beachten Sie Test2 dort und wie es in mehreren Zeilen ist. Ich kann einige grundlegende (sehr einfache) reguläre Ausdrücke machen, aber ich kann nichts machen, was damit funktioniert. Grundsätzlich was ich brauche, ist: alle Funktionen zwischen den Strings "public" und "published" erhalten und es in einer einzigen Zeile zurückgeben ...

Antwort

1

ich Ihnen einige regexs Prozeduren und Funktionen zu erhalten, die haben oder haben keine Parameter

rproc1 = "(?<!\w)procedure\s+[\w\s.]+;" 
rproc2 = "(?<!\w)procedure\s+[\w\s.]+\([\w\s,.=':;$/*()]*?\)\s*;" 

rfunc1 = "(?<!\w)function\s+[\w\s.]+:\s*\w+\s*;" 
rfunc2 = "(?<!\w)function\s+[\w\s.]+\([\w\s,.=':;$/*()]*?\)\s*:\s*\w+\s*;" 

Sie sind eine Art von Heuristiken. Erwarten Sie nicht, dass alle möglichen Funktionsdeklarationen übereinstimmen.

+0

Dank Nick, kombiniert rfunc1 und rfunc2 gab mir das Ergebnis, das ich brauchte :) –

+0

Ein Parser wäre eine bessere Lösung, aber trotzdem, ich bin froh, dass ich helfen konnte. –

5

Dies wird sehr schwer zu tun, wenn nicht unmöglich. Denken Sie nur an alle Probleme mit Strings, Kommentaren und Escape-Sequenzen. Wenn ich Sie wäre, würde ich stattdessen einen Pascal-Parser verwenden.

Hier ist eine Seite mit lexx/yacc Grammatiken für Pascal:

http://www.moorecad.com/standardpascal/yacclex.html

Hier einige Informationen über yacc und lexx:

http://dinosaur.compilertools.net/

Mit diesen vorgefertigten Tools für Sie, können Sie Erzeugt in kürzester Zeit einen Parser, der viel besser funktioniert als jeder reguläre Ausdruck. obwohl