Flex / Bison - Problem bei den Operatoren * und /
-
Hallo liebe Forengemeinde,
das Problem liegt bei den Operatoren * und /. Wenn diese aufgerufen werden ist $3 immer 0. Bei den anderen Operatoren funktioniert es hingegen einwandfrei. Das Ergebnis wird richtig berechnet. Weiß jemand von euch wo das Problem liegt?
scanner.l
%{ #include "parser.tab.h" %} DIGIT [0-9] %% username printf("%s", getlogin()); "\n" return END; {DIGIT}+ { yylval = atoi(yytext); return NUMBER; } "+" return ADD; "-" return SUBTRACT; "*" return MULTIPLY; "/" return DIVIDE; "(" return LEFT_BRACKET; ")" return RIGHT_BRACKET; . printf("Unrecognized character: %s\n", yytext); %%parser.y
%{ #include <stdio.h> #define YYSTYPE double int yylex(void); void yyerror(char const *); %} /* Bison declarations */ %token NUMBER %token END %token LEFT_BRACKET %token RIGHT_BRACKET %left ADD SUBTRACT %left MULTIPLY DIVIDE %% /* The grammar follows */ input: /* empty */ | input line ; line: END | exp END { printf("Ergebnis: %d\n", $1); } ; exp: NUMBER { $$ = $1; } | exp ADD exp { $$ = $1 + $3; } | exp SUBTRACT exp { $$ = $1 - $3; } | exp MULTIPLY exp { $$ = $1 * $3; } | exp DIVIDE exp { $$ = $1 / $3; } | LEFT_BRACKET exp RIGHT_BRACKET { $$ = $2; } ; %%Viele Grüße
-
wenn YYSTYPE double ist, sollte es dann bei printf nicht %f heißen? ka, ob das dein Problem erklärt, dann sollte ja die Addition auch nicht funktionieren.
-
Hallo Bashar,
%.2f um genau zu sein.

Aber das ist nicht das Problem. Weil %d die Ziffern nach einem Komma entfernt werden.
-
Hallo Bashar,
es lag daran, dass der Wert von double ... 0 wird wenn das Ergebnis keine Fließkommazahl ergeben hat.
Danke!Viele Grüße
-
Dewey schrieb:
Aber das ist nicht das Problem. Weil %d die Ziffern nach einem Komma entfernt werden.
Nein. %d geht ganz knallhart davon aus, dass ein int übergeben wurde. Es findet keine Typumwandlung statt, auf welcher Basis auch? Das %d sieht nur der Benutzer und -- zur Laufzeit -- die Funktion printf. Compiler geben manchmal Warnungen aus, wenn sie erkennen, dass der Typ nicht stimmt, aber ungefragt konvertieren tut keiner.