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

Calculator returns 0 value, can‘t input double numbers

本文关键字:输入 不能 返回 计算器      更新时间:2023-10-16

我将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 %dn",temp);
}
return 0;
}

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

在语法的第一部分添加一个#define YYSTYPE double(在%{%}之间(,它将是一个双精度。