Skocz do zawartości

[C/C++] Flex/Bison - Co Zrobić, Żeby To Ze Sobą Grało?


djgruby

Rekomendowane odpowiedzi

Witam!

 

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

 

%{
#include <string>
#include "parser.hh"
extern YYSTYPE yylval;
%}

%option bison-bridge

%%

<*>[^\n]+ { yylval->str = strdup(yytext); return TOKEN_LINE; }

%%

parser.yy

 

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

%%

test.c

 

#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;
}

Kompilacja tego minimalnego projektu przebiega następująco:

 

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

Jeżeli ktoś byłby w stanie wskazać mi, co w powyższym przykładzie robię źle, albo gdzie jest błąd, to wypiję dzisiaj wieczorem jego zdrowie! ;] Dziękuję za pomoc!

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...