Ich habe schon nach meiner Antwort gesucht, aber für ein einfaches Beispiel habe ich keine schnelle Antwort bekommen.Simple Flex/Bison C++
Ich möchte einen Flex/Bison-Scanner + Parser mit g ++ kompilieren, nur weil ich C++ - Klassen verwenden, um AST und ähnliche Dinge zu erstellen.
Suche über das Internet Ich habe einige Exploits gefunden, alle sagen, dass die einzige notwendige Sache ist, einige Funktionsprototypen mit externem "C" in der Lex-Datei zu deklarieren.
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
%{
#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 in der Make-Datei ist verwende ich g ++ anstelle von gcc:
shady: shady.l shady.y
bison -d shady.y -o shady.tab.c
flex shady.l
g++ -o [email protected] shady.tab.c lex.yy.c -lfl
flex und Bison funktionieren korrekt, aber beim Verknüpfen bekomme ich den folgenden Fehler:
Natürlich, wenn ich versuche, etwas über die Funktion in Bison-Datei zu ändern, heißt es, dass yylex nicht im Rahmen von yyparse deklariert ist.
Ich versuche, einfach etwas zu lösen, das komplexer ist als es scheint? Eigentlich brauche ich keine geschlossene Struktur, um objektorientiert auf Parse und Lexer zugreifen zu können, ich will es einfach zum Laufen bringen.
Ich möchte nur in der Lage sein, C++ in Bison-Datei (AST erstellen) und yyparse() aufzurufen, von C++ Objekten ..
Vielen Dank im Voraus
Sowohl Flex als auch Bison haben Flags, um C++ zu erzeugen, nicht C. – vonbrand
Yuck. Es ist keine gute Idee, unreine, nicht-reentrante C-Parser mit statischen globalen Variablen in C++ zu verwenden. Es ist viel sauberer, Flex und Bison in C++ - Modi zu verwenden. https://www.gnu.org/software/bison/manual/bison.html#A-Complete-C_002b_002b-Beispiel – Barry