c++ - 计算器返回0值,不能输入双数

标签 c++ calculator bison dev-c++ bisonc++

我将temp格式化为double,但输入不带小数点的数字时返回0,输入带小数点的数字结果为“无效的表达”。

%{
#include<stdio.h>
#include<math.h>
int valid=0
double temp;
%}
%token num
%left '+''-'
%left '*''/'
%left '^'
%nonassoc UMINUS
%%
expr1: expr { temp=$1; }
expr : expr '+' expr { $$=$1+$3; }
| expr '-' expr { $$=$1-$3; }
| expr '*' expr { $$=$1*$3; }
| expr '/' expr { if($3==0) { valid=1; $$=0; } else { $$=$1/$3; } }
| '(' expr ')' { $$=$2; }
| '-' expr { $$=-1*$2; }
| num { $$=yylval;}
;
%%
#include<stdlib.h>
int yyerror(){
printf("\nInvalid expression!\n");
valid=2;
return 0;
}
int yyparse();
double main(double argc, char *argv[]){
extern FILE *yyin;
++argv;
--argc;
yyin=fopen(argv[0],"r");
yyparse();
if(valid==1){
printf("\nDivision by 0!\n");
}
if(valid==0){
printf("\nValid expression!\n");
printf("The value evaluated is %d\n",temp);
}
return 0;
}

最佳答案

由于您既未定义 YYSTYPE 也未定义 %union,因此您将获得默认的 YYSTYPE,即 int。因此,当您将所有浮点值用作语义值时,它们都将转换为整数。

#define YYSTYPE double 添加到语法的第一部分(在 %{...%} 之间),它将是双倍的。

关于c++ - 计算器返回0值,不能输入双数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32492396/

相关文章:

algorithm - 计算器(例如 Wolfram alpha)如何计算极大的阶乘?

java - 如何在java swing计算器中获得百分比结果

c++ - Flex & Bison C++

c++ - 在 std::vector.reserve() 之后在 std::vector 中重新分配

c++ - 如何确保 std::tuple 在以下代码中使用 c++11 move 语义

python - 创建我自己的错误消息?但是哪里?

c++ - 为什么我们在解析器文件中定义 union 时使用复杂类的指针?

c - Bison:$ 变量($1 $2 等)如何与非 token 一起使用?

java - 如何在没有 '*' 运算符的情况下执行乘法?

c# - 键盘 Hook 和更改用户输入