因此,我正在编写一个非常简单的Flex和Bison程序来求解数学表达式,但是由于某种原因,输出始终为0。
我一直在关注O'Reilly的《 Flex and Bison》这本书,我的代码与书中的代码几乎相同,但仍然行不通。
到现在已经有一段时间了,我们将不胜感激。

这是.l文件:

     %{
    #include "simple.tab.h"
/*  enum yytokentype {
        NUMBER = 258,
        ADD,
        SUB,
        MUL,
        DIV,
        ABS,
        EOL
    };
    int yylval; */
%}
%%
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"|" { return ABS; }
[0-9]+  { yylval = atoi(yytext); return NUMBER; }
\n  { return EOL; }
[ \t]   { /* ignore whitespace */ }
.   { printf("Mystery character %c\n", *yytext); }
%%


和.y文件:

%{
    #include<cstdio>
    int yylex();
    int yyerror(const char *s);
%}

/* token declaration */
%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; }
 ;

%%
int main(int argc, char **argv)
{
    yyparse();
}
int yyerror(const char *s)
{
    fprintf(stderr,"error: %s\n",s);
}


输出:

  $ bison -d simple.y
    $ flex stuff.l
    $ g++ simple.tab.c lex.yy.c -lfl -o simple
    $ ./simple
    1+2
    = 0
    1*2
    = 0
    1/1
    = 0
    4/2
    = 0
    25/5
    = 0
    |1
    = 0


另外,如果有人可以推荐一本更好和更简单的书,我们将不胜感激。

最佳答案

在此语句中,$1calclist的值:

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


您想要的是exp的值:

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

关于c++ - 简单的数学解析器Flex&Bison,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33952963/

10-12 23:59