lex & yacc

Was klappt beim gcc nicht? Schreib mal GANZ konkret deine Dateien und die Libs gegen die du linken möchtest..
Wobei ich den gcc noch nie selber unter windows verwendet hab (codeblocks als IDE sei dank..), das erscheint mir unter linux wesentlich einfacher..
 
das hier hab ich im andern forum geschrieben:
DarkMo schrieb:
also ich hab mir jetzt mal MinGW besorgt. da is auch ne gcc.exe dabei und läuft in windoof. vin hier: Lexikalische Analyse mit Lex - Kiesler phpWebsite consulting hab ich mal den aufruf ausm makefile nachgestellt (das .c file in den selben ordner kopiert) und es kommt folgende fehlermeldung:

warning: no newline at end of file
cannot find -lfl
collect2: ld returned 1 exit status

aufruf (nur mit dem standard lex.yy.c file da): gcc -o wc wc.c -lfl

erklrärung dazu: 3. Wenn Flex erfolgreich war, kompilieren wir es mit dem C-Compiler gcc, verlinken es mit der Flex-Bibliothek fl (-lfl) und erhalten die Ausführbare Datei wc (-o wc).

hat hier jemand nen anhaltspunkt für mich, wie ich das lösen kann? muss ich die wiedermal extra von irgendwoher ziehen? wenn ja, wäre nen link kuhl, da ne google suche nach fl sicher nich sehr erfolgreich enden wird :/ und ausserdem ne hilfestellung, wie ich das einbinden kann wäre dann noch schön

hm joa ^^
 
na der dateiname is ja schonmal nen super anfang. da werd ich mal suchen und probieren :D

edit1: aha, der lümmel is bei flex dabei und gcc versucht drauf zuzugreifen - das kann ja nix werden. werd mal bissl rumkopieren und testen.

edit2: na holla die waldfeee - die warnung mit dem newline kommt zwar immernoch, aber nachdem ich die von GnuWin32\lib ordner (flex) in den MinGW\lib ordner (gcc) kopiert hatte, funzte es un ich hab ne wc.exe rausbekommen. na nu bin ich jam al gespannt.

edit3: verdämmt ^^ ich geb was ein, aber nix passiert :/ gibts da dann irgend nen befehlswort, was die eingabe beendet (wenn das auch die zeilen zählt, is das reine enter drücken ja sicherlich nich so erfolgreich) und den zählvorgang startet? (also is ja son wort/zeilen zähl programm). ach hm, oder muss ich das teil (die wc.exe) auch wieder über die cmd aufrufen mit nem parameter zu nem file hinten dran zum bsp? das er dann das file auswerten tut.
 
Zuletzt bearbeitet:
>yyin=argc>1 ? fopen(argv[1], "r") : stdin;

Wenn du einen Parameter übergibst wird der anstelle von stdin ausgwertet. Probiers halt mal aus :)

Die Warnung von wegen keine newline am Ende kannste ignorieren.

Ich scheiter grad an deinem Beispiel, vorzeitiges EOF, da is mir wohl was beim copy&paste schief gelaufen...

Edit2:
Läuft =)

Also ich starts einfach (linux: ./wc) tipp mehrere zeilen rein, drück Crtl+D (==> End Of Line, weiss aber nich wie des unter Win geht) und der sagt mir des Ergebnis. Oder ich mach ./wc DATEI und dann gibt er mir das gleiche für die Datei aus.. Flex is voll toll, wieso haste mir das nich schon früher gesagt?!
 
Zuletzt bearbeitet:
Code:
/*              Word Count with Lex.

                part of a lex-tutorial on
                http://www.kiesler.at/
*/


                int words=0;
                int lines=0;


WORD            [a-zA-Z0-9_]+

PUNCTUATION     [\.\ ?\;\,\!\-\&]+
WHITESPACE      [ \t]+
IGNORE          {PUNCTUATION}|{WHITESPACE}

NEWLINE         [\n]+


%%


{WORD}          words++;
{IGNORE}        /* */
{NEWLINE}       lines++;


%%


                main(int argc, char **argv) {
                        yyin=argc>1 ? fopen(argv[1], "r") : stdin;
                        yylex();
                        printf("%d word(s), %d line(s).\n",
                                words, lines);
                        exit(0);
                }
das (wc.lex) hab ich da durch flex gejagt -> lex.yy.c -> durchn gcc -> wc.exe

also muss ich die dann so aufrufen, dass der erste parameter größer 1 is um den 2. paramter (ein text file) dann ausgewertet wird. sprich sowas wie "wc 2 test.txt"? gleich mal probieren...

edit: hm ok. da macht er garnix. testfile mit 3 zeilen und 9 wörtern:
hallo welt
dies ist ein test
palimmel palummel palam
als test.txt im selben ordner wie die wc.exe mit dem oben geschriebenen aufruf.
 
Zuletzt bearbeitet:
Code:
/*              Word Count with Lex.

                part of a lex-tutorial on
                http://www.kiesler.at/
*/


                int words=0;
                int lines=0;


WORD            [a-zA-Z0-9_]+

PUNCTUATION     [\.\ ?\;\,\!\-\&]+
WHITESPACE      [ \t]+
IGNORE          {PUNCTUATION}|{WHITESPACE}

NEWLINE         [\n]+


%%


{WORD}          words++;
{IGNORE}        /* */
{NEWLINE}       lines++;


%%


                main(int argc, char **argv) {
                        yyin=argc>1 ? fopen(argv[1], "r") : stdin;
                        yylex();
                        printf("%d word(s), %d line(s).\n",
                                words, lines);
                        exit(0);
                }

das (wc.lex) hab ich da durch flex gejagt -> lex.yy.c -> durchn gcc -> wc.exe

