Integrationsproblem Flex Bison in Visual Studio?

dertobian

Mitglied
Hallo,

ich muss mir einen Parser bauen und habe mich für Flex und Bison entschieden. Das Ganze soll in Visual Studioo 2005 umgesetzt werden.
Nun habe ich zum Testen erstmal eine Dummy-l und -y-Datei geschrieben und mitkompiliert.
Das Erstellen der entsprechenden C++ Dateien geht auch. Aber bei denen bekomme ich nun Fehler, die ich mir nicht ganz erklären kann.

Die l-Datei
Code:
%{

#pragma once

#include "stdafx.h"

%}

%%



%%



%%

int yywrap()
{
  // following statements will never be executed, just to avoid warnings
  int never = 0;
  if( never )
  {
    yy_flex_realloc( 0, 0 );
    yyunput( 0, "");
  }
  return ( 1 );     // done.
}

Die y-Datei
Code:
%{

#pragma once

#include "anaqueryscanner.l.cpp"
#include "stdafx.h"

int yylex(void);
void yyerror(char*);

%}

%start query_start
%%

query_start	: 	;

%%

Der Fehler
Fehler 4 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'YY_PROTO' anaqueryscanner.l.cpp 380

Das ist die folgende Stelle
Code:
#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int yywrap YY_PROTO(( void )); // hier ist der Fehler
#else
extern int yywrap YY_PROTO(( void ));
#endif
#endif

Hat einer ne Idee?

Danke,

Gruß Tobian.
 
Hi.

Welche Version von flex hast du denn?

Eigentlich ist YY_PROTO als Makro definiert und der Compiler sollte diesen Bezeichner gar nicht mehr sehen können. Das kannst du ja mal in der .l.cpp Datei nachschauen (so Zeile 60 bis 65).

Gruß
 
Flex habbich mir vor 3 Wochen oder so runtergeladen. Also eigentlich nehme ich ja Cygwin. Krieg ich die Version über die Konsole raus?

Ja, Zeile 62 bis 65 steht das hier
Code:
#ifdef YY_USE_PROTOS
#define YY_PROTO(proto) proto
#else
#define YY_PROTO(proto) ()
#endif

Aber wie auch vorhin schon geschrieben, ist der Quelltext trotzdem so da. Ich hatte ja die Vermutung, dass der Compiler, wenn ich die Fehlermeldung
Fehler 4 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'YY_PROTO' anaqueryscanner.l.cpp 380
bekomme, nicht weiß, was "yywrap" ist...
 
Krieg ich die Version über die Konsole raus?
Ja:
Code:
flex --version
Aber wie auch vorhin schon geschrieben, ist der Quelltext trotzdem so da.
Ja, natürlich ist er so da. Aber der Quelltext wird ja erst vom C-Präprozessor verarbeitet und der sollte die Makros interpretieren und im Quelltext entsprechend ersetzen. Wenn er dies getan hätte, kann sich der C++-Compiler nicht mehr über YY_PROTO beschweren, weil dies hätte ersetzt werden sollen.
Ich hatte ja die Vermutung, dass der Compiler, wenn ich die Fehlermeldung bekomme, nicht weiß, was "yywrap" ist...
Der Compiler weiß auch nicht was yywrap ist, denn diese Funktion soll ja mit der Zeile gerade deklariert werden. Wenn das Makro YY_PROTO ordentlich definiert wäre, würde die Zeile die der Compiler bekommt so aussehen:
C++:
extern "C" int yywrap ( void );
Gruß
 
Muss ich das Makro selbst definieren? Eigentlich sollte das doch so gehen? Und auch die Parameter habbich glaub ich richtig angegeben.
 
Das habe ich bei den Eigenschaften der Flex- und Bison-Files angegeben.

l-File:
Befehlszeile: cd "$(InputDir)"
flex -Pyy -o$(InputFileName).cpp $(InputFileName)

Beschreibung: FLEX $(InputPath) -> $(InputFileName).cpp

Ausgaben: $(InputPath).cpp

y-File:
Befehlszeile: cd "$(InputDir)"
bison -l -d -o$(InputFileName).cpp $(InputFileName)

Beschreibung: BISON $(InputPath) -> $(InputFileName).cpp

Ausgaben: $(InputPath).cpp
 
Muss ich das Makro selbst definieren? Eigentlich sollte das doch so gehen? Und auch die Parameter habbich glaub ich richtig angegeben.
Nein, das Makro musst du nicht selbst definieren. Du mußt nur schauen warum es nicht funktioniert. Evtl. ist es ein Fehler in einer älteren Version und ein Update würde reichen.

Gruß
 
Sorry, war im Urlaub.

Ich glaube nicht, dass ich ein Update benötige. Ich habe von einem Kumpel ein Visual Studio-Projekt, welches sich komplett kompilieren und demensprechend auch starten lässt.
Also muss ich noch irgendeine Einstellung falsch haben. Muss ich denn sonst noch etwas machen, außer, wie vor ein paar Tagen beschrieben, in den Eigenschaften die Parameter angeben?

Gruß Tobian
 
Mir ist gerade aufgefallen, das du 4 Sektionen in deiner Flex Datei hast, es dürfen aber nur 3 sein:
Code:
         definitions
         %%
         rules
         %%
         user code
Gruß
 

Neue Beiträge

Zurück