【问题标题】:Wrong answer in flex-bison calculator programflex-bison 计算器程序中的错误答案
【发布时间】:2015-06-26 12:42:54
【问题描述】:

我正在使用 flex 和 bison 编写一个简单的计算器解析器程序。 flex 代码如下:

calc.l
%{
#include "fb1-5.tab.h"
%}
%%
"+"      { return ADD; }
"-"      { return SUB; }
"*"      { return MUL; }
"/"      { return DIV; }
"|"      { return ABS; }
[0-9]+   { yylval = atoi(yytext); return NUMBER; }
\n       { return EOL; }
[ \t]    { /* do nothing */ }
.        { return *yytext; }
%%

野牛代码如下:

calc.y
%{
#include <stdio.h>
#include <stdlib.h>
%}

%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL

%%

calclist:
    | calclist exp EOL { printf("= %d\n", $1); }
    ;

exp: factor
    | exp ADD factor { $$ = $1 + $3; }
    | exp SUB factor { $$ = $1 - $3; }
    ;

factor: term
    | factor MUL term { $$ = $1 * $3; }
    | factor DIV term { $$ = $1 / $3; }
    ;

term: NUMBER
    | ABS term { $$ = $2 >= 0 ? $2 : -$2; }
;
%%

main(int argc, char **argv)
{
    yyparse();
}

yyerror(char* s)
{
    fprintf(stderr, "Error: %s\n", s);
}

对于每个输入,答案始终为 62。即使我在数字之间留出空格,答案也始终相同。即使答案应该完全不同。就像 1+2+3 和 100+200+300 一样,给出的答案总是 62。

【问题讨论】:

    标签: parsing bison flex-lexer


    【解决方案1】:

    在将calclist exp EOL 缩减为calclist 时,您要打印exp 的值。这是右侧的 第二个 符号 ($2),而不是第一个。

    第一个符号 (calclist) 从未被赋予过值,因此它是未定义的并且可以是任何值。 62 不是不可信的。一旦减少了calclist: %empty 规则,任何作为规则语义值产生的垃圾都会通过将$$ 初始化为$1 的默认预操作通过calclist: calclist exp EOL 规则。因此,如果它以 62 开头,它将一直是 62。

    【讨论】:

    • 非常感谢!!帮了大忙!!在一本书中,它的价格是 1 美元,而我只是在学习这个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多