Seite 1 von 1
Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 19:33
von anogayales
Hallo zusammen!
Ich schreib gerade einen kleinen Funktionsparser, der top level Funktionsnamen auflisten soll.
Hier ist der zu parsende Code:
Code: Alles auswählen
void functionname1(float a, float r) {
return min(a,r);
}
float nonesense(int b) {
function body;
}
float abs(vec3 pos) {
function body;
}
Der reguläre Ausdruck auf den ich gekommen bin lautet:
Das Ergebnis:
Leider nimmt er dabei auch das min auf. Wie kann ich sagen, dass er nur top level funtionen aufnehmen soll? Geht das mit Regulären Ausdrücken?
Es wäre nett, wenn mir jemand helfen könnte.
Grüße,
anogayales
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 19:41
von BlackJack
@anogayales: Ich würde sagen das geht nicht zuverlässig mit einem regulären Ausdruck.
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 19:42
von /me
anogayales hat geschrieben:Leider nimmt er dabei auch das min auf. Wie kann ich sagen, dass er nur top level funtionen aufnehmen soll? Geht das mit Regulären Ausdrücken?
Vergiss es. Spätestens wenn du auf Strings mit passenden Inhalten stößt ist Schluss mit lustig.
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 19:47
von BlackJack
Ergänzend zu /me: Passende Treffer in Kommentaren, zum Beispiel auskommentierter Quelltext. Ausserdem kann vor dem Funktionsnamen mehr als ein ”Wort” stehen, zum Beispiel bei ``unsigned int``. Nicht zu vergessen Schlüsselwörter wie ``static`` oder ``const``. Und der ``*``. Nach dem Funktionsnamen kann unter Umständen auch noch etwas stehen.
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 20:53
von anogayales
Danke für euren Input. Um genau zu sein parse ich GLSL Code. Dort sollten keine Konstrukte der form "unsigned integer" auftauchen. Im Grunde genommen ist es eine sehr abgespeckte form vom C-Standard. Es können wahrscheinlich weitere Probleme auftreten, aber damit kann ich leben.
Module wie pycparser finde ich dann doch eine bisschen schwergewichtig. Gibt es keinen RE, der für mein oben genanntes Beispiel und "ähnliche" das passende liefert?
Grüße,
anogayales
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 21:21
von EyDu
Da es beliebig tiefe Verschachtelungen geben kann ist ein RE nicht möglich. Mit einem Parser wirst du auf jeden Fall schneller ans Ziel kommen.
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 21:27
von lunar
@anogayales: Einen regulären Ausdruck, der Funktionssignaturen zuverlässig erkennt, gibt es erwiesenermaßen nicht. GLSL ist zwar in mancher Hinsicht einfacher, aber noch immer eine kontextfreie Sprache, welche sich mit regulären Ausdrücke nicht parsen lässt. Man kann zwar einen regulären Ausdruck für eine Funktionsdeklaration aufstellen, doch es ist unmöglich, mit einem regulären Ausdruck allein zu erkennen, ob diese Deklaration in einem Kommentar steht.
Ich bezweifele allerdings, dass pycparser GLSL parsen kann. GLSL unterscheidet sich an manchen Punkten signifikant von C. Manche GLSL-Konstrukte gibt die C-Grammatik nicht her, und so wird ein C-Parser wahrscheinlich auch an solchen Konstrukten scheitern (zumindest wenn er sich an den Standard hält).
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 22:20
von snafu
lunar hat geschrieben:Einen regulären Ausdruck, der Funktionssignaturen zuverlässig erkennt, gibt es erwiesenermaßen nicht.
Aber *muss* es den nicht geben? Der Compiler erkennt die Signatur ja schließlich auch, sonst könnte er die Übersetzung nicht leisten.
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 22:24
von Hyperion
snafu hat geschrieben:lunar hat geschrieben:Einen regulären Ausdruck, der Funktionssignaturen zuverlässig erkennt, gibt es erwiesenermaßen nicht.
Aber *muss* es den nicht geben? Der Compiler erkennt die Signatur ja schließlich auch, sonst könnte er die Übersetzung nicht leisten.
Der Compiler benutzt aber tot sicher nicht nur einen Lexer - und genau für diese Funktionalität benutzt man ja RegExps.
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 22:45
von snafu
Die Definition müsste doch IMHO wie folgt sein: Ein Wort, welches kein Schlüsselwort ist mit optionalem Whitespace gefolg von einem Klammer-Auf-Zeichen. Vor diesem Wort muss etwas stehen, das ein Schlüsselwort ist. Naja, gut. Das scheitert spätestens an eigenen Typbezeichnungen. Bietet der GCC einem da keine Schnittstelle, oder so?
Re: Simpler C Funktionsparser
Verfasst: Mittwoch 12. Oktober 2011, 23:47
von BlackJack
@snafu: Wenn es sich denn um C handeln würde, aber wir haben ja mittlerweile GLSL als Sprache.
Re: Simpler C Funktionsparser
Verfasst: Donnerstag 13. Oktober 2011, 09:55
von lunar
@BlackJack: Trifft diese Definition bei GLSL nicht noch eher zu als bei C? Immerhin hat GLSL keine Zeiger und mithin auch keine Signaturen ala:
Re: Simpler C Funktionsparser
Verfasst: Donnerstag 13. Oktober 2011, 19:17
von BlackJack
@lunar: Dazu kenne ich GLSL zu wenig. Es bleibt aber auf jeden Fall das Problem mit Zeichenketten und Kommentaren.
Re: Simpler C Funktionsparser
Verfasst: Donnerstag 13. Oktober 2011, 19:22
von lunar
@BlackJack: Ich kenne GLSL gar nicht, sondern hab lediglich einen kurzen Blick in die Spezifikation geworfen. Da stand irgendwo "no pointers", und zu Zeichenketten habe ich dort auch nichts gefunden. Und in den Beispielen waren auch eine Ausdrücke zu sehen, die kein gültiges C mehr sind.
Mit regulären Ausdrücken kann man GLSL natürlich trotzdem nicht parsen.
Re: Simpler C Funktionsparser
Verfasst: Samstag 15. Oktober 2011, 09:06
von sma
Wenn "toplevel" heißt, der Ausdruck beginnt immer ganz links, und wenn kein anderer Ausdruck ganz links beginnt, einfach ein "^" in den RE einfügen und das Multiline-Flag setzen, wenn man einen RE für das gesamte Programm benutzt.
Code: Alles auswählen
import re
s = """
void functionname1(float a, float r) {
return min(a,r);
}
...
"""
print re.findall(r'^[\w]+[\s]+([\w]+)\(', s, re.M)
Auch nur ein Hack, aber ein besserer
Stefan