Flex & Bison

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
jogix
Beiträge: 776
Registriert: 05.10.2002 20:08:16
Wohnort: Lampertheim
Kontaktdaten:

Flex & Bison

Beitrag von jogix » 26.04.2004 15:10:22

Hi,

hat von Euch schon mal jemand mit Flex & Bison gearbeitet?

Was ist eigentlich mit Flex++ & Bison++? Irgendwie scheinen mir die Projekte tot zu sein?
cheers,
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Re: Flex & Bison

Beitrag von Joghurt » 26.04.2004 15:24:41

jogix hat geschrieben:Hi,

hat von Euch schon mal jemand mit Flex & Bison gearbeitet?
Ja, hab ich für meinen kleinen C-Compiler gebraucht.
Was ist eigentlich mit Flex++ & Bison++? Irgendwie scheinen mir die Projekte tot zu sein?
Sind wahrscheinlich forks, die C++-Code erzeugen. Bison kann das aber inzwischen glaube ich auch.

Benutzeravatar
jogix
Beiträge: 776
Registriert: 05.10.2002 20:08:16
Wohnort: Lampertheim
Kontaktdaten:

Re: Flex & Bison

Beitrag von jogix » 26.04.2004 15:42:43

Joghurt hat geschrieben:
Was ist eigentlich mit Flex++ & Bison++? Irgendwie scheinen mir die Projekte tot zu sein?
Sind wahrscheinlich forks, die C++-Code erzeugen. Bison kann das aber inzwischen glaube ich auch.
Der Output soll bei denen dann in Klassenform sein, also entsprechend C++. Klar, wenn Bison das auch kann, braucht kein Mensch mehr Bison++. Das ist dann wohl auch der Grund, warum das nicht mehr weiter entwickelt wird, schätze ich mal.

Kennst du ne gute Doku zu Flex und Bison? Oder sind die Manuals auf der GNU Seite brauchbar - hab sie bisher nur überflogen.
Werde demnächst (in diesem Semester) wohl auch einen kleinen Compiler o.ä. schreiben müssen (oder auch dürfen, wenn man meine Motivation, diese V zu hören betrachtet :roll: )
cheers,
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Re: Flex & Bison

Beitrag von Joghurt » 26.04.2004 16:11:23

jogix hat geschrieben:Kennst du ne gute Doku zu Flex und Bison? Oder sind die Manuals auf der GNU Seite brauchbar - hab sie bisher nur überflogen.
Ich konnte eigentlich mit info flex und info bison alles notwendige Erlernen.

Shinee
Beiträge: 7
Registriert: 23.05.2005 10:24:36

Beitrag von Shinee » 23.05.2005 10:33:57

ich hätte auch ein Problem zu flex in diesem Fall nutze ich die flex++ Version.

Und zwar möchte ich dem Flex++ mitteilen, dass er den Rest der Zeile (sprich bis zum \n)
wegwerfen soll, und mit der nächsten Zeile wie gewohnt fortfahren soll.

Geht darum wenn ein Fehler in der Zeile auftritt, die ganze Zeile als ungültig wegzuwerfen.
Muss irgendwie möglich sein, weil das im Prinzip ein öfter benötigtes feature sein müsste.
Ansonsten muss der Aufrufer dies koordinieren, was nicht so die saubere Art ist.

Vielleicht kann mir ja einer helfen, bei Fragen beantworte ich die gerne.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 23.05.2005 11:20:24

Willkommen im Forum!

Auch wenn andere Foren das teilweise genau gegenteilig behandeln: grabe bitte keine alten Threads aus, sondern mache einfach einen neuen. (Siehe auch die Verhaltensregeln)

Helfen tue ich natürlich trotzdem:

Ich glaube, du mißbrauchst flex. flex ist ein Scanner(oder Tokenizer)-Generator, dass was du möchtest, ist die Aufgabe des Parsers, und bison, ein Parser-Generator, kennt auch das ERROR-Tag, mit dem du im Fehlerfalle beliebig viel überspringen kannst.
Falls du noch nicht bison verwendest, lerne es! Es mag Anfangs umständlich erscheinen, zwei Programme verwenden zu müssen, aber in fast allen Fällen ersparst du dir Arbeit, wenn die Syntax ein bisschen komplizierter wird.

HTH

Shinee
Beiträge: 7
Registriert: 23.05.2005 10:24:36

Beitrag von Shinee » 23.05.2005 11:52:51

Alles klar werde ich das nächste mal berücksichtigen, aber jetzt brauch ichs nicht mehr machen schätze ich.

Danke für die Hilfe.

Ich nehm flex nicht als Parser (generator) sondern nur um die Tokens zu filtern.
Den Syntaxcheck übernimmt in meinem Fall der Aufrufer von flex.
Sollte dieser nun feststellen, dass ein "Operator" nicht bekann sein sollte, sprich ein Fehler aufgetreten ist möchte ich den Scanner dazu veranlassen, den Rest der Zeile nicht als jeden einzelen Token zurückzugeben, was er normalerweise machen würde, sondern erst wieder damit anzufangen nach dem nächsten Newline.
Praktisch mit neuen Scanregeln fortzufahren und wenn das Newline kommt wieder zurückzuschalten.

