Forum: PC-Programmierung C#: Regex für C-Funktion Parameterliste


von cppbert (Gast)


Lesenswert?

ich habe einen C-Funktion Parameter-String den ich gerne zerlegen
möchte, kann mir einer einen Tip geben wie ich das mit C#/Regex 
hinbekomme?
Ist für einen Code-Generator der viele solcher Signaturen verarbeiten 
soll
(Es ist geprüft das der String valider C Code ist - das muss ich nicht 
prüfen)
1
string parameter = "Blub* st, void (*func) (void*), int test, const unsigned char** in"

moechte ich so zerlegen
1
  "Blub*" -> "st"
2
  "void (*func) (void*)" -> "" <- kein Name
3
  "int" -> "test"
4
  "const unsigned char**" -> "in"

mein bisheriger Code stört sich an dem Parametern ohne Name
1
var paras = parameter.Split(',');
2
foreach (var p in paras)
3
{
4
  var reg = new Regex(@"^(.*?) ([_a-zA-Z][_a-zA-Z0-9]*)?$");
5
  var match = reg.Match(p);
6
7
  var type = matchs2.Groups[1].ToString();
8
  var name = matchs2.Groups[2].ToString();
9
}

jemand eine nette Idee?

von Ein T. (ein_typ)


Lesenswert?

cppbert schrieb:
> ich habe einen C-Funktion Parameter-String den ich gerne zerlegen
> möchte, kann mir einer einen Tip geben wie ich das mit C#/Regex
> hinbekomme?
> [...]
>
1
>  var reg = new Regex(@"^(.*?) ([_a-zA-Z][_a-zA-Z0-9]*)?$");
2
>

Das ist jetzt ungetestet und nur ein Schuß ins Blaue, aber... ich würde 
die Strings zuerst an Kommata in eine Liste von Strings splitten und 
dann jeden Substring in der Liste anhand von Whitespace (da können auch 
Zeilenumbrüche vorkommen) tokenisieren. Der "rechtseste" Teil ist der 
Name des Parameters, alles links davon ist der Typ. Die Ausnahme ist 
gegeben, wenn der Name in Klammern steht, also ein Funktionszeiger 
übergeben wird, dieser Fall muß gesondert behandelt werden. Wäre das 
eine Idee?

von cppbert (Gast)


Lesenswert?

Ein T. schrieb:
> Wäre das
> eine Idee?

"ABC_METHOD* ABCm, long (*callback_ctrl) (ABC*, int, ABC_info_cb*)"

ich denke an so Signaturen mit Funktionszeiger decls scheiter die kleine 
Lösung :/

von tut nix zur Sache (Gast)


Lesenswert?

cppbert schrieb:
> moechte ich so zerlegen
>   "Blub*" -> "st"
>   "void (*func) (void*)" -> "" <- kein Name

Bist du sicher, dass 'kein Name' der richtige Ansatz ist?

Sieht nämlich so aus wie Funktionspointer-Instanz mit dem Namen func...
1
class Blub* st;
2
void (*func)(void*);
3
4
void laber(void*)
5
{
6
}
7
8
int main(int argc, char** argv)
9
{
10
  st=nullptr;
11
  func = &laber;
12
  func( st);
13
  return 0;
14
}

von tut nix zur Sache (Gast)


Lesenswert?

cppbert schrieb:
> "ABC_METHOD* ABCm, long (*callback_ctrl) (ABC*, int, ABC_info_cb*)"
>
> ich denke an so Signaturen mit Funktionszeiger decls scheiter die kleine
> Lösung :/

Sorry, jetzt erst gelesen, du willst die formalen Parameter der 
Funktionssignaturen parsen...

ja, im Allgemeinen wird das nix mit Regex, weil die Parameter in deinem 
Callback-Type ja auch wieder ne Callback-Type-Definition beinhalten 
können.

Damit bist du laut Chomsky schon nicht mehr im Regulären, sondern 
zumindest auf Datentyp-Ebene eher im Kontextfreien. Könnte vielleicht 
mit Regex gehen, wenn du erst rekursiv alle Funktionspointer-Types 
auflöst und in ner zweiten Stufe substituierst.

Glaube aber trotzdem, dass n richtiges Parser-Backend eher das ist, was 
du nutzen solltest.

von tut nix zur Sache (Gast)


Lesenswert?

Vollständigkeithalber:
1
void (*func)( void (*func1)( void(*func2)( void (*func3)( int ) )  ) );
2
3
int main(int argc, char** argv)
4
{
5
  return 0;
6
}

kompiliert...

von cppbert (Gast)


Lesenswert?

ups habe gar nicht an die function ptr declaration gedacht
dann brauch ich wohl doch einen richtigen Parser :/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.