You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;
    }
    
  • 检查可执行文件的生成与权限

    1. 重新执行make,仔细查看编译过程是否有报错(比如tokens.h缺失、listing.cc存在未定义函数等),确保compile正常生成。
    2. 执行ls -l compile查看文件权限,若没有执行权限,运行chmod +x compile添加权限。
  • 验证扫描器的输出逻辑
    检查scanner.l中的规则是否包含输出代码,比如识别到token后是否有printf或其他输出操作。若仅匹配token但无输出,运行程序后自然看不到结果。可先添加一个简单测试规则:

    . { printf("Unrecognized character: %c\n", yytext[0]); }
    

    重新编译后运行,查看是否能输出test.txt中的内容。

  • 检查测试文件内容的合法性
    若test.txt中的内容完全不匹配你定义的任何Flex规则,扫描器可能不会产生任何输出。先创建一个极简测试文件,仅包含已定义的基础token(比如关键字、标识符等),测试是否能被正确识别并输出。

  • 开启调试模式定位问题

    1. 在scanner.l中添加%option debug选项,重新编译后运行程序,会输出扫描过程的详细调试信息,帮助确认程序是否在扫描内容、哪些token被识别。
    2. 修改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.cc
      
      然后用gdb ./compile启动调试,设置断点跟踪程序执行流程,检查文件是否被正确打开、扫描逻辑是否正常执行。

内容的提问来源于stack exchange,提问作者user2097371

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:20:39