【发布时间】:2026-02-22 17:45:01
【问题描述】:
我将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;
}
【问题讨论】:
-
我在看什么...
-
最好重新检查您发布的代码。看起来它在运输过程中被咀嚼了一些。
-
如果您使用解析器生成器,您应该说是哪种,请不要让人猜测。并用解析器生成器的名称对其进行标记。
-
代码生成器。这比我的第一个猜测更有意义:克苏鲁。
-
所以我假设那是 yacc 或 bison。 yylval 未在此代码中定义,因此我假设您在某处有 lex 或 flex 文件。它可能将 yylval 定义为 int。另外,缺少对令牌 num 的解析,这可能就是错误所在。你能发布扫描仪代码吗?
标签: c++ calculator bison dev-c++ bisonc++