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