Dachte vielleicht geht das über das ändern eines defines oder ähnlichem, weil scanner das normalerweise können müssten :)

Ich hab da vielleicht schon eine Idee, welche ich nach dem essen mal ausprobierern werde. Vielleicht fällt dir ja noch was ein. Vielen Dank

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 23.05.2005 12:04:11

flex und bison sollte ja sowieso jeder in seinem werkzeugkasten haben - nicht nur für das programmieren einer höheren prog. sprache - damit kann man vielmehr machen - emails scannen und und und - bisschen komisch das fast keiner die tools für sachen verwendet die nicht explizit mit dem programmieren zu tun haben ...

ich denke wenn man diese tools allgem. betrachtet versteht man auch viel besser wie sie arbeiten und was noch mit ihnen möglich ist - vorallem sieht man auch das jedes eigenständig verw. werden kann

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 23.05.2005 12:23:22

Hab noch mal nachgeschaut, flex kann das. Stichwort Start Conditions in der infopage.
Kurzes Beispiel

Code: Alles auswählen

%x error
..
%%
<error>\n {BEGIN(INITIAL);}
<error>[^\n]*  /* alles ignorieren */

hier alle weiteren regeln

Shinee
Beiträge: 7
Registriert: 23.05.2005 10:24:36

Beitrag von Shinee » 23.05.2005 12:36:28

ja an den ansatz hatte ich auch gedacht, danke erstmal das werde ich versuchen.

Shinee
Beiträge: 7
Registriert: 23.05.2005 10:24:36

Beitrag von Shinee » 23.05.2005 14:39:37

Hab das mal versucht, aber gibt Probleme mit den Sektoren, bzw. weiß nicht genau woran es liegt. Flex stört das nicht und generiert einwandfrei. Nur der c++ kompiler bringt fehlermeldungen, die dannach aussehen als ob ich was vergessen hätte oder die verschiedenen Bereiche nicht richtig verwendet habe.

Code: Alles auswählen

%header{
static int num_lines = 1;
static bool error_mode_flag = false;
%}

%{
   #include "scan.h"
   count_newline(char * var, int len)   { ...   }
%}

%name lex
%%
%s error_mode
%%

DIGIT         [0-9]
{DIGIT}                                     { if(error_mode_flag) BEGIN(error_mode); return 1; }

<error_mode>\n    { BEGIN(INITIAL); }
Fehlercode Kompiler:

Code: Alles auswählen

Scan.cpp
scanrules(30) : error C2065: 'error_mode' : nichtdeklarierter Bezeichner
scanrules(30) : error C2143: Syntaxfehler : Fehlendes ';' vor 'break'
scanrules(35) : error C2118: Positiver oder negativer Index ist zu gross
scanrules(36) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'SIGN'
scanrules(36) : error C2501: 'DIGIT' : Fehlende Speicherklasse oder Typbezeichner
scanrules(36) : fatal error C1004: Unerwartetes Dateiende gefunden

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 23.05.2005 16:24:37

1. Muss es "%x error_mode" heißen
2. Gehört das in den preamble, also noch vor den ersten "%%"
3. Fehlt der Teil, der Buchstaben überspringt (<error_mode>[^\n]* /*nichts*/)
4. Kannst du BEGIN(error_mode) wahrscheinlich auch direkt im Code aufrufen.

Shinee
Beiträge: 7
Registriert: 23.05.2005 10:24:36

Beitrag von Shinee » 24.05.2005 09:29:21

Ich hab das mal jetzt alles versucht und funktioniert nicht. bin echt schon am verzweifeln.
flexx++ generiert daraus ohne zu meckern .h und .cpp datei nur der c++ comipler stört sich daran. als ob da nen abschlusszeichen fehlen würde. vielleicht findet ja jemand was, was falsch sein könnte.

http://nopaste.debianforum.de/288

Der 1. Fehler tritt bei dem DIGIT in scanrules auf.

Code: Alles auswählen

Scan.cpp
scanrules(35) : error C2118: Positiver oder negativer Index ist zu gross
scanrules(36) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'SIGN'
scanrules(36) : error C2501: 'DIGIT' : Fehlende Speicherklasse oder Typbezeichner
scanrules(36) : fatal error C1004: Unerwartetes Dateiende gefunden

Shinee
Beiträge: 7
Registriert: 23.05.2005 10:24:36

Beitrag von Shinee » 24.05.2005 09:45:07

problem scheint behoben, lag an den sektoren der scanrules, was ich falsch gemacht hatte.

definitions
%%
rules
%%
user code

Shinee
Beiträge: 7
Registriert: 23.05.2005 10:24:36

Beitrag von Shinee » 25.05.2005 09:38:38

hm hab noch ein problem und zwar müsste ich von aussen, sprich mit dem aufruf einer funktion der flexklasse den scanner in einer anderen condition arbeiten lassen. also praktisch umschalten. in der man un doc find ich nichts darüber was mir weiterhelfen könnte.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 25.05.2005 12:01:42

Joghurt hat geschrieben:4. Kannst du BEGIN(error_mode) wahrscheinlich auch direkt im Code aufrufen.

Antworten