flex befehle



  • Verstehst du sie nicht, weil du flex nicht kennst oder weil ich mich so schlecht ausgedrückt habe?



  • Normalerweise generiert man mit flex einen lexikalischen Scanner, der in eine Datei namens lex.yy.c ausgegeben wird. Die compiliert und linkt man dann mit ein, ruft yylex() auf, und das scannt einem stdin und gibt Tokens zurück. Mir ist absolut nicht klar, was du mit "dies auf eine Datei <Dateiname.c> anwenden" meinst, und was diese beiden anscheinend sinnlosen Befehle darstellen sollen.



  • Ich bin totaler Anfänger! Ich habe eigentlich gar keine große Ahnung davon, aber ich wollte eigentlich genau das machen, was du beschreibst.

    Also ich habe mit dem programm flex, eine Datei namens lex.yy.c erzeugt.

    soll ich diese dann noch mit meinem C-Compiler compilieren? Hab ich dich da richtig verstanden?
    Wenn ich das versuche, dann kommt eine Fehlermeldung

    (was ich mit <Dateiname>.c0 meine ist folgendes: ich habe eine datei, welche testen soll, ob mein programm funktioniert. D.h. ich soll meinen scanner an dieser Datei testen. Ich habe nur keine Ahnung wie das gehen soll)



  • Schreiber2 schrieb:

    soll ich diese dann noch mit meinem C-Compiler compilieren? Hab ich dich da richtig verstanden?

    Ja, selbstverständlich.

    Wenn ich das versuche, dann kommt eine Fehlermeldung

    Welche?

    (was ich mit <Dateiname>.c0 meine ist folgendes: ich habe eine datei, welche testen soll, ob mein programm funktioniert. D.h. ich soll meinen scanner an dieser Datei testen. Ich habe nur keine Ahnung wie das gehen soll)

    Ist das ein Eingabefile, das der Scanner verarbeiten soll (also: ist deine lex-Spezifikation etwa für C? bisschen heftig für einen absoluten Anfänger), oder ist das ein Programm, das den Scanner benutzt?



  • Vielen Dank erstmal für deine Hilfe!!

    Also mein scanner soll kein C erkennen. Aber etwas C ähnliches
    (das bedeutet, eine selbst definierte Sprache, welche aus bestimmten Signalwörtern besteht wie etwa "if", "else" usw...)

    Die Datei ist ein Eingabefile denke ich. Da steht wörtlich:"... wenn sie den Scanner auf das Programm <Dateiname>.c0 ansetzen, soll...."

    Somit soll der Scanner auf diese Datei bearbeiten denke ich.

    Zur Fehlermeldung, es erscheint folgender Fehler:

    Undefined first referenced
    symbol in file
    main /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3/crt1.o
    yylval /var/tmp//ccZWybIk.o
    ld: fatal: Symbol referencing errors. No output written to a.out
    collect2: ld returned 1 exit status



  • Schreiber2 schrieb:

    Zur Fehlermeldung, es erscheint folgender Fehler:

    Undefined first referenced
    symbol in file
    main /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3/crt1.o
    yylval /var/tmp//ccZWybIk.o
    ld: fatal: Symbol referencing errors. No output written to a.out
    collect2: ld returned 1 exit status

    Der Linker findet keine main-Funktion. Dann hast du wahrscheinlich einfach das lex.yy.c-File alleine zu compilieren versucht? Das ist nur ein Modul für ein anderes Programm, das du selbst schreiben musst. Ich hoffe mal, dass dir die getrennte Übersetzung in C allgemein ein Begriff ist, ein bisschen C sollte man schon können, wenn man flex anwenden will.

    Lies auch mal die Manpage zu flex, da sind vollständige Beispiele (mit main) dabei. Zu Testzwecken kann man mit %option main im lex-File wohl auch eine main-Funktion generieren lassen, aber das hab ich noch nie ausprobiert.



  • Ja du hast recht. Ich habe nur diese Datei versucht zu compilieren. Aber es gibt eine vollständige main funktion in der "Testdatei", welche ich anfangs verzweifelt versucht habe irgendwie mit der lex.yy.c datei zu kombinieren?!

    muss ich dann beide verlinken oder kann ich irgendwie diese main funktion benutzen?Also kann ich dem compiler sagen, dass die main funktion, welche er sucht dort zu finden ist? Wie mache ich das?



  • Schreiber2 schrieb:

    Ja du hast recht. Ich habe nur diese Datei versucht zu compilieren. Aber es gibt eine vollständige main funktion in der "Testdatei", welche ich anfangs verzweifelt versucht habe irgendwie mit der lex.yy.c datei zu kombinieren?!

    Das wäre zwar möglich, halte ich aber für ausgeschlossen. Ist in der "Testdatei" denn ein yylex()-Aufruf? Ich denk das ist kein richtiges C, nur C-ähnlich?

    muss ich dann beide verlinken oder kann ich irgendwie diese main funktion benutzen?Also kann ich dem compiler sagen, dass die main funktion, welche er sucht dort zu finden ist? Wie mache ich das?

    Im Grunde ist es egal, ob du die Datei mit der main auch gleichzeitig (eigentlich ja erst später) als Eingabe benutzt. Verlinken musst du sie so oder so, am einfachsten

    gcc lex.yy.c meinedatei.c
    

    Jetzt sind wir aber bei der Compilerbedienung, mit flex hat das schon lange nichts mehr zu tun.



  • Ja ok ich verstehe das glaube ich. Du bist echt klasse! Danke nochmal.

    Dann habe ich aber noch eine Frage. Gesetzt den Fall, ich habe die datei lex.yy.c erstellen können.
    lässt sich dann mit sicherheit sagen, dass sich lex.yy.c compilieren lässt (unter der annahme, dass alles andere(damit meine ich außerhalb meine lex datei) Korrekt gemacht wird)



  • Die flex-generierten Anteile werden wohl hoffentlich korrekt sein, aber du bringst ja normalerweise auch eigene Anteile mit rein, z.B. Aktionen, die ausgeführt werden, wenn ein bestimmtes Muster erkannt wird. Wenn die falsch sind, sind sie 1:1 auch in der ausgegebenen C-Datei falsch.



  • Ok, das wären dann aber Fehler in der Umsetzung und nicht in der Compilierung des Quelltextes oder?

    Viele Grüsse


Anmelden zum Antworten