Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: [Flex/Bison]: Błąd pliku wynikowego  (Przeczytany 5289 razy)

megotpelka

  • Gość
[Flex/Bison]: Błąd pliku wynikowego
« dnia: 2011-01-05, 23:53:21 »
Witam.
Mam problem kompilacją projektu flex/bison.
Błąd:
Cytuj
In file included from parser.y:4:
naglowek.h:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘YYNEAR’
parser.tab.c:115: error: expected identifier before numeric constant
nagłowek.h
#ifdef YYSTYPE
union tagYYSTYPE{
int i;
float d;
};
#define YYSTYPE union tagYYSTYPE
#endif

extern YYSTYPE YYNEAR yylval;

#define NEG 257
#define REAL_NUMBER 258
#define F_SIN 259
#define F_COS 260
#define F_TG 261
#define F_CTG 262
#define INT_NUMBER 263
#define L_MEM 264
#define I_MEM 265
#define EXIT 266
parser.y
%{

#include
#include "naglowek.h"
#if defined( PG )
#include "lexer.h"
#endif

double lmem[1 + 'Z' - 'A'] = {0};
double imem[10] = {0};
double SafeDiv(double d1, double d2);

%}

%union
{
int i;
double d;
}

%right '='
%left '+' '-'
%left '*' '/'
%right NEG

%token REAL_NUMBER F_SIN F_COS F_TG F_CTG
%token INT_NUMBER L_MEM I_MEM EXIT

%type EXPR

%%

LINES:
| LINES LINE
;

LINE: '\\n'
| EXPR '\\n' {printf("Wynik=%g\\n>", $1);}
| L_MEM '=' EXPR {lmem[ $1 ] = $3;
printf("%c = %g>\\n>", 'A' + $1,$3);}
| I_MEM '=' EXPR {imem[ $1 ] = $3;
printf("M%d = %g>\\n>", $1+1,$3);}
| EXIT {printf("Pa :)");}
| error '\\n'
;

EXPR: REAL_NUMBER { $$ = $1; }
| INT_NUMBER { $$ = (double)$1; }
| L_MEM { $$ = lmem[$1]; }
| I_MEM { $$ = imem[$1]; }
| '(' EXPR ')' { $$ = $2; }
| EXPR '+' EXPR { $$ = $1 + $3; }
| EXPR '-' EXPR { $$ = $1 - $3; }
| EXPR '*' EXPR { $$ = $1 * $3; }
| EXPR '/' EXPR { $$ = SafeDiv($1,$3); }
| '-' EXPR %prec NEG {$$ = -$2;}
| F_SIN '(' EXPR ')' {$$ = sin($3);}
| F_COS '(' EXPR ')' {$$ = cos($3);}
| F_TG '(' EXPR ')' {$$ = SafeDiv(sin($3),cos($3));}
| F_CTG '(' EXPR ')' {$$ = SafeDiv(cos($3),sin($3));}
;

%%
int main()
{
int ret;
#if defined( PG )
yyin = stdin;
yyout = stdout;
yylexerr = stderr;
#endif

ret = yyparse();
#if defined( PG )

#endif
return ret;
}

double SafeDiv(double d1, double d2)
{
if(d2 != 0)
return (d1/d2);
else
printf("Dzielenie przez zero!\\n");
}
lexer.l
%{

#include
#include "naglowek.h"
%}

D [0-9]
L [a-zA-Z]
IN {D}+
RN1 {D}+"."{D}*
RN2 {D}*"."{D}*
E ([Ee][Xx][Ii][Tt])|([Qq][Uu][Ii][Tt])|([Bb][Yy][Ee])
%%

[ \\t];
({RN1}|{RN2}) {yylval.d = atof(yytext); return(REAL_NUMBER);}
{IN} {yylval.i = atoi(yytext); return(INT_NUMBER);}
[Ss][Ii][Nn] return(F_SIN);
[Cc][Oo][Ss] return(F_COS);
[Tt][Gg] return(F_TG);
[Cc][Tt][Gg] return(F_CTG);
{L} {yylval.i = toupper(yytext[0]) - 'A'; return(L_MEM);}
[Mm]([1-9]|10) {yylval.i = atoi(yytext+1) -1; return(I_MEM);}
{E} return EXIT;
(.|\\n) {return(yytext[0]);}  
%%
Makefile
YACC=bison
YFLAG=-d

%.tab.c %.tab.h: %.y
bison -d $<

parser.tab: parser.tab.o lexer.o -lm

parser.tab.o: parser.tab.c

lexer.o: lexer.c parser.tab.h

jk33

  • Gość
[Flex/Bison]: Błąd pliku wynikowego
« Odpowiedź #1 dnia: 2011-01-06, 00:49:01 »
Obstawiałbym literówkę:
W pierwszej linijce naglowek.h.
Czy na pewno miało być #ifdef, a nie #ifndef?

megotpelka

  • Gość
[Flex/Bison]: Błąd pliku wynikowego
« Odpowiedź #2 dnia: 2011-01-06, 08:32:25 »
Niestety to nie to.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
[Flex/Bison]: Błąd pliku wynikowego
« Odpowiedź #3 dnia: 2011-01-06, 11:36:07 »
Może zamiast pisać "naglowek.h" użyj automatycznie wygenerowanego "parser.tab.h". Z tego co widzę, pełni tą tamą funkcję, ale mniej z nim zachodu.

megotpelka

  • Gość
[Flex/Bison]: Błąd pliku wynikowego
« Odpowiedź #4 dnia: 2011-01-06, 12:12:53 »
Dokładnie o to chodziło!
Wielkie dzięki za pomoc :)