Mit regulären Ausdrücken können, wie der Name schon andeutet, nur
reguläre Sprachen geparst werden. C ist aber nicht regulär, sondern
kontextsensitiv. Manche Regex-Bibliotheken haben zwar kontextsensitive
Erweiterungen, aber auch damit dürfte es schwierig bis unmöglich sein,
bspw. beliebig verschachtelte Klammerausdrücke zu parsen, die in C-Typen
und damit in Funktionsköpfen durchaus vorkommen können.
Es gibt mehrere Möglichkeiten, einen Parser für eine kontextfreie
Grammatik zu realisieren:
- Man kann ihn selber schreiben, bspw. mit der Methode des rekursiven
Abstiegs. Hier ist die Vorgehensweise kurz beschrieben:
http://en.wikipedia.org/wiki/Recursive_descent_parser
Solch einen Parser für eine einfache Grammatik (wie diejenige für die
C-Funktionsköpfe) zu schreiben, ist nicht nicht allzu schwer, man
lernt viel dabei und kommt hinterher auch besser mit mit den beiden
folgen- den Alternativen zurecht.
- Man benutzt einen Parsergenerator, der aus einer Grammatikbeschreibung
den Programmcode für den Parser automatisch erzeugt. Hier ist eine
Liste solcher Generatoren, teilweise auch mit C# also Ausgabesprache:
http://en.wikipedia.org/wiki/Comparison_of_parser_generators#Deterministic_Context-free_Languages
- Man benutzt eine Parserbibliothek. Sehr hipp sind gerade so genannte
Parser-Combinators. Dabei enthält die Bibliothek ein paar einfache
Elementarparser und stellt Operatoren zur Verfügungen, mit denen diese
zur komplexeren Parsern kombiniert werden können:
http://en.wikipedia.org/wiki/Parser_combinator
Die Parser werden damit direkt in der Zielsprache (in deinem Fall C#)
geschrieben, sind aber wesentlich kürzer, übersichtlicher und leichter
erweiterbar als handgeschriebene Recursive-Descendent-Parser (s.o.).
Am eindruckvollsten ist dieses Prinzip in der Parsec-Bibliothek für
Haskell implementiert. Einen F#-Klon davon, der ja dank .NET leicht in
C#-Programmen einsetzbar sein sollte, gibt es hier:
http://www.quanttec.com/fparsec/
Aber auch in C# gibt es einige interessante Ansätze:
http://blogs.msdn.com/b/lukeh/archive/2007/08/19/monadic-parser-combinators-using-c-3-0.aspx
http://code.google.com/p/sprache/
http://microparser.codeplex.com/
http://archive.msdn.microsoft.com/RxParsers
Google findet noch mehr davon.