Simple Flex / Bison C ++

Ya busqué mi respuesta, pero no obtuve ninguna respuesta rápida para un ejemplo simple.

Quiero compilar un analizador / analizador flex / bison usando g ++ solo porque quiero usar clases de C ++ para crear AST y cosas similares.

Buscando en Internet, encontré algunas vulnerabilidades y todos decían que lo único que se necesita es declarar algunos prototipos de funciones usando extern "C" en el archivo lex.

Así que mi archivo shady.y es

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

mientras que el archivo shady.l es

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

%%

Finalmente en el makefile yo uso g ++ en lugar de 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 y Bison funcionan correctamente, pero al enlazar recibo el siguiente error:

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

Por supuesto, si trato de cambiar algo acerca de la función en el archivo de bisontes, dice que yylex no está declarado en el alcance de yyparse.

¿Estoy tratando de resolver simplemente algo que es más complejo de lo que parece? En realidad no necesito una estructura cerrada para tener acceso a análisis y lexer de forma orientada a objetos, solo quiero que funcione.

Solo quiero poder usar C ++ en el archivo bison (para crear AST) y llamar a yyparse () desde objetos C ++.

Gracias por adelantado

Respuestas a la pregunta(1)

Su respuesta a la pregunta