为什么程序不是运行一个flex和bison编译的C程序的main函数

Why is the program not running the main function of a flex and bison compiled C program

我使用 flex 和 c 编写了 bison 解析器。解析器编译没有错误,但是当我 运行 可执行文件时, main 函数没有执行(它没有打印出 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

这是错误的:

gcc c_def.tab.h lex.yy.c -o c2p -lfl

bison 解析器在文件 c_def.tab.c 中。 c_def.tab.h 只是包含令牌定义的头文件。

因此,如果不是您包含 flex 库 (-lfl),c2p 中根本不会有 main()。该库包含一个 main 函数,该函数调用词法分析器直到它 returns 一个文件结束指示器。 (它不调用解析器,这就是你的解析器没有被调用的原因。)

您可能不应该使用 -lfl。除了您不需要的 main() 函数之外,它唯一包含的其他内容是 yywrap 的伪实现,它始终是 returns 1;不要依赖它,只需包含选项

%option noyywrap

在您的 flex 定义中,然后您的词法分析器将完全不依赖于 yywrap