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

如何获取Bison生成的规则文件的代码覆盖率?

获取Bison规则文件代码覆盖率的实用方法

刚好我之前处理过类似的需求,给你几个靠谱的方法,能轻松拿到你.yy文件里代码行的执行情况:

  • 用GCC的gcov工具做全量代码覆盖率分析
    这是最省心的方案,利用GCC自带的覆盖率工具就能搞定:

    1. 编译Bison生成的解析器代码(比如parser.tab.c)时,加上编译选项:-fprofile-arcs -ftest-coverage,这会让编译后的程序运行时自动记录代码执行情况。
    2. 用你的后端程序正常处理目标文件,跑完之后,在代码目录下执行gcov parser.tab.c,会生成一个parser.tab.c.gcov文件。打开这个文件,你能看到每一行的执行次数,而且Bison生成的代码里会标注对应.yy文件的原始行号,很容易对应回去。
    3. 要是想更直观的可视化报告,可以搭配lcov工具:先执行lcov --capture --directory . --output-file coverage.info,再用genhtml coverage.info --output-directory coverage_report生成HTML报告,打开后能清晰看到哪些行被执行、哪些没被执行,还能查看分支覆盖率。
  • 用Bison自带的跟踪功能看规则触发情况
    如果你更关心哪些语法规则被触发,而不是每一行代码,那Bison自带的跟踪功能很实用:
    生成解析器时加上--trace选项,然后运行程序时设置环境变量YYDEBUG=1,或者在代码里直接设置yydebug = 1;,这样程序运行时会输出详细的语法分析过程,包括每一步用到的规则,能直接看到哪些规则被执行过。

  • 手动插桩做定制化统计
    要是你需要针对特定规则做精细统计,或者上面的工具满足不了特殊需求,可以手动在规则的动作代码里加计数器:

    %{
    // 先定义计数器数组,根据你的规则数量调整大小
    int rule_exec_count[100] = {0};
    %}
    
    %%
    // 每个规则的动作里加计数器
    expr: expr '+' term { rule_exec_count[0]++; }
        | term          { rule_exec_count[1]++; }
        ;
    %%
    

    然后在程序结束的时候把这些计数器的值输出来,就能精准知道每个规则的执行次数。不过这个方法需要手动修改.yy文件,适合规则数量不多或者需要针对性统计的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:52:31