野牛文件中的main()函数未运行

时间:2018-11-11 11:02:21

标签: compiler-construction bison flex-lexer

因此,我试图使用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()没有运行?我如何使其运行?

1 个答案:

答案 0 :(得分:0)

使用gcc lex.yy.c -lfl -o step3进行编译时,主程序无法运行的原因很简单:根本不编译yacc生成的代码。因此,不仅main不是最终可执行文件的一部分,而且解析器代码也不是。生成的可执行文件仅包含您的词法分析器。

那么,当尝试包含解析器代码时,为什么会出现关于多个定义的错误?显然是因为您的解析器和词法分析器使用相同的名称定义函数。就像任何其他C项目一样,不应在一个以上的编译单元中定义同一函数,因此您应该只定义一次函数,然后仅在其他编译单元中声明它们(这通常是头文件使用的功能)