IF Anweisung in Flex bison realisieren

Hallo,

Habs endlich hinbekommen, er gibt genau das aus was er ausgeben soll, du meine Güte das war aber ein harter brocken, zum Glück es klappt alles.

Deepthroat ich muss sagen du hasst mir sehr viel geholfen, ich weiß ich bin dir bestimmt sehr auf die Nerven gegangen, aber DANKE dass du soviel Geduld für mich gezeigt hast. Danke nochmal für all deine Hilfe. Falls ich weitere Hilfe brauchen sollte melde ich mich bei dir. Danke für alles.

Einen schönen tag noch.

Mit freundlichen grüßen
Matrix
 
Hallo,
da bin ich wieder, hab mal ne Frage, ich habe jetzt ikm nachhinein noch weitere Sachen hinzugefügt, die ganzen operatoren wie >=, <=, !=, und logische OPeratoren and und or, klappt alles wunderbar, nun wollte ich, "++" {return INC} also den Increment Operator deklarieren, leider klappt er bei mir nicht, also der compiler erkennt schon "++" und gibt INC aus, aber ich will, dass er auch den bezeichner ausgibt, der Inkrementiert werden soll (++x), sollte doch fast das selbe sein wie mein JMP Befehl oder?
Ich habe die neuen Files wieder in http://bitbucket.org/matrix/changed-tiny angehängt, wäre super, wenn du mal nachschauen könntest.Danke.

Gruß
Matrix
 
Hi.
da bin ich wieder, hab mal ne Frage, ich habe jetzt ikm nachhinein noch weitere Sachen hinzugefügt, die ganzen operatoren wie >=, <=, !=, und logische OPeratoren and und or, klappt alles wunderbar, nun wollte ich, "++" {return INC} also den Increment Operator deklarieren, leider klappt er bei mir nicht, also der compiler erkennt schon "++" und gibt INC aus, aber ich will, dass er auch den bezeichner ausgibt, der Inkrementiert werden soll (++x), sollte doch fast das selbe sein wie mein JMP Befehl oder?
Code:
"++"[a-zA-Z] {return INC;}
Warum willst du denn einen Operator mit einem Buchstaben als Token ansehen? Was ist wenn dazwischen Leerzeichen stehen? Was ist mit einem Postinkrement-Operator?

Und warum machst du es dann nicht so wie bei den anderen Token die einen Wert haben?
Ich habe die neuen Files wieder in http://bitbucket.org/matrix/changed-tiny angehängt, wäre super, wenn du mal nachschauen könntest.
Installier dir doch bitte mal Mercurial. Es ist etwas mühsehlig die Dateien immer da runterzuladen und die Änderungen zu den letzten Versionen rauszusuchen. Außerdem ist BitBucket dafür nun auch wieder nicht gedacht einfach nur profan Dateien hochzuladen. Siehe http://bitbucket.org/help/GettingStartedWithMercurial#mercurial-primer

Gruß
 
Hi.
Code:
"++"[a-zA-Z] {return INC;}
Warum willst du denn einen Operator mit einem Buchstaben als Token ansehen? Was ist wenn dazwischen Leerzeichen stehen? Was ist mit einem Postinkrement-Operator?

Gruß

weil die Eingabe so aussieht: ++x, wenn ich nur die ++ Eingabe mache dann erkennt er es ja, ich will aber,da dass er ausgibt

Code:
INC
     Id: x

z.b.

danke.

Hi.
Code:
"++"[a-zA-Z] {return INC;}

Und warum machst du es dann nicht so wie bei den anderen Token die einen Wert haben?
Gruß

was meinst du damit, klappt es nicht, wenn ich wie bei meinem JMP befehl nur "++ " und dann so ne art label_stmt definiere also ic meine so:

Code:
id_stmt: '++' ID
	{ $$ = newStmtNode(BeK);
       $$->attr.name = $2;
  	}

inc_stmt: INC ID
	{
	$$ = newStmtNode(IncK);
	$$->attr.name = $2;
	}

kann es nicht so klappen.Danke.

Gruß

Was ist mit einem Postinkrement-Operator?

Ich benutze einen Pre-inkrement operator deshalb.

