2017-04-04 11 views
-1

Je travaille dans le livre O'Reilly Flex & Bison par John Levine et j'ai rencontré le problème suivant en essayant de compiler et exécuter l'exemple pour une simple calculatrice BNFFlex & Bison simple calculatrice BNF sortie constante de zéro

> ./fb1-5 
2 + 3 * 4 
= 0 
2 * 3 + 4 
= 0 
c 
Mystery Character c 
error: syntax error 

le programme semble reconnaître entrée non-numérique et la sortie en conséquence, cependant toutes les entrées de nombre entier avec une mult/div/ajouter/sub expression entraîne toujours dans la sortie constante de zéro.

J'ai cherché des questions similaires sur le débordement de pile ainsi que lu plusieurs fois le chapitre d'O'Reilly. Je suis également en train de minage à travers http://dinosaur.compilertools.net/bison/bison_5.html pour essayer de trouver mon erreur. Merci d'avoir négligé mon égarement face à un obstacle apparemment élémentaire. Je ne fais que commencer mon propre voyage à travers les compilateurs. Tout conseil est apprécié.

flex (fb1-5.L):

%{ 
#include "fb1-5.tab.h" /*forward declaration - not yet compiled*/ 
%} 

%% 
"+" {return ADD;} 
"-" {return SUB;} 
"*" {return MUL;} 
"/" {return DIV;} 
[0-9]+ { yylval = atoi(yytext); return NUMBER;} 
\n { return EOL;} 
[ \t] { } /*ignore whitespace*/ 
. { printf("Mystery Character %c\n", *yytext);} 
%% 

bison (fb1-5.y):

%{ 
#include <stdio.h> 
%} 

/*declare tokens*/ 
%token NUMBER 
%token ADD 
%token SUB 
%token MUL 
%token DIV 
%token ABS 
%token EOL 

/*BNF tree*/ 
%% 
calclist: /*nothing - matches at beginning of input*/ 
    | calclist exp EOL { printf("= %d\n", $1);} 
    ; 

exp: factor /*default $$ = $1*/ 
    | exp ADD factor { $$ = $1 + $3;} 
    | exp SUB factor { $$ = $1 - $3;} 
    ; 

factor: term /*default $$=$1*/ 
    | factor MUL term { $$ = $1 * $3;} 
    | factor DIV term { $$ = $1/$3;} 
    ; 

term: NUMBER /*default $$=$1*/ 
    | ABS term { $$ = $2 >= 0 ? $2 : - $2;} 
    ; 
%% 

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

yyerror(char *s) 
{ 
    fprintf(stderr, "error: %s\n", s); 
} 

Makefile:

fb1-5: fb1-5.l fb1-5.y 
    bison -d fb1-5.y 
    flex fb1-5.l 
    gcc -o [email protected] fb1-5.tab.c lex.yy.c -lfl 

clean: 
    rm -f core fb1-5.tab.h fb1-5.tab.c lex.yy.c fb1-5 

Répondre

0
printf("= %d\n", $1); 

devrait être

printf("= %d\n", $2); 

Depuis exp est la deuxième chose sur le côté droit de cette production.