Flex in C



  • So ich habe jetz eine beliebige Datei erstellt und die durch Flex gejagt.
    Dann ist die Datei lex.yy.c entstanden, wo komischre krams drinsteht.
    Was bringt mir der Krams in der neu entstandenen Datei. Und was zum teufel sind y- und I-Dateien und wo/wie brauch man die????



  • Wieso willst du flex benutzen wenn du keine Ahnung hast was es macht? Lies dich doch erstmal in das Thema ein. Die Sache ist bestens dokumentiert.



  • sicher dass es hier nicht um adobe (macromedia) flex geht ?



  • Hallo Leute, mein wissen bezüglich Flex ist mittlerweile etwas gewachsen.
    Habe einige Manuals usw. gelesen, jedoch hab ich wirklich NICHTS dazu gefunden, wie ich eine Datei einlese und diese dann analysiere und dann bestimmte teile daraus in anderen dateien speichern kann.

    kann mir da jmd helfen???
    mfg flexer



  • The description is in the form of pairs of regular expressions and C code, called "rules". `flex' generates as output a C source file, `lex.yy.c' by default, which defines a routine `yylex()'. This file can be compiled and linked with the flex runtime library to produce an executable. When the executable is run, it analyzes its input for occurrences of the regular expressions. Whenever it finds one, it executes the corresponding C code.

    Das erzeugte Programm liest standardmäßig von stdin und schreibt auf stdout. Alles klar?



  • The description is in the form of pairs of regular expressions and C code, called "rules". `flex' generates as output a C source file, `lex.yy.c' by default, which defines a routine `yylex()'. This file can be compiled and linked with the flex runtime library to produce an executable. When the executable is run, it analyzes its input for occurrences of the regular expressions. Whenever it finds one, it executes the corresponding C code.

    Das erzeugte Programm liest standardmäßig von stdin und schreibt auf stdout. Alles klar?



  • Moin, hab hier mal ne anleitung wie man sowas macht:

    1. Ansehen des Flex-Programms
    Lesen der Datei Beispiel01.lex
    2. Übersetzung des Flex-Programms in ein C-Programm
    flex Beispiel01.lex
    erzeugt ein C-Programm namens lex.yy.c
    3. Kompilation des C-Programms
    cc lex.yy.c (je nach C-Compiler auch gcc lex.yy.c)
    erzeugt ein Programm namens a.out (unter UNIX) bzw. a.exe (unter Windows)
    4. Ausführen des Programms mit einer Testdatei

    __________________________

    wieso bekomme ich nach bzw bei schritt 4 keine exe names a.exe sondern nur eine
    lex.yy.exe (c-code = lex.yy.c) heraus?
    deswegen kann ich dann wahrscheinlich auch keine textdatei durch das prog jagen oder?

    hat jmd ne idee??? thx



  • Wie die Ausgabedatei heißt, hängt afaik davon ab, was für einen Compiler du verwendest. Und wie minhen sagte, arbeitet die normalerweise erzeugte yylex()-Funktion mit stdin/stdout (=Tastatur/Monitor) - also entweder du nimmst dir die lex.yy.c vor und passt das Hauptprogramm an deine Bedürfnisse an oder du leitest die Ein/Ausgaben für das Programm über Pipes um:

    lex.yy < in.txt > out.txt
    


  • Hallo zusammen,

    zum Thema Lex habe ich auch ein paar Fragen bzw. Probleme zu lösen:

    Ich möchte die mit flex erstellte *yy.c-Datei mit Visual Studio .NET kompilieren. Leider bekomme ich immer wieder Fehlermeldungen vom Linker wie:

    LexTest.obj : error LNK2019: Nicht aufgelöstes externes Symbol '_yywrap', verwiesen in Funktion '"int __cdecl yylex(void)" (?yylex@@YAHXZ)'

    Was muss ich unter VS .NET beachten bzw. hat jemand ein paar Tipps, die mich auf die schnelle weiter bringen?

    Sinn und Zweck meiner Anstrenungen sind die ansthenden Prüfungen, wobei ein Kapitel auch "Automatentheorie und formale Sprachen lautet", welches den Umgang mit lex und yacc beinhaltet.

    An meiner Hochschule ist das kein Thema, da wir dort unter Linux arbeiten. Zu Hause habe ich jedoch nur Windows, möchte aber die Ferien trotzdem nutzen um mich etwas damit zu befasssen.

    Vielen Dank schonmal im voraus

    Kramny



  • Du musst die entsprechende Bibliothek noch dazulinken. Bei flex heißt die unter Linux "libfl.a". Such mal ob du sowas ähnliches z.B. "libfl.lib" bei dir findest 🙂



  • du kannst es machen, wie minhen sagt, oder einfach als workaround yywrap selber implementieren..
    gib ihr einen körper, mit return 0;.. dann brauchst du nicht linken.

    gruß



  • Hallo elise, Hallo minhen,

    vielen Dank ersteinmal für euere Tipps.

    Minhen, ich habe die libfl.lib dazugebunden. Zumindest habe ich sie im Visual Studio im Projekteinstellungen->Linker->Eingabe: Zusätzliche Abhängigkeiten eingefügt.

    Also dort steht nun drin:

    libfl.lib libfl.a

    Siehe auch: http://clemens.bytehammer.com/papers/FlexTutorial/flex-vs_tutorial.html

    Dazu muss ich aber zusätzlich die Bibliothek "MSVCRT" ignorieren, sonst bekomme ich folgenden Konflikt:

    LINK : warning LNK4098: Standardbibliothek 'MSVCRT' steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden

    Meines Wissens müsste das genügen, um die lib erfolgreich einzubinden.
    Trotzdem bekomme ich noch den Linkerfehler (kann yywrap nicht auflösen).

    Noch eine Idee???

    Gruß
    Kramny



  • Ok, hat sich erledigt: war mein Fehler.

    Habe

    extern int yywrap YY_PROTO(( void ));
    

    anstatt

    extern "C" int yywrap YY_PROTO(( void ));
    

    verwendet.

    Danke nochmal für den Hinweis.
    Guten Rutsch und frohes neues Jahr

    Kramny


Anmelden zum Antworten