Danke.
Gruß
 
Guten Morgen deepthroat,

Ich hab also meiner Aufgabenstellung nach alles hinbekommen, nun habe ich eine neue Problematik, darauf komme ich leider nicht kannst mir ja helfen, das wäre super.

Bei einer normalen If-Anwisung, gibt mr meine Ausagbe alles aus was es tun soll, nur jetzt ist es einbißchen anders. Erst wenn ich einen JMP befehl eingegeben hatte hatte er es erkannt und hat zugleich den Label angegeben. Nun aber wenn z.B ich eine If anweisung angebe, und die Anweisung des If's zutrifft, tut er ja den Befehl aus, ansonsten (else) soll er eine andere Anweisung ausführen, aber bei der Ausgabe soll angegeben werden, if wurde benutzt, welcher operator Konstante Bezeichner, tut ja mein compiler auch, nun soll er die erste Anweisung ausgeben (vor dem else) und dann soll er direkt ausgeben, JMP zum ende der If Schleife, da die Anweisung erfüllt wurde und die Anweisung nach der else nicht nötig ist, dann erst soll er die zweite Anweisung ausgeben. Ich verdeutliche dies mal anhand eines Beispiels mit zugewiesenen Adressen:

Eingabe Adr Ausgabe

Code:
if(x==0)        10   if(x==0)
Wait 5          20   WAIT 5
else            30   JMP 50
Wait 1          40   WAIT 1
end             50   END

so ungefähr hoffe du verstehst was ich meine.

Danke Nochmals.

MfG
Matrix

Hallo,

hab mir überlegt, dass ich eine spezielle if-Anweisung benötige, z.B.
Code:
IF exp jmp_stmt_end stmt_seq END
dass heißt, der compiler müsste erkennen dass in der if Anweisung ein end eingeben wurde und dass genauso wie bei label abspeichert und dann bei der Ausgabe den JMP End ausgibt, wie ich ihn oben definiert habe, was hälst du davon.

Danke.

MfG
Matrix
 
Hi.
Bei einer normalen If-Anwisung, gibt mr meine Ausagbe alles aus was es tun soll, nur jetzt ist es einbißchen anders. Erst wenn ich einen JMP befehl eingegeben hatte hatte er es erkannt und hat zugleich den Label angegeben. Nun aber wenn z.B ich eine If anweisung angebe, und die Anweisung des If's zutrifft, tut er ja den Befehl aus, ansonsten (else) soll er eine andere Anweisung ausführen, aber bei der Ausgabe soll angegeben werden, if wurde benutzt, welcher operator Konstante Bezeichner, tut ja mein compiler auch, nun soll er die erste Anweisung ausgeben (vor dem else) und dann soll er direkt ausgeben, JMP zum ende der If Schleife, da die Anweisung erfüllt wurde und die Anweisung nach der else nicht nötig ist, dann erst soll er die zweite Anweisung ausgeben. Ich verdeutliche dies mal anhand eines Beispiels mit zugewiesenen Adressen:

Eingabe Adr Ausgabe

Code:
if(x==0)        10   if(x==0)
Wait 5          20   WAIT 5
else            30   JMP 50
Wait 1          40   WAIT 1
end             50   END
Du willst jetzt also den Code übersetzen, so dass kein else mehr in dem Code ist, sondern ein JMP auf bzw. hinter das Ende des Else-Anweisungsblocks gemacht wird.

hab mir überlegt, dass ich eine spezielle if-Anweisung benötige, z.B.
Code:
IF exp jmp_stmt_end stmt_seq END
dass heißt, der compiler müsste erkennen dass in der if Anweisung ein end eingeben wurde und dass genauso wie bei label abspeichert und dann bei der Ausgabe den JMP End ausgibt, wie ich ihn oben definiert habe, was hälst du davon.
Matrix
Du hast doch aber schon alles abgespeichert. Also brauchst du auch keine spezielle if-Anweisung.

Bei einer if-else Anweisung hast du einen If Knoten im AST und dieser hat als 3. Kindknoten den else-Anweisungsblock. Wenn du jetzt Code anhand des AST generierst, dann mußt du doch sowieso erstmal die Zeilennummern generieren und dementsprechend auch einen JMP generieren.

