浮点数在野牛语法中被截断
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);
我终于开始学习 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);