Seite 1 von 1
compiler-aufrufe mit regulaeren ausdruecken parsen
Verfasst: Mittwoch 10. Juni 2009, 14:29
von roschi
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

.
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
Verfasst: Mittwoch 10. Juni 2009, 14:43
von Leonidas
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]
Verfasst: Mittwoch 10. Juni 2009, 14:46
von Dill
kennst du das hier, insb bei komplexen ausdrücken oder zum lernen sehr hilfreich:
http://re.dabase.com/
Verfasst: Mittwoch 10. Juni 2009, 15:10
von roschi
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!
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
Verfasst: Mittwoch 10. Juni 2009, 15:48
von derdon
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
Verfasst: Mittwoch 10. Juni 2009, 15:55
von Methos
Könnte man auch einen OptionParser zweckentfremden? (Wenns auch relativ großer Aufwand wäre)
Verfasst: Mittwoch 10. Juni 2009, 15:59
von derdon
Genau das machte ich.
Verfasst: Donnerstag 11. Juni 2009, 13:14
von roschi
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!