以下flex和bison程序中的错误是什么?
我一直在遵循奥莱利的《Flex和Bison》一书中的一个计算器示例,到目前为止,我已经完成了以下工作 我正在使用Flex和Bison for Windows,为了使用Flex进行编译,我使用了以下命令:以下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 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
。