Simple Flex / Bison C ++

Szukałem już odpowiedzi, ale nie otrzymałem żadnej szybkiej odpowiedzi na prosty przykład.

Chcę skompilować parser flex / bison scanner + używając g ++ tylko dlatego, że chcę używać klas C ++ do tworzenia AST i podobnych rzeczy.

Przeszukując Internet znalazłem kilka exploitów, wszystkie mówiąc, że jedyną rzeczą jest zadeklarowanie niektórych prototypów funkcji przy użyciu extern „C” w pliku lex.

Tak jest mój plik shady.y

%{
#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();
}

podczas gdy plik shady.l jest

%{
    #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); }

%%

Wreszcie w makefile używam g ++ zamiast 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 i bison działają poprawnie, ale po połączeniu otrzymuję następujący błąd:

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

Oczywiście, jeśli spróbuję coś zmienić w funkcji w pliku bison, mówi, że yylex nie jest zadeklarowany w zakresie yyparse.

Czy próbuję rozwiązać coś bardziej skomplikowanego niż się wydaje? Właściwie nie potrzebuję zamkniętej struktury, aby mieć dostęp do analizowania i leksykowania w sposób zorientowany obiektowo.

Chcę tylko móc używać C ++ w pliku bison (aby utworzyć AST) i wywołać yyparse () z obiektów C ++ ..

Z góry dziękuję

questionAnswers(1)

yourAnswerToTheQuestion