问题是,本书使用int作为YYSTYPE,这会产生明显的问题,比如将1除以2.所以我决定修改程序以使用float.到现在为止还挺好.该程序(源代码如下)编译得很好,但无论计算结果如何,总是给出0的答案.我也不知道如何调试它,因为它显然是生成代码.
calc.l
%{ #include "parser.h" %} %% "+" { return ADD; } "-" { return SUB; } "*" { return Mul; } "/" { return div; } [0-9]+ { yylval = atof(yytext); return NUMBER; } \n { return Eol; } [ \t] { ; } . { yyerror("UnkNown symbol"); } %%
calc.y
%{ #include <stdio.h> #define YYSTYPE float %} %token NUMBER %token ADD SUB Mul div %token Eol %% /* List of Expressions */ calcList: | calcList AS_result Eol { printf("%f\n-> ",); } ; /* Add/subtract result. Evaluated after multiply/divIDe result */ AS_result: MD_result | AS_result ADD MD_result { $$= + ; } | AS_result SUB MD_result { $$= - ; } ; /* Multiply/divIDe result. Evaluated first. */ MD_result: NUMBER | MD_result Mul NUMBER { $$= * ; } | MD_result div NUMBER { $$= / ; } ; %% int yyerror(char *msg) { printf("Error: '%s'\n",msg); return 0; } int main(int argc,char **argv) { printf("-> "); yyparse(); return 0; }
Makefile文件
make: calc.l calc.y bison -Wall -o parser.c --defines=parser.h calc.y flex -o scanner.c calc.l cc -ggdb -o calc scanner.c parser.c -lfl clean: rm -f parser.c parser.h scanner.c calc.c calc
示例运行
michael@michael-desktop:~/code/calculator$./calc -> 1 + 20.000000-> ^Cmichael@michael-desktop:~/code/calculator$
感谢代码的任何部分的反馈以及实际问题.干杯!
解决方法 你是对的,它只适用于分裂 – 奇怪……我没有注意到,对我感到羞耻.这是另一件要尝试的事情:
calc.y:
%{#include <stdio.h>%}%union { double d; }%token <d> NUMBER%token ADD SUB Mul div%token Eol%type <d> MD_result AS_result%%
calc.l:更改行“yylval = atof(yytext);”有:
yylval.d = atof(yytext);
现在它说:
-> 1+23.000000-> 2*36.000000-> 4-5-1.000000-> 6/41.500000
正如所料.
总结以上是内存溢出为你收集整理的Bison中缀计算器总是评估为0全部内容,希望文章能够帮你解决Bison中缀计算器总是评估为0所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)