如何用compile可执行文件运行自定义语言测试程序?C++/Flex/Bison
排查Flex/Bison编译器无法处理测试文件的步骤
确认程序是否支持命令行输入文件
Flex生成的默认扫描器默认从标准输入读取内容,若直接运行./compile test.txt,程序可能不会读取test.txt的内容。正确运行方式应为./compile < test.txt。若需让程序支持命令行参数指定文件,需在scanner.l中自定义main函数,示例如下:int main(int argc, char** argv) { FILE* input; if (argc > 1) { input = fopen(argv[1], "r"); if (!input) { perror("Failed to open file"); return 1; } yyin = input; } yylex(); if (argc > 1) fclose(input); return 0; }检查可执行文件的生成与权限
- 重新执行
make,仔细查看编译过程是否有报错(比如tokens.h缺失、listing.cc存在未定义函数等),确保compile正常生成。 - 执行
ls -l compile查看文件权限,若没有执行权限,运行chmod +x compile添加权限。
- 重新执行
验证扫描器的输出逻辑
检查scanner.l中的规则是否包含输出代码,比如识别到token后是否有printf或其他输出操作。若仅匹配token但无输出,运行程序后自然看不到结果。可先添加一个简单测试规则:. { printf("Unrecognized character: %c\n", yytext[0]); }重新编译后运行,查看是否能输出test.txt中的内容。
检查测试文件内容的合法性
若test.txt中的内容完全不匹配你定义的任何Flex规则,扫描器可能不会产生任何输出。先创建一个极简测试文件,仅包含已定义的基础token(比如关键字、标识符等),测试是否能被正确识别并输出。开启调试模式定位问题
- 在
scanner.l中添加%option debug选项,重新编译后运行程序,会输出扫描过程的详细调试信息,帮助确认程序是否在扫描内容、哪些token被识别。 - 修改Makefile,在编译时添加
-g调试选项,比如:
然后用scanner.o: scanner.c listing.h tokens.h g++ -g -c scanner.c listing.o: listing.cc listing.h g++ -g -c listing.ccgdb ./compile启动调试,设置断点跟踪程序执行流程,检查文件是否被正确打开、扫描逻辑是否正常执行。
- 在
内容的提问来源于stack exchange,提问作者user2097371
相关产品推荐
相关产品推荐

