Bison 野牛:float=int/int

Bison 野牛:float=int/int,bison,Bison,我正在学习Bison/Flex,我不明白如何将$$类型强制为.y文件中的float。 scanner.l文件 parser.y文件 在expr规则中,printf输出是正确的。例如,如果输入为7/3,则打印输出为2.333。但在程序规则中,printf输出是2.000000。expr规则中的$$或程序规则中的$1似乎是int类型。正当为什么?因为int是所有语义值的默认类型,除非您指定其他类型。有关详细信息,请参阅 如该链接所示,它可以简单地添加 %define api.value.type {

我正在学习Bison/Flex,我不明白如何将$$类型强制为.y文件中的float。 scanner.l文件

parser.y文件

在expr规则中,printf输出是正确的。例如,如果输入为7/3,则打印输出为2.333。但在程序规则中,printf输出是2.000000。expr规则中的$$或程序规则中的$1似乎是int类型。正当为什么?

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

如该链接所示,它可以简单地添加

%define api.value.type {double}

不要使用浮动。C中的普通浮点表示是双精度的。float太不精确,在大多数情况下都没有用处;它只能用于不精确性可以容忍的非常特殊的应用。

谢谢您的回答。所有语义值是否都应该具有相同的类型?@stef1611:这取决于您。阅读《野牛手册》中的相关章节并学习示例。但请记住,非终端非常类似于变量:不同的非终端可以有不同的类型,但非终端只有一种类型。就像一个变量。
%{
#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(); }
%define api.value.type {double}