浮点数在野牛语法中被截断

Floating point getting truncated in bison grammar

我终于开始学习 lex 和 bison 的基础知识了。我遇到的问题是,我正在计算我要给我的同事多少钱来买一个墨西哥卷饼,但我不喜欢手动计算。

例如,7.75 美元的墨西哥卷饼 + 20% 的小费可以使用 7.75*(1 + 20/100.0) 计算得出。但是,我宁愿让计算机只接受 .75 + 20% 并为我做。

所以我做了这个:https://github.com/tlehman/tipcalc

词法规则是

%%
$                 return TOKDOLLAR;
\%                 return TOKPERCENT;
[0-9]+(\.[0-9]+)*  yylval=atof(yytext); return NUMBER;
[ \t]+             /* eat whitespace */
[\+\-]             return TOKOP;
%%

解析规则为

%%
start:
    dollars TOKOP percentage
    {
        double dollars = ;
        double percentage = ()/(100.0);
        double total = dollars + dollars*percentage;
        printf("debug: dollars = %f\n", dollars);
        printf("debug: percent = %f\n", percentage);

        printf("%.2f", total);
    }

dollars:
    TOKDOLLAR NUMBER
    {
        $$ = (double);
    }

percentage:
    NUMBER TOKPERCENT
    {
        $$ = (double);
    }

%%

唯一的问题是美元处理不当,当我 运行

$ echo '.75 + 20%' | ./tipcalc 

我得到这个输出:

debug: dollars = 7.000000 
debug: percent = 0.200000 
8.40

dollars 值在某处四舍五入。我认为四舍五入是在词法分析之后发生的,因为 percentage 似乎适用于我赋予它的所有值。我不知道它发生在哪里,有什么想法吗?

默认情况下,由 Bison 生成的解析器传递的值(yylval 和美元)是整数。因此,除非您明确告诉 Bison 它们是双精度数,否则它们将是整数。这包括 yylval,所以截断已经发生在这里:yylval=atof(yytext);