2017-06-25 12 views
0

私はフレックスとバイソンを学びますが、私のフレックス/バイソン電卓は間違った結果をプリントします。例電卓のバグ

$ ./fb1-5 
1 + 2 + 3 
= 32728 

問題で何ができるかのMakefile

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

レクサー

%{ 
# include "fb1-5.tab.h" 
%} 
%% 
"+" { return ADD; } 
"-" { return SUB; } 
"*" { return MUL; } 
"/" { return DIV; } 
"|" { return ABS; } 
[0-9]+ { yylval = atoi(yytext); return NUMBER; } 
\n  { return EOL; } 
[ \t] { /* ignore whitespace */ } 
.  { printf("Mystery character %c\n", *yytext); } 
%% 

パーサ

/* simplest version of calculator */ 
%{ 
#include <stdio.h> 
%} 
/* declare tokens */ 
%token NUMBER 
%token ADD SUB MUL DIV ABS 
%token EOL 
%% 
calclist: /* nothing */      
| calclist exp EOL { printf("= %d\n", $1); } 
; 
exp: factor  

| exp ADD factor { $$ = $1 + $3; } 
| exp SUB factor { $$ = $1 - $3; } 
; 
factor: term  

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

| ABS term { $$ = $2 >= 0? $2 : - $2; } 
; 
%% 
main(int argc, char **argv) 
{ 
    yyparse(); 
} 
yyerror(char *s) 
{ 
    fprintf(stderr, "error: %s\n", s); 
} 

+0

私はバイソンを使用して以来10年以上経ちましたが、おそらく 'yyval'タイプはデフォルトでは正しくありません –

答えて

2

calclistに関連付けられたアクションでは、再帰的プロダクションルールのcalclist部分を参照する$ 1の値を参照しています。しかし、実際にはどこにでもcalclistの非終端記号に値を割り当てることはありません。ここで$ 2を意味しましたか?

+0

クール。できます。ありがとう。 –