Otóż próbuję napisać sobie parser w oparciu o narzędzia flex/bison... Niestety, za nic nie chcą mi one ze sobą współpracować... Postanowiłem zatem poszukać pomocy wśród mądrzejszych programistów... Poniżej przedstawiam całość mojego projektu skompresowaną do minimalnej postaci w stylu "Hello World". :)
lexer.lex
Kod: Zaznacz cały
%{
#include <string>
#include "parser.hh"
extern YYSTYPE yylval;
%}
%option bison-bridge
%%
<*>[^\n]+ { yylval->str = strdup(yytext); return TOKEN_LINE; }
%%
Kod: Zaznacz cały
%{
#include <stdio.h>
int yylex (void);
void yyerror (char const *s) { fprintf (stderr, "%s\n", s); }
%}
%union { char *str; }
%token <str> TOKEN_LINE
%%
content: TOKEN_LINE { printf("[LINE] %s\n", $1); };
%%
Kod: Zaznacz cały
#include <stdio.h>
#include "parser.hh"
extern int yyparse (void);
int main()
{
printf("*** TEST START ***\n");
int theResult = yyparse();
printf("**** TEST END ****\n");
return 0;
}
Kod: Zaznacz cały
bash-2.05$ bison --report=all -o parser.cc -d parser.yy
bash-2.05$ ls
lexer.lex parser.cc parser.hh parser.output parser.yy test.c
bash-2.05$ flex -olexer.cc lexer.lex
bash-2.05$ ls
lexer.cc lexer.lex parser.cc parser.hh parser.output parser.yy test.c
bash-2.05$ g++ -o parser.o -c parser.cc
bash-2.05$ ls
lexer.cc lexer.lex parser.cc parser.hh parser.o parser.output parser.yy test.c
bash-2.05$ g++ -o lexer.o -c lexer.cc
bash-2.05$ ls
lexer.cc lexer.lex lexer.o parser.cc parser.hh parser.o parser.output parser.yy test.c
bash-2.05$ g++ -o test lexer.o parser.o -ly -lfl test.c
parser.o(.text+0x304): In function `yyparse()':
: undefined reference to `yylex()'
collect2: ld returned 1 exit status