为什么程序没有运行flex和bison编译的C程序的主要功能

时间:2015-07-04 16:18:19

标签: c bison flex-lexer

我使用 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

1 个答案:

答案 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