IF Anweisung in Flex bison realisieren

matrix1

Mitglied
Hallo,
kann jemand mir dabei helfen eine If Schleife in Flex zu realisieren.
Das hier ist ein beispiel. Als erstes will ich es schaffen einen jump befehl hinzubekommen, dass flex JMP als token aufnimmt und dann in bison so generiert wird, dass bei einem JMP er zu label L1 springt und schleife von vorne beginnt.
Bin sehr dankbar für euere Hilfe.

:L1
IF FLAG AND X"0001"
EVT 23;
ELSE
WAIT 500 ms;
JMP L1;
END IF;


MfG
Matrix
 
Implementierung von IF in flex/bison

Hallo,
ich versuche Gerade IF Anweisung mit Flex/Bison zu realisieren, hab so die Syntax aufgebaut, nun versuche ich die Semantik du deklarieren, leider komme ich nicht voran, bin ganz neu dabei hab nicht viel ahnung, hab schon etliche manuals gelesen, aber non Erfahrung.
dieser Programmablauf ungefähr will ich realisieren:

:L1
IF FLAG AND X"0001"
EVT 23;
ELSE
WAIT 500 ms;
JMP L1;
END IF;

hab nun die Bison datei erstellt:
%token ID IF ELSE OR AND END NAME

%start label
%%

statements: /* allow empty statements */ | stm | statements ';' stm;

stm: ifStatement
| NAME
| NAME expList
| label;

expList: expression | expList expression;

label: ':' NAME { /*code um label abzuspeichern */ };

ifStatement: IF expression statements
| IF expression statements ELSE statements;

expression: ID { /* code um mit gefundener ID umzugehen */ }
| expression AND expression { /* Code um zwei Ausdrücke mit and zu erknüpen */ }
| expression OR expression
| '(' expression ')';


und die Flex datei:

%{
#include "ifstatement.h"
%}
%option noyywrap

%%
IF return IF;
ELSE return ELSE;
OR return OR;
AND return AND;
[A-Z]+ { yylval=atoi(yytext); return ID; }
%%

int main(){



}

Wäre super wenn mir jemand mit der Semantik weiterhelfen könnte.Danke.

MfG

Matrix
 
Ich hab nicht wirklich Ahnung von Flex und Bison, ich habe mir einfach mal kurz eine Seite mit Beispielen angesehen, aber so wie ich das verstanden habe ist ja Flex grundsätzlich lediglich dazu da Eingaben des Benutzers nach Regex-Regeln zu verarbeiten? Was genau meinst du da mit "Implementierung von IF"? Gewöhn dir ausserdem an Code immer in entsprechende Code-Tags zu fassen.
 
hallo
ich möchte einen interpreter schreiben, der eine if anweisung analysieren soll und die befehle ausführen soll, damit ich nicht alles einzeln eintippen muss.danke

mfg
matrix
 
JMP-Befehl in Flex/Bison realisieren

Hallo allerseits,
hat jemand ne idee wie man den JMP (Jump) Befehlr wie den in Assembler gibt, um zu bestimmten labels zu springen, realisieren kann, bin schon die ganze Zeit dabei, komme einfach nicht drauf, hab herausgefunden dass es eine Funktion namens goto gibt, mit der man zu vordefinierten labels springen kann. Kann mir jemand helfen.Danke.
so ungefähr sieht mein Beispiel aus:

:L1
IF FLAG AND X"0001"
EVT 23;
ELSE
WAIT 500 ms;
JMP L1;
END IF;
 
Hallo,

Flex und Bison sind Tools für die syntaktische Analyse. Für die Semantik deiner Sprache musst du schon eigene Algorithmen und Datenstrukturen verwenden. Du könntest dazu den Quelltext beispielsweise (mit Bison) zuerst in einen abstrakten Syntaxbaum transformieren und diesen dann ablaufen.

Grüße,
Matthias
 
Hallo,
vielen Ddank für deine Antwort,
ich habe bereits ein Syntaxbaum erstellt, habe nun auch versucht goto funtion zu implementieren, hatte vergessen dass dies ja eine syntaktische analyse ist und keine Funktionsprogrammierung. Leider kommt bei mir die ganze Zeit eine Fehlermeldung ich häng dir mal die .l und .y dateien mal an, wäre super wenn du drüber schauen könntest. Hab erst mit goto versucht wenn das klappt will ich es zu JMP umsetzen, da dieser interpreter ja JMP erkennen soll und dsann sagen soll wohin e springt, soweit muss ich kommen.Danke.

MfG
Matrix
 

Anhänge

  • testprog.zip
    2,3 KB · Aufrufe: 15
Hi.
Hallo,
vielen Ddank für deine Antwort,
ich habe bereits ein Syntaxbaum erstellt, habe nun auch versucht goto funtion zu implementieren, hatte vergessen dass dies ja eine syntaktische analyse ist und keine Funktionsprogrammierung. Leider kommt bei mir die ganze Zeit eine Fehlermeldung
Welche?
ich häng dir mal die .l und .y dateien mal an, wäre super wenn du drüber schauen könntest.
Ich hab's mir mal angeschaut. Komisch ist, dass die definierte Grammtik irgendwie nicht richtig zu deinem Beispielcode passt. Bist du sicher das du die Dateien nicht 1:1 von hier übernommen hast?! :suspekt:

Wie Matthias schon sagte, wenn du erstmal den Syntaxbaum hast, dann kannst du ihn auch traversieren. Du mußt dann nur programmieren was passieren soll wenn du auf einen JMP Knoten im Baum triffst. D.h. du müßtest dann das entsprechende LABEL suchen (oder gleich in einer Tabelle abspeichern) und dann an diese Stelle (bzw. die darauffolgende Anweisung) springen.

Gruß
 
Hallo,
Danke für deine schnelle Antwort.
Mir sind einige Sachen unklar, was meinst du mit traversieren und welche tabelle meinst du, habe ich das mit

label_stmt: Name ':' {printf("%s:\n",$1);}

goto_stmt: GOTO NAME ';' {printf("\tJNZ %s\n",$2);}

nicht initialisiert.

Kannst du mir anhand eines Beispiels zeigen, was genau du meinst.Danke.
 
Mir sind einige Sachen unklar, was meinst du mit traversieren
Ich meine du kannst den Baum dann durchlaufen wie du möchtest.
und welche tabelle meinst du,
Entweder du suchst in dem Baum nach dem entsprechenden Ziel-Label von dem JMP Befehl oder du legst dir gleich eine Tabelle an, wo du einem Label gleich einen Knoten im Baum zuordnen kannst.
habe ich das mit

label_stmt: Name ':' {printf("%s:\n",$1);}

goto_stmt: GOTO NAME ';' {printf("\tJNZ %s\n",$2);}

nicht initialisiert.
Was meist du mit initialisiert? Du gibst da nur etwas auf der Standardausgabe aus. Du mußt es in den Syntaxbaum mit aufnehmen (und optional auch noch einen Eintrag in die Label-Tabelle machen).

Gruß
 

Neue Beiträge

Zurück