Strona 1 z 1

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

: 11 paź 2010, 17:51
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! ;)

: 11 paź 2010, 18:44
autor: k.
nie znam się ale ja zaczynam od sprawdzania czy dane na wejściu są zgodne z tym co je obrabia/sumuje itp.

: 12 paź 2010, 17:55
autor: DJ Gruby
Kisiel, nie pomagasz. ;)

Anyone?

: 12 paź 2010, 18:00
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ął.

: 12 paź 2010, 20:25
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++.

: 12 paź 2010, 20:28
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:)

: 13 paź 2010, 08:20
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/