野牛:浮点数=整数/整数

时间:2019-03-18 22:08:06

标签: bison

我正在学习Bison / Flex,但我不明白如何强制$$类型为.y文件中的浮点数。

scanner.l 文件

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


parser.y 文件

%{
#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 个答案:

答案 0 :(得分:1)

因为int是所有语义值的默认类型,除非您指定其他内容。有关详细信息,请参见bison manual

如该链接所示,它可能像添加一样简单

%define api.value.type {double}

请勿使用float。 C中的“正常”浮点表示形式为doublefloat太不精确了,无法用于大多数目的;它只能用于不精确度可以容忍的非常特殊的应用。