C#: Regex für C-Funktion Parameterliste

Gast #7165669
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?
#7165681
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?
Gast #7165828
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
}
Gast #7165834
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.

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