Калькулятор возвращает значение 0, не может вводить двойные числа

Я отформатировал 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;
}

0

Решение

Поскольку вы не определяете ни YYSTYPE ни %unionВы получаете по умолчанию YYSTYPE, который int, Таким образом, все ваши значения с плавающей запятой будут преобразованы в целые числа, когда вы будете использовать их в качестве семантических значений.

Добавить #define YYSTYPE double к первой части вашей грамматики (между %{%}), и вместо этого он будет двойным.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector