Flex & Bison
Flex & Bison
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?
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
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra
Re: Flex & Bison
Ja, hab ich für meinen kleinen C-Compiler gebraucht.jogix hat geschrieben:Hi,
hat von Euch schon mal jemand mit Flex & Bison gearbeitet?
Sind wahrscheinlich forks, die C++-Code erzeugen. Bison kann das aber inzwischen glaube ich auch.Was ist eigentlich mit Flex++ & Bison++? Irgendwie scheinen mir die Projekte tot zu sein?
Re: Flex & Bison
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.Joghurt hat geschrieben:Sind wahrscheinlich forks, die C++-Code erzeugen. Bison kann das aber inzwischen glaube ich auch.Was ist eigentlich mit Flex++ & Bison++? Irgendwie scheinen mir die Projekte tot zu sein?
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 )
cheers,
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra
Re: Flex & Bison
Ich konnte eigentlich mit info flex und info bison alles notwendige Erlernen.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 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.
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.
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
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
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
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
- meandtheshell
- Beiträge: 4054
- Registriert: 14.01.2005 17:51:30
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
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
Hab noch mal nachgeschaut, flex kann das. Stichwort Start Conditions in der infopage.
Kurzes Beispiel
Kurzes Beispiel
Code: Alles auswählen
%x error
..
%%
<error>\n {BEGIN(INITIAL);}
<error>[^\n]* /* alles ignorieren */
hier alle weiteren regeln
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.
Fehlercode Kompiler:
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); }
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
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.
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