Einfachen C-Code parsen

Einfachen C-Code parsen

am 02.06.2006 11:16:27 von chr1701

Hallo zusammen!

Ich möchte aus einem C-Skript bestimmte Funktionsaufrufe parsen und
die Parameter ändern.

Dabei soll jeder Aufruf von foo() gefunden werden, und der string p
(der ein konstanter string-literal ist), wird verändert.

int foo(char *p, ...);

Mein erster Versuch war, das ganze mit einer regex zu lösen; ich bin
dann aber schnell an meine Grenzen gestossen, denn Aufrufe von foo
können über mehrere Zeilen gehen:

foo("hallo welt, "
"hier ist ein"
"mehrzeiliger string", 1, 2, 3, blah);

Daraufhin habe ich erstmal im web gesucht, und zahlreiche Verweise auf
C::Scan gefunden. Ich habe C::Scan ausprobiert, leider findet das Modul
nur die Funktionsdeklarationen, aber nicht die eigentlichen Aufrufe.

Hat jemand eine Idee, wie ich das am Elegantesten lösen könnte?

Grüsse und Dankeschön,
Christoph

Re: Einfachen C-Code parsen

am 02.06.2006 12:38:50 von Andreas Delp

chr1701@yahoo.com wrote:

> Hallo zusammen!
>
> Ich möchte aus einem C-Skript bestimmte Funktionsaufrufe parsen und
> die Parameter ändern.
>
> Dabei soll jeder Aufruf von foo() gefunden werden, und der string p
> (der ein konstanter string-literal ist), wird verändert.
>
> int foo(char *p, ...);
>
> Mein erster Versuch war, das ganze mit einer regex zu lösen; ich bin
> dann aber schnell an meine Grenzen gestossen, denn Aufrufe von foo
> können über mehrere Zeilen gehen:
>
> foo("hallo welt, "
> "hier ist ein"
> "mehrzeiliger string", 1, 2, 3, blah);
>
> Daraufhin habe ich erstmal im web gesucht, und zahlreiche Verweise auf
> C::Scan gefunden. Ich habe C::Scan ausprobiert, leider findet das Modul
> nur die Funktionsdeklarationen, aber nicht die eigentlichen Aufrufe.
>
> Hat jemand eine Idee, wie ich das am Elegantesten lösen könnte?

Regexp gehen auch mehrzeilig, dafür wurde das s erfunden.

$f="Hallo Du foo

barkeeper";

$f=~m/foo\s+bar/s # matcht hervorragend ;-)
^
HTH, Andreas

--
Wer mir per Mail antworten möchte sollte 'erdbeere' im Betreff erwähnen,
sonst wird die Mail zusammen mit SPAM und Würmern ungelesen gelöscht.

Re: Einfachen C-Code parsen

am 02.06.2006 14:12:44 von Andreas Karrer

* Andreas Delp :


>> Hat jemand eine Idee, wie ich das am Elegantesten lösen könnte?

Lies die C-Source nicht zeilenweise, sondern abschnittweise:

$/ = "\n\n";
while (<>) {
# $_ enthaelt jetzt einen ganzen Abschnitt
s/\bfoo\( ... \)/irgendwas/g;
}

>
> Regexp gehen auch mehrzeilig,

Ja.

> dafür wurde das s erfunden.

Nein.

> $f="Hallo Du foo
>
> barkeeper";
>
> $f=~m/foo\s+bar/s # matcht hervorragend ;-)

Das matcht auch ohne /s.

/s hat nur eine Auswirkung auf die Interpretation des
Regex-Metazeichens "."

- Andi

Re: Einfachen C-Code parsen

am 03.06.2006 14:14:43 von news.5.maazl

Hallo,

Andreas Karrer schrieb:
> /s hat nur eine Auswirkung auf die Interpretation des
> Regex-Metazeichens "."

und ^ und $


Marcel

Re: Einfachen C-Code parsen

am 03.06.2006 22:00:37 von Andreas Karrer

* Marcel Müller :

> Andreas Karrer schrieb:
>> /s hat nur eine Auswirkung auf die Interpretation des
>> Regex-Metazeichens "."
>
> und ^ und $

Nein, das ist /m.

- Andi

Re: Einfachen C-Code parsen

am 06.06.2006 13:40:31 von chr1701

Danke für die Hilfen!

$/ kannte ich noch nicht. Mit $/ und /s geht alles.

Grüsse
Christoph