Бизон: float = int / int - PullRequest
       7

Бизон: float = int / int

0 голосов
/ 19 марта 2019

Я изучаю Bison / Flex и не понимаю, как заставить тип $$ быть плавающим в файле .y.

scanner.l file

%{
#include "token.h"
%}
%%
[0-9]+ { return TOKEN_INT; }
"/" { return TOKEN_DIV; }
%%
int yywrap() { return 1; }


parser.y file

%{
#include <stdio.h>
void yyerror(char const *s) {} ;
extern char *yytext;
%}

%token TOKEN_INT
%token TOKEN_DIV

%%
program : expr
    {
        float div_result;
        div_result=$1; 
        printf("In pgm %f \n",div_result);
    } ;
expr : factor TOKEN_DIV factor
    { 
        printf("In expr %f \n",(float)$1/(float)$3); 
        $$ = (float)$1 / (float)$3;
    } ;
factor: TOKEN_INT { $$ = atoi(yytext); } ;
%%

int main() { yyparse(); }

В правиле expr вывод printf правильный.Например, если ввод 7/3, вывод на печать равен 2,333333.Но в правиле программы вывод printf равен 2.000000.
Кажется, что $$ в правиле expr или $ 1 в правиле программы имеет тип int.Правильно ?и почему?

1 Ответ

1 голос
/ 19 марта 2019

Поскольку int является типом по умолчанию для всех семантических значений, если вы не укажете что-то еще. Подробности см. В руководстве зубров .

Как указано в этой ссылке, это может быть так же просто, как добавление

%define api.value.type {double}

Не используйте float. «Нормальным» представлением с плавающей точкой в ​​C является double. float слишком неточен, чтобы быть полезным для большинства целей; он должен использоваться только для очень специфических применений, в которых неточность допустима.

...