• Ich arbeite gerade mit flex und bison und habe mir ein compiler erstellt. Nun zu meinem Problem bzw Frage. Grundsätzlich wird die Konsole in der Main Funktion der Parser Datei aufgerufen. Das stört mich ein wenig. Es muss doch die Möglichkeit geben ein Script/Datei aufzurufen in der meine Befehle abgearbeitet werden, statt diese immer von Hand in der Konsole eingeben zu müssen.

    MFG LotR


    Ich habe über das Internet einen Bereich gefunden in dem hier über Parser gesprochen wird. Leider habe ich dort keinen Zugriff und muss deshalb hier posten.

  • Ich verstehe zwar nicht genau, was du meinst, das hindert mich aber trotzdem nicht daran, dir mal im Glaskugel-Modus zu antworten.

    Schreib die Befehle mal in eine Datei rein und ruf dann deinen compiler mit "./compiler < datei" auf, das leitet den Inhalt der Datei auf die Standardeingabe deines Compilers um.

    Ob das unter Windows auch geht, weiß ich aber nicht (aber wer verwendet zum Compilerbauen schon Windows?)

    Dipper dipper dii dipper dii dipper dii duuu

  • sauzachn: Ja, dass geht auch unter Windows ;)
    @LotR: Machs du zufälligerweise die Übersetzerbau Übung?
    Was meinst du genau? Schau dir mal die automatischen Test-Scripts des UBLU Teams an. Es gibt Shellscripts (Windows: Batchfiles), mit denen du den Parser so oft aufrufen kannst wie du willst. Ist es das was du meinst?

  • Gut dann nochmal:;)

    Also nach dem ich mein Programm compiliert habe starte ich es. Mit yylex() oder yyparse() in der Main Funktion bekomme ich ja grundsätlich automatisch eine Eingabe Möglichkeit zur Verfügung gestellt um meine selbst erstellten Befehle einzugeben und diese dann auszuführen.
    Nur ist mein Problem ich möchte dieses nicht über eine Eingabe machen sondern über eine Datei in der ich alle Befehle eingebe und er diese dann einzeln automatisch abarbeitet. Also im Endefekt ein kleines Script mit den selbst erstellten Befehlen. Leider habe ich bisher keine Möglichkeit gefunden die Befehle automatisch abarbeiten zu lassen.

  • Um was für Befehle geht es?
    Willst du a) daß dein Compiler nicht von der Standardeingabe, sondern aus einem File liest? Dann kannst du ein File öffnen und an die Variable yyin zuweisen, aus der liest lex.
    Oder b) willst du, daß das kompilieren deines Compilers (Aufrufe von yacc, lex und cc) automatisiert wird? Dann willst du ein Makefile.

    Falls du keines von beiden willst, bitte ein Beispiel oder so...

    *plantsch*

  • Ahh ich werde verstanden. :) Also ich möchte a)!!! b) Habe ich schon, dass war kein Problem.

    Über yyin habe ich es schon mal probiert aber leider kein Erfolg gehabt. Was mich gerade verwundert: "yyin ist doch eine File und keine Variable"?
    Hättest du dazu ein Beispiel parrat?

  • Code
    FILE *blah = fopen("/tmp/blah.txt","r");
    yyin = blah;

    oder einfach:

    Code
    yyin = fopen("/tmp/blah.txt","r");

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Ok, so hatte ich das auch schon mal. Nur führt er dann nix aus bzw. bekomme ich keine Ausgabe. Muss ich irgendein Standard in der "blah.txt" einhalten oder kann ich ganz normal die Befehle reinschreiben.

    Vielleicht hilft ja ein kleiner Auschnitt von meinem kleinen TestProgr. .Das eigentliche kommt erst wenn die gröbsten Probleme gelöst sind.

    parser:

    scanner:

    Die einzigste Ausgabe die ich bekomme ist das printf "ENDE" der Main. In der txt steht bisher nur das Wort "status" drinne.

  • Zitat von LordoftheRings

    Die einzigste Ausgabe die ich bekomme ist das printf "ENDE" der Main. In der txt steht bisher nur das Wort "status" drinne.

    wundert mich nicht, du rufst den parser ja nie auf in main()...

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • du musst yylex bzw. yyparse aufrufen :D

    In C kann (im Gegensatz zu C++) "a = b" keinerlei Nebenwirkungen haben als eine Zuweisung.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Also yylex ist ja eine Funktion. Aber wenn ich diese Aufrufe bekomme ich ja wieder die Konsole in der ich dann die Befehle eingebe. Das war ja das was ich zuvor hatte.

    Und muss ich yylex aufrufen bevor ich die Datei lese oder danach.

    bisher hatte ich es immer so:
    main()
    {
    yylex(); //wenn ich es hier reinsetzte bekomme ich nur die Konsolen
    FILE *test = fopen("new.txt","r");
    yyin = test;
    yylex(); // an der position wird einfach nur ENDE ausgeben

    printf("ENDE\n");
    }


    :confused::confused::confused:

  • Zitat von LordoftheRings

    Also yylex ist ja eine Funktion. Aber wenn ich diese Aufrufe bekomme ich ja wieder die Konsole in der ich dann die Befehle eingebe. Das war ja das was ich zuvor hatte.

    yylex liest den input von yyin (was per default auf stdin gestellt ist), was auch immer das sein mag. Check mal ob fopen da net NULL zurückgibt, evtl kann er diese Datei einfach net öffnen.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Zitat von LordoftheRings


    yyin = test;
    yylex(); // an der position wird einfach nur ENDE ausgeben


    Du meinst hier yyparse(); statt yylex();. Und frag den Rückgabewert ab und tu was damit, damit man mal sieht, daß tatsächlich geparst wurde.

    *plantsch*

  • Also die fopen funktioniert so weit (erfolgreich geöffnet). Mit yyin=stdin bekomme ich wiedermal die Konsole und ohne bekomme ich gleich die Ausgabe von "Ende". Nur leider setzt er nicht um was in new.txt steht!

  • Ich habe es jetzt endlich geschaft:

    Zitat

    Wirklich viel anders habe ich es bisher auch nicht gemacht. Könnte schwören das ich es auch schon auf diese Weise mit yylex auch mit yyparse
    probiert habe. Wahrscheinlich habe ich es aber dann an einer anderen Stelle indem Moment verbockt gehabt.

    Vielen Dank für die Mühe und die Hilfe. Wenigstens war ich nicht ganz auf den falschen Weg! ;)

  • Hätte noch eine kleine Frage:

    Weiss jemand wie es mit den Copyright Rechten aussieht unter der Benutzung von Bison?

    Folgender Fall: Ich lasse mir mit hilfe von Bison ja c code compilieren. Muss ich den offenlegen oder kann ich den einfach gewerblich uneingeschränkt nutzen?!

  • Zitat von LordoftheRings

    Hätte noch eine kleine Frage:

    Weiss jemand wie es mit den Copyright Rechten aussieht unter der Benutzung von Bison?

    Folgender Fall: Ich lasse mir mit hilfe von Bison ja c code compilieren. Muss ich den offenlegen oder kann ich den einfach gewerblich uneingeschränkt nutzen?!


    Was du durch Bison durchschickst ist vollkommen egal; zu den Teilen die Bison selbst in den Parser hineinkopiert findet sich folgendes im Lizenz-Abschnitt einer mit Bison erzeugten Datei:

    Code
    /* As a special exception, when this file is copied by Bison into a
       Bison output file, you may use that output file without restriction.
       This special exception was added by the Free Software Foundation
       in version 1.24 of Bison.  */

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • Ich hatte nämlich irgendwo mal gelesen das die Header Files die Bison zum compilieren benutzt früher unter der GNU Lizenz standen und dieses erst später geändert wurde.

    Demnach scheint aber aktuell keine Beschränkungen für die erstellte Software vorzuliegen. Wollte halt nochmal sicher gehen! ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!