2011-07-04 111 views
2

我正在從野牛的多功能計算器。我發現如果下面的表達式被傳入程序,會產生錯誤的答案。問題與野牛和flex計算器

(1+2) * (2+1) 

上述表達式應該產生9.但是它會在下面的設置中產生6。

這是野牛代碼:

%token NUMBER 

%% 


statement_list: statement '\n' 
     |  statement_list statement '\n' 
     ; 
statement: expression { printf("= %d\n", $1); }; 

expression: expression '+' term { $$ = $1 + $3; } 
    |  expression '-' term { $$ = $1 - $3; } 
    |  term     { $$ = $1; } 
    ; 

term:  term '*' factor  { $$ = $1 * $3; } 
    |  term '/' factor   
        { if ($3 == 0) 
         yyerror("Division by zero"); 
        else $$ = $1/$3; } 
    |  factor    { $$ = $1; } 
    ; 

factor:  '(' expression ')' { $$ = $2; } 
    |  '-' factor   { $$ = -$2; } 
    |  NUMBER    { $$ = $1; } 
    ; 
%% 

這是Flex代碼

D  [0-9] 
WS [ \t\v\f] 
%% 

{D}+ { yylval = atof(yytext); return NUMBER; } 

"+" { return yytext[0]; } 
"-" { return yytext[0]; } 
"*" { return yytext[0]; } 
"/" { return yytext[0]; } 

"(" { return yytext[0]; } 
")" { return yytext[0]; } 

"\n" { return yytext[0]; } 

{WS} {} 
. {} 
%% 

感謝, 阿里

+0

問題解決了,我錯過了將「(」和「)」放在flex代碼中 – Ali

回答

1

不幸的是,我不記得野牛/柔性的語法,但我直覺告訴我,優先級沒有正確轉換爲C代碼。

如果是這樣,那麼$ 2是否意味着「對於這個表達式的輸出,在擴展中的這個點替代爲第二個子表達式生成的代碼中,而沒有任何C優先規則的知識」?

如果是這樣,你的代碼產生類似「printf(... 1 + 2 * 2 + 1)」的東西。你能查看源代碼並確認嗎?如果是這樣,你應該大概是添加一些括號輪$ 2中的「(」表達的擴大,或圓的參數$ 1和$ 3中的「*」體現在哪裏?

+0

對於第一個問題,是的,$ 2表示第二個子表達式對於第二個問題,我們試圖擺脫()並遞歸處理數據,它應該可以工作,但不會。 – Ali