我使用 flex和c 编写了野牛解析器。解析器编译时没有错误,但是当我运行可执行文件时,不执行main函数(它不会在主声明之后打印出实际上是打印指令的第一行)
main( int argc, char *argv[] )
{
printf("*** C2P version 1.0 @2015***\n");
extern FILE *yyin;
++argv; --argc;
printf("Open C file %s...",argv[0]);
yyin = fopen( argv[0], "r" );
if (yyin==NULL) {
printf("ERROR file not found %s", argv[0]);
exit(1);
}
yydebug = 1; //enable debug
yyparse();
exit(0);
}
我已使用以下命令进行编译:
bison -d c_def.y
flex c_def.l
gcc c_def.tab.h lex.yy.c -o c2p -lfl
答案 0 :(得分:3)
这是错误的:
gcc c_def.tab.h lex.yy.c -o c2p -lfl
野牛解析器位于文件c_def.tab.c
中。 c_def.tab.h
只是包含令牌定义的头文件。
因此,如果不包含flex库(main()
),c2p
中就不会有-lfl
。该库包含一个main
函数,该函数调用词法分析器,直到它返回文件结束指示符。 (它不会调用解析器,这就是为什么你的解析器没有被调用。)
您可能不应该使用-lfl
。除了你不需要的main()
函数之外,它所包含的唯一的另一个东西是yywrap
的伪实现,它总是返回1;而不是依赖于它,只需包括选项
%option noyywrap
在你的弹性定义中,然后你的词法分析器将完全不依赖于yywrap
。