Simple Flex/Bison C++

J'ai déjà regardé pour ma réponse mais je n'ai pas toute la réponse rapide pour un exemple simple.

Je veux compiler un flex/bison scanner+analyseur à l'aide de g++ juste parce que je veux utiliser des classes C++ pour créer des AST et autres choses semblables.

De la recherche sur internet, j'ai trouvé quelques exploits, tout en disant que la seule chose nécessaire est de déclarer certains prototypes de fonction à l'aide extern "C" dans le fichier lex.

Donc mon ombragé.y fichier est

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

tout ombragé.l fichier est

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

%%

Enfin dans le makefile j'utilise g++ au lieu 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 et bison travail correctement, mais lors de la liaison j'obtiens l'erreur suivante:

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

Bien sûr, si j'essaie de changer quoi que ce soit à propos de la fonction de bison fichier il est dit que yylex n'est pas déclarée dans le champ d'application de yyparse.

Suis-je en train d'essayer de résoudre simplement quelque chose qui est plus complexe qu'il n'y paraît? En fait je n'ai pas besoin d'une structure fermée pour avoir accès à l'analyser et de l'analyseur lexical dans un objet, je veux juste le faire fonctionner.

Je veux juste être en mesure d'utiliser le C++ chez les bisons de fichier (pour créer des AST) et d'appeler yyparse() à partir d'objets C++..

Merci d'avance

Flex et bison des drapeaux, pour générer du C++, pas de C.
Beurk. Ce n'est pas une bonne idée d'utiliser impur, non réentrant C analyseurs statiques de variables globales en C++. C'est beaucoup plus propre d'utiliser flex et bison en C++ modes respectivement. gnu.org/software/bison/manual/...

OriginalL'auteur Jack | 2009-10-20