因此,我试图使用flex,bison和C进行编译。在我的step3.y文件中,我具有以下主要功能:
step3.y
int main(int argc, char *argv[]) {
char filename[100];
strcpy(filename, argv[1]);
if (argc == 2) {
yyin = fopen(argv[1], "r");
printf("filename is %s\n", filename);
}
else {
printf("No files - Exit\n");
exit(1);
}
yyparse();
printf("\nMain symbol table");
Display();
printf("the input has been syntactically checked\n");
printf("starting print\n*\n*\n*\n*\n*\n");
ASTprint(0, prog);
return 0;
}
我正在cygwin中运行以下命令:
bison -d step3.y
flex step3.fl
gcc lex.yy.c -lfl -o step3
以前我尝试使用
gcc step3.tab.c lex.yy.c -lfl -o step3
但是,这导致了““所述功能的多个定义””的许多错误,因此我删除了该错误,现在可以正确编译。
无论如何,执行这3条命令时,我没有任何输出。甚至没有printf。
在我的step3.fl文件中,包含以下选项:
%option noyywrap
为什么我的函数main()没有运行?我如何使其运行?
答案 0 :(得分:0)
使用gcc lex.yy.c -lfl -o step3
进行编译时,主程序无法运行的原因很简单:根本不编译yacc生成的代码。因此,不仅main
不是最终可执行文件的一部分,而且解析器代码也不是。生成的可执行文件仅包含您的词法分析器。
那么,当尝试包含解析器代码时,为什么会出现关于多个定义的错误?显然是因为您的解析器和词法分析器使用相同的名称定义函数。就像任何其他C项目一样,不应在一个以上的编译单元中定义同一函数,因此您应该只定义一次函数,然后仅在其他编译单元中声明它们(这通常是头文件使用的功能)