Einfaches Flex / Bison C ++

Ich habe bereits nach meiner Antwort gesucht, aber für ein einfaches Beispiel habe ich keine schnelle Antwort erhalten.

Ich möchte einen Flex / Bison-Scanner + Parser mit g ++ kompilieren, nur weil ich C ++ - Klassen verwenden möchte, um AST und ähnliche Dinge zu erstellen.

Suche über das Internet Ich habe einige Exploits gefunden, von denen alle sagen, dass das einzige, was benötigt wird, die Deklaration einiger Funktionsprototypen unter Verwendung von externem "C" in der Lex-Datei ist.

Also meine shady.y Datei ist

%{
#include <stdio.h>
#include "opcodes.h"
#include "utils.h"

void yyerror(const char *s)
{
    fprintf(stderr, "error: %s\n", s);
}

int counter = 0;

extern "C"
{
        int yyparse(void);
        int yylex(void);  
        int yywrap()
        {
                return 1;
        }

}

%}

%token INTEGER FLOAT
%token T_SEMICOL T_COMMA T_LPAR T_RPAR T_GRID T_LSPAR T_RSPAR
%token EOL

%token T_MOV T_NOP


%% 

... GRAMMAR OMITTED ...

%%

main(int argc, char **argv)
{
    yyparse();
}

während shady.l Datei ist

%{
    #include "shady.tab.h"
%}

%%

"MOV"|"mov" { return T_MOV; }
"NOP"|"nop" { return T_NOP; }

";" { return T_SEMICOL; }
"," { return T_COMMA; }
"(" { return T_LPAR; }
")" { return T_RPAR; }
"#" { return T_GRID; }
"[" { return T_LSPAR; }
"]" { return T_RSPAR; }
[1-9][0-9]? { yylval = atoi(yytext); return INTEGER;}
[0-9]+"."[0-9]+ | "."?[0-9]? { yylval.d = atof(yytext); return FLOAT; }
\n { return EOL; }
[ \t] { /* ignore whitespace */ }
. { printf("Mystery character %c\n", *yytext); }

%%

Schließlich verwende ich im Makefile g ++ anstelle von gcc:

shady: shady.l shady.y
bison -d shady.y -o shady.tab.c
flex shady.l
g++ -o $@ shady.tab.c lex.yy.c -lfl

Flex und Bison funktionieren korrekt, aber beim Verknüpfen erhalte ich den folgenden Fehler:

Undefined symbols:
  "_yylex", referenced from:
  _yyparse in ccwb57x0.o

Wenn ich versuche, etwas an der Funktion in der Bison-Datei zu ändern, heißt es natürlich, dass yylex nicht im Geltungsbereich von yyparse deklariert ist.

Versuche ich einfach etwas zu lösen, das komplexer ist, als es scheint? Eigentlich brauche ich keine geschlossene Struktur, um objektorientiert auf parsen und lexen zuzugreifen, ich möchte nur, dass es funktioniert.

Ich möchte nur in der Lage sein, C ++ in der Bison-Datei zu verwenden (um AST zu erstellen) und yyparse () aus C ++ - Objekten aufzurufen.

Danke im Voraus

Antworten auf die Frage(1)

Ihre Antwort auf die Frage