C#: Parser für Funktionsdefinitionen

Gast #2094422
Lesenswert?

Hallo!

Wie parst man am einfachsten eine Funktionsdefinition?
Bsp.:
Eingabe:
1
static int Test(/*bla*/int i, double e,char* x)
Ergebnis:
1
Funktion: Test
2
Return: int
3
Parameter: * i vom Type int
4
           * e vom Type double
5
           * x vom type char*

Bin um jeden Tipp und weiterführenden Link dankbar.

Grüße
Martin
Gast #2094428
Lesenswert?

sag doch lieber erstmal etwas genauer was du vor hast. Geht es mit C 
quellen die mit c# geparst werden sollen oder geht es im C# Quellen? 
Wenn es um C# geht kann man es über refection ohne parsen erledigen.
Gast #2095783
Lesenswert?

Ich hab's befürchtet. Regex hatte ich auch schon im Sinn, nur habe ich 
das noch nie verstanden und meine bisherigen Versuche Regex-Ausdrücke 
selbst zu erstellen ist bisher immer kläglich gescheitert...
Moderator #2096360
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren