首页 > 解决方案 > 野牛文件中的 main() 函数未运行

问题描述

所以我正在尝试使用 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

但这导致了很多“'said function'的多个定义”的错误,所以我删除了它,现在它编译没有错误。

无论如何,在执行这 3 个命令时,我没有得到任何输出。甚至没有printf。

在我的 step3.fl 文件中,我包含以下选项:

%option noyywrap

为什么我的函数 main() 没有运行?我怎样才能让它运行?

标签: compiler-constructionbisonflex-lexer

解决方案


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

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


推荐阅读