Gruß
 
Hallo,

ja genau wenn die if anweisung x==0 zutrifft dann ist ja Wait 5 in ordnung und bei der Ausgabe soll direkt nach WAIT 5 dann JMP stehen und danach dann Wait 1. Die Adressen habe ich als Beispiel angehängt, um JMP zu verstehen.

Code:
Eingabe     Adr.  Ausgabe
if(x==0)        10   if(x==0)
Wait 5          20   WAIT 5
else            30   JMP 50
Wait 1          40   WAIT 1
end             50   END

Wenn du jetzt Code anhand des AST generierst, dann mußt du doch sowieso erstmal die Zeilennummern generieren und dementsprechend auch einen JMP generieren.

Ich versteh das nicht so ganz mit den Zeilennummern generieren.Dannke.

Gruß
 
Hallo,

ja genau wenn die if anweisung x==0 zutrifft dann ist ja Wait 5 in ordnung und bei der Ausgabe soll direkt nach WAIT 5 dann JMP stehen und danach dann Wait 1. Die Adressen habe ich als Beispiel angehängt, um JMP zu verstehen.

Code:
Eingabe     Adr.  Ausgabe
if(x==0)        10   if(x==0)
Wait 5          20   WAIT 5
else            30   JMP 50
Wait 1          40   WAIT 1
end             50   END

Ich versteh das nicht so ganz mit den Zeilennummern generieren.Dannke.
Du hast in dem Beispiel die Befehle numeriert, du hast es Adressen genannt. Du mußt ja irgendwo hinspringen. Wenn du den "JMP 50" Befehl generierst, dann mußt du auch eine Zeilennummer/Adresse Nr. 50 haben. Diese mußt du dann eben generieren. Oder du generierst eben ein Label an der Stelle (falls Label in der Zielsprache existieren ?)

Gruß
 
Hallo,
ja gut dass habe ich zum verstehen des JMP Befehls reingetan, damit man weiß wo er hinspringen soll, das kommt aber erst später, alse erstes soll er überhaupt erkennen dass da ein JMP hin muss.
meine Ausgabe sollte so aussehen, laut meinem Compiler:

Code:
Eingabe:

if(x==0)
y=0;
else
y=1;
end;

Ausgabe:

If
  Id: x
  const: 0
    Assign to: y
      const: 0
       JMP  (soll natürlich zum end des if's springen, deine Idee mit der Zeilennummergenerierung ist 
                    in ordnung, so will ich es auch machen nachher)
   Assign to: y
      const: 1

wenn ich das hinbekomme, kümmere ich mich drum wo der JMP hinspringen muss. Was ich vorhabe ist, dass bei jeder if Anweisung, ein JMP dabi ist, dass direkt nach der ersten Anweisung bei der Ausgabe stehen soll. Deshalb meinte ich ob ich vielleicht eine neue if Anweisung definieren sollte. Danke.

Gruß
 
Zuletzt bearbeitet:
Hallo,
ja gut dass habe ich zum verstehen des JMP Befehls reingetan, damit man weiß wo er hinspringen soll, das kommt aber erst später, alse erstes soll er überhaupt erkennen dass da ein JMP hin muss.
meine Ausgabe sollte so aussehen, laut meinem Compiler:

Code:
Eingabe:

if(x==0)
y=0;
else
y=1;
end;

Ausgabe:

If
  Id: x
  const: 0
    Assign to: y
      const: 0
       JMP  (soll natürlich zum end des if's springen, deine Idee mit der Zeilennummergenerierung ist 
                    in ordnung, so will ich es auch machen nachher)
   Assign to: y
      const: 1

wenn ich das hinbekomme, kümmere ich mich drum wo der JMP hinspringen muss. Was ich vorhabe ist, dass bei jeder if Anweisung, ein JMP dabi ist, dass direkt nach der ersten Anweisung bei der Ausgabe stehen soll.
Das ist doch aber nun wirklich trivial, im AST den entsprechenden Kindknoten eines IfK herauszusuchen und dann einfach noch JMP auszudrucken. Mach einfach mal.

Gruß
 
Zurück