Bison中缀计算器总是评估为0

Bison中缀计算器总是评估为0,第1张

概述我正在读一本我在互联网上发现的关于GNU Flex / Bison的书.这很酷.其中一个例子涉及编写中缀计算器.这很好. 问题是,本书使用int作为YYSTYPE,这会产生明显的问题,比如将1除以2.所以我决定修改程序以使用float.到现在为止还挺好.该程序(源代码如下)编译得很好,但无论计算结果如何,总是给出0的答案.我也不知道如何调试它,因为它显然是生成代码. calc.l %{ #inc 我正在读一本我在互联网上发现的关于GNU Flex / Bison的书.这很酷.其中一个例子涉及编写中缀计算器.这很好.

问题是,本书使用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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1214875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存