以下flex和bison程序中的错误是什么?

以下flex和bison程序中的错误是什么?,bison,flex-lexer,Bison,Flex Lexer,我一直在遵循奥莱利的《Flex和Bison》一书中的一个计算器示例,到目前为止,我已经完成了以下工作 我正在使用Flex和Bison for Windows,为了使用Flex进行编译,我使用了以下命令: flex f4.l 为了获得所需的.exe文件,我将: gcc lex.yy.c -L "C:\Program\GnuWin32\lib" -lfl 在此之前,生成的.exe文件工作正常 现在这本书说我应该让bison编译.y文件,我的代码是: 文件:f5.y /* simplest

我一直在遵循奥莱利的《Flex和Bison》一书中的一个计算器示例,到目前为止,我已经完成了以下工作

我正在使用Flex和Bison for Windows,为了使用Flex进行编译,我使用了以下命令:

flex f4.l
为了获得所需的.exe文件,我将:

gcc lex.yy.c -L "C:\Program\GnuWin32\lib" -lfl
在此之前,生成的.exe文件工作正常

现在这本书说我应该让bison编译.y文件,我的代码是:

文件:f5.y

    /* simplest version of calculator */
%{
#include <stdio.h>
%}
/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL
%%
calclist: /* nothing */ 
 | 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);
}
我使用以下工具编译程序:

gcc f5.tab.c lex.yy.c -L "C:\Program\GnuWin32\lib" -lfl
问题在于运行编译程序时,例如,如果我将:

2 + 3 * 4
= 1968511970
20/2
= 1968511970
为什么我有这些答案?我猜,这似乎是在显示记忆位置,有什么帮助吗

| calclist exp EOL { printf("= %d\n", $1); } 
你印错东西了。应该是:

| calclist exp EOL { printf("= %d\n", $2); } 
你印错东西了。应该是:

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

谢谢你@BrianTompsett-汤莱恩, 我已经编辑了文件,再次使用了flex,但仍然收到相同的错误消息,错误消息说gcc找不到库
-lfl
。检查您指定的路径是否正确。(显然它在编译flex可执行文件时找到了库。因此,请验证编译器标志是否相同。)唯一需要的
-lfl
yywrap
,您可以通过在第一个
%%
之前向flex文件添加
%option noyyyrap
来避免该要求。谢谢@BrianTompsett>-汤莱恩, 我已经编辑了文件,再次使用了flex,但仍然收到相同的错误消息,错误消息说gcc找不到库
-lfl
。检查您指定的路径是否正确。(显然,它在编译flex可执行文件时找到了库。因此,请验证编译器标志是否相同。)唯一需要
-lfl
的是
yywrap
,您可以通过在第一个
%%
之前向flex文件添加
%option noyyywrap
来避免该要求。谢谢@EJP,但是为什么应该是2美元呢?我看不出这个论点在文章中指出了什么program@Little,
$1
对应于
calclist
$2
对应于
exp
。谢谢@EJP,但为什么它应该是$2?我看不出这个论点在文章中指出了什么program@Little,
$1
对应于
calclist
$2
对应于
exp