Ich versuche, Flex und Bison zu verwenden, um einen Compiler zu erstellen. Aber ich erhalte Fehler, wenn ich versuche zu kompilieren.
Hier ist der Fehler:undefined Verweis auf `yylex '&& undefined Verweis auf` yyin'
flex --header-file=lex.h --outfile=lex.cc lex.ll
g++ -w -Wall -Wextra -ansi -g -c -o lex.o lex.cc -lm -ll
bison -v --output-file=parse.cc --defines=parse.hh --warnings=all --feature=all parse.yy
g++ -w -Wall -Wextra -ansi -g -c -o parse.o parse.cc
g++ -w -Wall -Wextra -ansi -g -c -o main.o main.cc
g++ -w -Wall -Wextra -ansi -g -fkeep-inline-functions -o LFIO lex.o parse.o function.o main.o -lfl -lm -ll
parse.o: In function `yyparse()':
/root/LFIO-combine/parse.cc:1199: undefined reference to `yylex'
main.o: In function `main':
/root/LFIO-combine/main.cc:21: undefined reference to `yyin'
/root/LFIO-combine/main.cc:21: undefined reference to `yyin'
collect2: error: ld returned 1 exit status
make: *** [LFIO] Error 1
Hier mein Make-Datei ist:
CXXFLAGS = -w -Wall -Wextra -ansi -g
OBJECTS = lex.o parse.o function.o main.o
LFIO : $(OBJECTS)
g++ $(CXXFLAGS) -fkeep-inline-functions -o LFIO $(OBJECTS) -lfl -lm -ll
clean :
rm -f *.o
lex.cc : lex.ll
flex --header-file=lex.h --outfile=lex.cc lex.ll
parse.hh : parse.cc
parse.cc : parse.yy function.h algorithm.h
bison -v --output-file=parse.cc --defines=parse.hh --warnings=all --feature=all parse.yy
%.o: %.cc %.h
g++ $(CXXFLAGS) -c -o [email protected] $< -lm -ll
main.o : main.cc lex.h parse.hh function.h algorithm.h
function.o : function.h function.cc
parse.o : parse.cc parse.hh function.h algorithm.h
lex.o :lex.h algorithm.h function.h
Hier ist meine lex.ll
%option c++
%option ecs
%option nodefault
%option stack
%option warn
%option yylineno
%{
#include "function.h"
#include "parse.hh"
#include <limits.h>
#include <iostream>
#include <sstream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int yyFlexLexer::yywrap() { return 1; }
%}
ATOM [A-Z][a-zA-Z0-9_']*
VARIABLE [a-z][a-zA-Z0-9_']*
%%
[ \t\n] ;
{VARIABLE} { return (TOK_VARIABLE);}
{ATOM} { return (TOK_ATOM);}
":-" {}
"," {}
"." {}
<<EOF>> {yyterminate();}
%%
parse.yy ist wie folgt:
%defines
%define api.token.prefix {TOK_}
%{
#include "function.h"
#include "lex.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#ifdef MS_WINDOWS
#include <malloc.h>
#define alloca_alloca
#endif
void yyerror(const char *s)
{
fprintf (stderr, "%s\n", s);
}
extern "C" int yylex(void);
%}
%union{
......
}
%type ......
%%
......
Und dann ist main.cc wie folgt:
#include "function.h"
#include "algorithm.h"
#include "parse.hh"
#include "lex.h"
extern "C" int yylex(void);
extern FILE *yyin;
extern FILE *yyout;
extern int fopen();
extern int yyparse(void *);
int main(int argc, char **argv){
if(argc > 1){
if(!(yyin = fopen(argv[1], "r"))) {
perror(argv[1]);
return (1);
}
}
//yylex();
yyparse();
......
return 0;
}
Weiß jemand, was diese Fehler verursacht und wie man sie löst? Ich wäre dankbar, wenn sich jemand Zeit nehmen könnte, diese Fehler zu überprüfen.
Bitte zeigen Sie die * full * Ausgabe von 'make', so dass wir sehen können, ob es versucht, mit' lex.o' zu verbinden. –
Ich habe die Ausgabe von 'make' aktualisiert. –
Nur eine Ahnung ... Sie kompilieren den Lexer als C++, haben aber immer noch "extern" C "int yylex (void);". Versuchen Sie, den "externen" C-Teil zu entfernen. –