also muss ich die dann so aufrufen, dass der erste parameter größer 1 is um den 2. paramter (ein text file) dann ausgewertet wird. sprich sowas wie "wc 2 test.txt"? gleich mal probieren...

HAAAALT!
>wc.exe DATEINAME
reicht völlig. argc ist immer mindestens 1, da steht der Name (Pfad?) der Datei drinnen, die gerade ausgeführt wird. argc ist 2 wenn du noch den Dateinamen übergibst.
Edit: Beispiel:
wc.exe ==> argc = 1
wc.exe DATEINAME ==> argc = 2
wc.exe DATEI1 DATEI2 ==> argc = 3
AAAABER!!!! Mit 2 Datein geht das Programm nicht, ich wollts blos verdeutlichen.
 
ach jetz schnall ichs. dank dir. gleich nochma probieren. ich hab das bisher nie genutzt weil ich nie wusst was es so recht bedeuten soll. jaja, die frühen schludrigen jahre im studium und das weitere desintresse dafür, da es auch ohne geht rächen sich halt doch ab und an ><

edit: woah, imbatiös! 9 wörter, 2 zeilen. ok, da kann ich gleich ma mim bugfix ran, so das er zeilen, un nich zeilenumbrüche zählt - sprich mit 1 statt mit 0 anfängt ^^

sau geil, nu kann ich endlich losleeeegen *flieg*

100 tausend millionen dank! ^^
 
hmm, hab da grad noch ne andere frage dazu (daher sry für den doppelpost):

kann man mit einer batch datei folgendes realisieren?
- eine datei in einen ordner kopieren (wc.lex zBsp von meinem ordner mit der batch zum ordner mit der flex.exe)
- dort eine exe mit parameter(n) ausführen (die wc.lex durch die flex.exe jagen)
- die kopierte (nich das original) wc.lex soll wieder gelöscht werden
- dann wieder eine datei von einem ordner in einen anderen verschieben (nicht kopieren diesmal) -> lex.yy.c in den gcc ordner
- wieder exe mit parameter(n) ausführen
- ergebnisdatei in den batch ordner verschieben

soll mir dann quasi das programm make ersetzen so dass ich in einem ordner arbeiten kann ohne umständlichst immer hin und her zu tüdeln wegen jeder kleinen änderung bei der programm entwicklung/debugging.

falls mir da wer helfen kann/tipps geben kann, wäre ich wiedermal sehr zu dank verpflichtet (btw: bisher habt ihr nen explizites coding board geschlagen, also macht euch nich so klein :P ihr seid guuut ^^).
 
>>- eine datei in einen ordner kopieren (wc.lex zBsp von meinem ordner mit der batch zum ordner mit der flex.exe)
Kopieren geht unter Windwos mit copy

>>- dort eine exe mit parameter(n) ausführen (die wc.lex durch die flex.exe jagen)
Einfach
flex.exe PARAMETER

>>- die kopierte (nich das original) wc.lex soll wieder gelöscht werden
Dateien löschen geht mit
del

>>- dann wieder eine datei von einem ordner in einen anderen verschieben (nicht kopieren diesmal) -> lex.yy.c in den gcc ordner
Dateien verschieben geht mit
move

>>- wieder exe mit parameter(n) ausführen
exe.exe PARAMETER

- ergebnisdatei in den batch ordner verschieben
move

Wobei du dir die ersten Schritte vermutlich sparen kannst: flex.exe C:\Pfad\zur\Lex\Datei.lex


Am besten immer mit absoluten Pfaden arbeiten, dann ists auch egal wo die .bat/.cmd ist. Hilfe zu den einzelnen Befehelen bekommst du mit "/?" als Parameter, also z.B. "move /?". Hoffe ich konnte helfen :)
 
ach sone bat is nix weiter wie ne sammlung von dos befehlen? quasi ein dos-makro? ^^ gut zu wissen und danke schonmal für den einstieg. werd ich mal tüfteln.

edit: steingeil. habe mir jetzt 2 bats geschrieben mit deinen tipps und bissl gesuche hier im forum:
make.bat schrieb:
@echo on
C:\Programme\GnuWin32\bin\flex -oC:\Dokume~1\DarkMo\Desktop\compiler\wc.c C:\Dokume~1\DarkMo\Desktop\compiler\wc.lex
C:\Programme\MinGW\bin\gcc -o C:\Dokume~1\DarkMo\Desktop\compiler\wc C:\Dokume~1\DarkMo\Desktop\compiler\wc.c -lfl
del C:\Dokume~1\DarkMo\Desktop\compiler\wc.c
exit
-> wandelt meine .lex per flex in eine .c und diese dann per gcc in die .exe

use.bat schrieb:
@echo on
C:\Dokume~1\DarkMo\Desktop\compiler\wc test.txt > ergebnis.txt
exit
-> verwendet die test.txt mit den eingabedaten mit der erstellten .exe und gibt eine ergebnis.txt zurück. was da drin steht, sollte klar sein ^^ funzt wunderbar. grad getestet.

ich kann mich nur wieder und wieder verbeugen ^^ falls interesse, werde ich meine odysse mal versuchen zusammenzufassen: wo hab ich was gefunden*, wie eingerichtet und wie genutzt bla blubb - falls nochmal wer so schwer von begriff is wie ich ^^

:hail::hail::hail::hail:

*ps: kann man hier notfalls auch die proggies gezippt anhängen so wie bilder? oder habt ihr das nich so gern wegen virengefahr? dann wäre man ggf nicht abhängig von links, die vllt irgendwann verschwunden sind ^^
 
Zuletzt bearbeitet:
Zurück