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.


Anmelden zum Antworten