Проблема с бизоном и гибким калькулятором - PullRequest
2 голосов
/ 04 июля 2011

Я работаю над многофункциональным калькулятором от бизона.Я обнаружил, что если следующее выражение будет передано в программу, будет получен неправильный ответ.

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

это гибкий код

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

Спасибо, Али

Ответы [ 2 ]

1 голос
/ 04 июля 2011

К сожалению, я не могу вспомнить синтаксис для bison / flex, но моя интуиция подсказывает мне, что приоритет не преобразуется правильно в код C.

Если это так, значит ли это, что $ 2 означает "для вывода этого выражения замените его в коде, сгенерированном для второго подвыражения на этом этапе раскрытия, без каких-либо знаний о правилах приоритета Си "?

Если так, ваш код создает что-то вродеprintf (... 1 + 2 * 2 + 1) ".Можете ли вы просмотреть источник производства и подтвердить?Если это так, то, вероятно, следует добавить несколько скобок вокруг $ 2 в расширении выражения '(' или округлить аргументы $ 1 и $ 3 в выражении '*'?

0 голосов
/ 04 июля 2011

Может быть полезна среда программирования Unix http://cm.bell -labs.com / cm / cs / upe /

...