markusholtermann
DevelopmentMarkus Holtermann

Binärtaschenrechner mit Flex und Bison

Einen Taschenrechner für Binärzahlen kann man mit Flex und Bison recht schnell erstellen. Zunächst erstellen wir eine Datei calc_binary.l. Diese ist der sogenannte Lexer:

%{
#include "calc_binary.y.h"
%}
%%
\+ { return PLUS;}
-  { return MINUS;}
\* { return MAL;}
0  { return NU;}
1  { return EINS;}
\( { return AUF; }
\) { return ZU; }
\n { return AUS; }
[ ]+ ;
.  { printf("what?");}

Diese Datei übersetzen wir dann mit:

$ flex -o calc_binary.c calc_binary.l

Nun folgt der Parser, ein Bison-File, mit dem Namen calc_binary.y:

%{
#include <stdio.h>
#include <math.h>
void yyerror(char *message);
%}

%start S

%token AUS
%token PLUS MINUS
%token MAL
%token NU EINS
%token AUF ZU

%left PLUS MINUS
%left MAL

%%
S : E AUS {printf("= %d\n ", $1); }
  | S E AUS {printf("=%d\n ", $2);};

E : B {$$ = $1;}
  | E PLUS E {$$ = $1 + $3;}
  | E MINUS E {$$ = $1 - $3;}
  | E MAL E {$$ = $1 * $3;}
  | AUF E ZU {$$ = $2;}
  | MINUS E {$$ = - $2;};

B : NU {$$ = 0;}
  | EINS {$$ = 1;}
  | B NU {$$ = $1 * 2;}
  | B EINS {$$ = $1 * 2 + 1;};

%%

int main(int argc, char **argv) {
        yyparse();
        return 0;
}

void yyerror(char *message) {
        printf("Good bye\n");
}

Auch diesen müssen wir übersetzen:

$ bison -d -b y -o calc_binary.y.c calc_binary.y

Nun können wir mit GCC eine ausführbare Datei erstellen können:

$ gcc calc_binary.c calc_binary.y.c -lfl -lm -o calc_binary

Wenn wir diese mit:

$ ./calc_binary

aufrufen, können wir Binärzahlen addieren, subtrahieren und multiplizieren.