2011-07-04 2 views
2

저는 바이슨의 다기능 계산기에서 일하고 있습니다. 다음 표현식이 프로그램에 전달되면 잘못된 답이 생성된다는 것을 알게되었습니다.들소와 굴곡 계산기에 문제가 있습니다

(1+2) * (2+1) 

위 표현식은 9를 생성해야합니다. 그러나 다음 설정에서 6을 생성합니다.

이 들소 코드 :

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} {} 
. {} 
%% 

감사

%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; } 
    ; 
%% 

이것은 플렉스 코드, 알리

불행하게도
+0

문제가 해결되었습니다. "("및 ")"을 플렉스 코드에 넣지 않았습니다 . – Ali

답변

1

, 나는 들소/플렉스에 대한 구문을 기억할 수는 없지만 내 직감은 우선 순위가 C 코드로 올바르게 변환되지 않는다고 말합니다.

그렇다면 $ 2는 "이 표현식의 출력을 위해 C 우선 순위 규칙에 대한 지식없이 확장의이 시점에서 두 번째 하위 표현식에 대해 생성 된 코드를 대체합니다"를 의미합니까?

그렇다면 코드에서 "printf (... 1 + 2 * 2 + 1)"과 같은 코드를 생성합니다. 소스 생산물을보고 확인할 수 있습니까? 그렇다면, 당신은 아마도 '('표현의 확장에 $ 2 라운드 일부 괄호를 추가해야하거나 인수 $ (1)와 '*'표현의 $ 3 내지 라운드

+0

첫 번째 질문에 대해 예 2는 두 번째 하위 식을 의미합니다. 두 번째 질문에 대해서는 우리가 제거하려고합니다.()를 호출하고 데이터를 재귀 적으로 처리하지만 작동해야하지만 그렇지 않습니다. – Ali