compiler-aufrufe mit regulaeren ausdruecken parsen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

Halli!

ich melde mich nun nach so langer pause auch mal wieder :).

ich habe ein kleines problem mit regulaeren ausdruecken. seit ca. 3 stunden versuche ich vergeblich einen ausdruck zum parsen eines compileraufrufs zu schreiben. ich bin wohl etwas aus der uebung gekommen :-(.

ein aufruf sieht z.b. so aus:
gcc -c -Wall -W -Wstrict-prototypes -Wmissing-prototypes -D_BLUBB_ -DNDEBUG -DABC -DGHI -DJKL=2 -DMNO -I. -Isrc -I../lib -o lib/Linux/obj/main.o src/main.c
aus so einem aufruf brauche ich nun alle defines (-D...), alle includes (-I...) und die sources (letzter parameter: src/main.c).

es waere sehr freundlich, wenn mir jemand bei diesem problem behilflich sein koennte... ich bin am verzweifeln an diesem ausdruck :evil:.

es ist jedoch auch zu bedenken, dass manche der nicht benoetigten parameter (-Wall etc.) nicht unbedingt vorkommen muessen.

vielen lieben dank schonmal im voraus.

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hier mal ein nicht fehlerfreier Code, an dem du wenn du willst ansetzen kannst:

Code: Alles auswählen

call = ("gcc -c -Wall -W -Wstrict-prototypes -Wmissing-prototypes -D_BLUBB_" 
    "-DNDEBUG -DABC -DGHI -DJKL=2 -DMNO -I. -Isrc -I../lib -o lib/Linux/obj/main.o src/main.c")
# defines
print re.findall(r'-D(\S*)', call)
# includes
print re.findall(r'-I(\S*)', call)
# sources
print call.split()[-1]
Zuletzt geändert von Leonidas am Mittwoch 10. Juni 2009, 15:26, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

kennst du das hier, insb bei komplexen ausdrücken oder zum lernen sehr hilfreich:

http://re.dabase.com/
http://www.kinderpornos.info
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo!
Leonidas hat geschrieben:Hier mal ein nicht fehlerfreier Code, an dem du wenn du willst ansetzen kannst:

Code: Alles auswählen

call = ("gcc -c -Wall -W -Wstrict-prototypes -Wmissing-prototypes -D_BLUBB_" 
    "-DNDEBUG -DABC -DGHI -DJKL=2 -DMNO -I. -Isrc -I../lib -o lib/Linux/obj/main.o src/main.c")
# defines
print re.findall(r'-D(\S*)', call)
# includes
print re.findall(r'-D(\S*)', call)
# sources
print call.split()[-1]
vielen dank!
mit einem großen tipp geht alles leichter!
da haette man ja eigentlich auch selber drauf kommen koennen... oh je :-(.
aber auf jeden fall vielen dank!

ennst du das hier, insb bei komplexen ausdrücken oder zum lernen sehr hilfreich:

http://re.dabase.com/
nein, das kannte ich noch nicht, sieht aber recht hilfreich aus. ich hatte bisher immer 'The Regex Coach' verwendet. da konnte man die uebereinstimmungen auch sehr schoen einsehen.

nochmals vielen herzlichen dank und einen pythonischen tag!

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

http://paste.pocoo.org/show/122230/

Ausgabe:

Code: Alles auswählen

$ python gcc_regex.py 
("<Values at 0x60ae18: {'c': '-Wall', 'E': None, 'pg': None, 'g': None, 'f': None, 'm': None, 'pedantic': None, 'o': 'lib/Linux/obj/main.o', 'L': None, 'S': None, 'U': None, 'O': None, 'W': 'missing-prototypes', 'includes': ['.', 'src', '../lib'], 'defines': ['_BLUBB_', 'NDEBUG', 'ABC', 'GHI', 'JKL=2', 'MNO']}>",
 "['gcc', 'src/main.c']")
Hinweis: pg ist eigentlich eine "short option", also mit einem - statt zwei. Wenn ich das so im Skript angebe, meckert optparse aber, weil bei einer Option, die aus mehr als einem Zeichen besteht, eine "long option" erwartet wird.

Edit: Stil ein wenig verbessert
Zuletzt geändert von derdon am Mittwoch 10. Juni 2009, 15:59, insgesamt 1-mal geändert.
Methos
User
Beiträge: 2
Registriert: Dienstag 9. Juni 2009, 13:59

Könnte man auch einen OptionParser zweckentfremden? (Wenns auch relativ großer Aufwand wäre)
„The only problem with Microsoft is they just have no taste. … They don’t think of original ideas and they don’t bring much culture into their products“ (Steve Jobs)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Genau das machte ich.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

derdon hat geschrieben:http://paste.pocoo.org/show/122230/

Ausgabe:

Code: Alles auswählen

$ python gcc_regex.py 
("<Values at 0x60ae18: {'c': '-Wall', 'E': None, 'pg': None, 'g': None, 'f': None, 'm': None, 'pedantic': None, 'o': 'lib/Linux/obj/main.o', 'L': None, 'S': None, 'U': None, 'O': None, 'W': 'missing-prototypes', 'includes': ['.', 'src', '../lib'], 'defines': ['_BLUBB_', 'NDEBUG', 'ABC', 'GHI', 'JKL=2', 'MNO']}>",
 "['gcc', 'src/main.c']")
Hinweis: pg ist eigentlich eine "short option", also mit einem - statt zwei. Wenn ich das so im Skript angebe, meckert optparse aber, weil bei einer Option, die aus mehr als einem Zeichen besteht, eine "long option" erwartet wird.

Edit: Stil ein wenig verbessert
Óh! daran hab ich ja noch gar nicht gedacht ^^. das waere wohl sicherer, da optparse ja extra dafuer gemacht wurde. ich verwende optparse ja sowieso in meinem programm. da koennte ich ja auch eigentlich gleich diese variante einsetzen. vielen dank fuers schreiben!

lg
roschi

PS: das forum ist wirklich genial. ich moechte mich nochmals fuer die gute hilfe hier bedanken!
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Antworten