Bison 野牛:float=int/int
我正在学习Bison/Flex,我不明白如何将$$类型强制为.y文件中的float。 scanner.l文件 parser.y文件 在expr规则中,printf输出是正确的。例如,如果输入为7/3,则打印输出为2.333。但在程序规则中,printf输出是2.000000。expr规则中的$$或程序规则中的$1似乎是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 {
%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}