flex/bison - co zrobić, żeby to ze sobą grało?

Szukasz drobnej pomocy przy kodowaniu, albo chcesz przedstawić światu swoją gotową lub w trakcie realizacji produkcję? To właściwy dział.
Wiadomość
Autor
DJ Gruby

flex/bison - co zrobić, żeby to ze sobą grało?

#1 Post autor: DJ Gruby »

Temat nie związany bezpośrednio z programowaniem na C64, ale być może znajdzie się tutaj ktoś, kto będzie potrafił mi pomóc?

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

%%
parser.yy

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

%%
test.c

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;
}
Kompilacja tego minimalnego projektu przebiega następująco:

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
Jeżeli ktoś byłby w stanie wskazać mi, co robię źle, albo gdzie jest błąd, to wypiję dzisiaj wieczorem jego zdrowie! ;)

k.

#2 Post autor: k. »

nie znam się ale ja zaczynam od sprawdzania czy dane na wejściu są zgodne z tym co je obrabia/sumuje itp.

DJ Gruby

#3 Post autor: DJ Gruby »

Kisiel, nie pomagasz. ;)

Anyone?

Awatar użytkownika
Stg
Posty: 84
Rejestracja: 13 gru 2008, 22:09
Grupa: Albion Crew

#4 Post autor: Stg »

Może też nie pomogę ale jakiś czas temu na forum.gamedev.pl był temat parserów i bison gdzieś tam też przemknął.
Stg/Albion Crew

Awatar użytkownika
kmeg
Posty: 470
Rejestracja: 08 wrz 2009, 15:33
Grupa: Albion Crew

#5 Post autor: kmeg »

Tez nie pomogę ale może lepiej się zaprzyjaźnić z BOOST.Spirit oraz BOOST.Tokenizer szczególnie jak chcesz to wywoływać z C/C++.

zielok
Posty: 438
Rejestracja: 07 lis 2008, 21:23
Kontakt:

#6 Post autor: zielok »

Stg pisze:Może też nie pomogę ale jakiś czas temu na forum.gamedev.pl był temat parserów i bison gdzieś tam też przemknął.
Ja też nie pomogę ale chciałem napisać, że widze, że trochę ludzi stad siedzi także na forum.gamedev.pl :) Fajnie, myślałem kiedyś, że jestem tam sam co pamięta czasy c64:)

zyga
Posty: 186
Rejestracja: 05 gru 2008, 08:58
Grupa: Alliance

#7 Post autor: zyga »

Ja dla odmiany też nie pomogę :) Lex i Yacc, to czasy studenckie - dawno i nieprawda.

A'propos parserów. Na atarionline.pl przy okazji nowego języka Atalan wypłynął temat parserów i chłopaki polecają Gold Parser.
http://www.devincook.com/goldparser/

ODPOWIEDZ