www.mikrocontroller.net

Forum: PC-Programmierung C#: Parser für Funktionsdefinitionen


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

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

Bin um jeden Tipp und weiterführenden Link dankbar.

Grüße
Martin

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Moment geht es um C-Funktionen, die unter C# geparst werden sollen. 
Will ein Hilfstool programmieren, das bei der Erstellung von 
Funktionsbeschreibungen assistiert.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner eine Idee?

Autor: Jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quellcodedatei einlesen und mittels regulärer Ausdrücke Zeile für Zeile 
lesen und auswerten. NET bietet eine ziemlich gute REGEX-Engine (an Perl 
angelehnt).

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist eigentlich gar nicht so schwer. Ich habe mir damals folgendes Buch 
zugelegt:

Reguläre Ausdrücke, 3. Auflage, Jeffrey E.F. Friedl

http://www.oreilly.de/catalog/regex3ger/

Es behandelt die Grundlagen und die Engines verschiedener Sprachen 
(Perl,Python,NET usw.)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja das ganze per RegEx zu machen halten ich nicht für sinnvoll.

denn es gibt ja auch solche definitionen

static int Test(/*bla*/int i, double e, int (*pFunc)(int, double),char* 
x = 5)

Autor: Jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> denn es gibt ja auch solche definitionen
>
> static int Test(/*bla*/int i, double e, int (*pFunc)(int, double),char*
> x = 5)

Ja, und?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jack schrieb:
> Ja, und?

für solche sachen finde ich regex nicht schön. Ich glaube auch nicht das 
der compiler regex verwendet und das wird sein grund haben.

Autor: Jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Alternative schlägst du vor?

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es denn endlich mal einen passenden CodeDomProvider gäbe, wäre es 
einfach.
Ansonsten würde ich mir z.B. mal 
http://www.devincook.com/goldparser/download.htm ansehen

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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_...

- 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/m...
    http://code.google.com/p/sprache/
    http://microparser.codeplex.com/
    http://archive.msdn.microsoft.com/RxParsers

  Google findet noch mehr davon.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.