我正在学习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类型。对 ?以及为什么?
答案 0 :(得分:1)
因为int
是所有语义值的默认类型,除非您指定其他内容。有关详细信息,请参见bison manual。
如该链接所示,它可能像添加一样简单
%define api.value.type {double}
请勿使用float
。 C中的“正常”浮点表示形式为double
。 float
太不精确了,无法用于大多数目的;它只能用于不精确度可以容忍的非常特殊的应用。