1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Compiler

    • Frage
  • LordoftheRings
  • 4. Mai 2005 um 13:14
  • Unerledigt
  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 4. Mai 2005 um 13:14
    • #1

    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.

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 4. Mai 2005 um 17:42
    • #2

    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

  • phax
    5
    phax
    Mitglied
    Punkte
    205
    Beiträge
    41
    • 4. Mai 2005 um 17:52
    • #3

    sauzachn: Ja, dass geht auch unter Windows :winking_face:
    @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?

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 9. Mai 2005 um 09:31
    • #4

    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.

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 9. Mai 2005 um 09:38
    • #5

    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*

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 9. Mai 2005 um 10:55
    • #6

    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?

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 9. Mai 2005 um 11:38
    • #7
    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!

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 9. Mai 2005 um 12:14
    • #8

    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:

    Zitat


    %{
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    extern FILE *yyin;
    int wert1;
    int wert2;

    void tausche(wert1,wert2)
    {
    int tausche=0;

    printf("\ntausche:%d\n\n",tausche);
    printf("wert1:%d\n",wert1);
    printf("wert2:%d\n\n",wert2);

    tausche=wert1;
    wert1=wert2;
    wert2=tausche;

    printf("nach dem tauschen\n");
    printf("wert1:%d\n",wert1);
    printf("wert2:%d\n",wert2);
    }

    void yyerror(const char *str)
    {
    printf("\tFehler aufgetreten!\n");
    }

    int yywrap()
    {
    return 1;
    }

    main(int argc, char *argv[])
    {

    FILE *test = fopen("new.txt","r");
    yyin = test;

    printf("ENDE\n");

    }


    %}

    %token NUMBER STATE STATUS TAUSCHE


    %%
    commands: /* empty */
    | commands command
    ;

    command: /* empty */
    status_set
    |
    tausche_set
    ;

    tausche_set:
    TAUSCHE NUMBER NUMBER
    {
    tausche($2,$3);
    }
    ;

    status_set:
    STATUS
    {
    printf("\talles ok\n");
    }
    ;
    %%

    Alles anzeigen

    scanner:

    Zitat

    %{
    #include <stdio.h>
    #include "parser.tab.h"
    %}
    %%
    [0-9]+ yylval=atoi(yytext); return NUMBER;
    normal|abbrechen yylval=!strcmp(yytext,"abbrechen"); return STATE;
    status return STATUS;
    tausche return TAUSCHE;
    \n /* ignore end of line */;
    [ \t]+ /* ignore whitespace */;
    ende return(0);
    %%

    Alles anzeigen

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

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 9. Mai 2005 um 12:19
    • #9
    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!

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 9. Mai 2005 um 13:46
    • #10

    Jetzt kann ich nicht ganz folgen. Normal wird der parser ja über yylex bzw. yyparse mitaufgerufen. Wie mache ich es aber in meinem Fall?

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 9. Mai 2005 um 13:51
    • #11

    du musst yylex bzw. yyparse aufrufen :grinning_squinting_face:

    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!

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 9. Mai 2005 um 14:26
    • #12

    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:

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 9. Mai 2005 um 14:29
    • #13
    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!

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 9. Mai 2005 um 14:49
    • #14
    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*

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 9. Mai 2005 um 15:00
    • #15
    Zitat


    main(int argc, char *argv[])
    {

    if((yyin = fopen("new.txt","r")) != NULL)
    printf("Erfolgreich geöffnet\n");
    else
    printf("Probleme beim öffnen\n");

    yyin = stdin;
    yyparse();
    printf("ENDE\n");

    }

    Alles anzeigen

    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!

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 9. Mai 2005 um 15:47
    • #16

    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! :winking_face:

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 17. Mai 2005 um 16:56
    • #17

    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?!

  • jeuneS2
    11
    jeuneS2
    Mitglied
    Reaktionen
    17
    Punkte
    1.227
    Beiträge
    238
    • 17. Mai 2005 um 20:48
    • #18
    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.

  • LordoftheRings
    3
    LordoftheRings
    Mitglied
    Punkte
    55
    Beiträge
    10
    • 18. Mai 2005 um 11:03
    • #19

    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! :winking_face:

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung