compiler-construction - 野牛文件中的 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() 没有运行?我怎样才能让它运行?
解决方案
编译 using 时 main 没有运行的原因gcc lex.yy.c -lfl -o step3
很简单:根本没有编译 yacc 生成的代码。因此,您main
不仅不是最终可执行文件的一部分,而且您的解析器代码也不是。生成的可执行文件仅包含您的词法分析器。
那么,当您尝试包含解析器代码时,为什么会收到有关多个定义的错误呢?显然是因为您的解析器和词法分析器定义了具有相同名称的函数。就像任何其他 C 项目一样,不应在多个编译单元中定义相同的函数,因此您应该只定义一次函数,然后只在其他编译单元中声明它们(通常使用头文件) .
推荐阅读
- vba - API 调用的事件处理程序
- algorithm - 正数流中任意时间点的最小缺失数
- javascript - 如何以 1 - 1000000 作为参数运行 JavaScript 函数
- mysql - 如何使用 nodemon 在 Node.js 上自动创建 mysql 数据库?
- .net-core - EF Core 3.0 存储过程自定义视图模型
- java - 您可以在 Autoconfigured Spring Boot H2 测试数据库上设置兼容模式吗?
- java - Map Reduce 错误输出/Reducer 不工作
- forfiles - forfiles 命令,未知含义
- javascript - 使用响应式文件管理器上传任何文件时出错
- python - 在python中使用数据内容作为列创建表