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

如何在YACC/Bison中生成并打印状态及动作分析表

Yacc程序打印LALR(1)分析表的实现方案

方案1:直接用编译参数生成分析表报告

如果你使用的是GNU Bison(兼容Yacc的实现),不需要额外写代码,直接在编译.y源文件时添加-v参数即可:

  • 示例编译命令:bison -v your_file.y
  • 编译完成后会在同目录生成后缀为.output的文件,里面包含完整的LALR(1)分析表,所有状态、移进(shift)、归约(reduce)、接受(accept)动作、文法规则对应编号、冲突提示都会清晰列出,完全符合你需要的表格展示效果。

方案2:在运行的程序中实时打印分析表

你可以直接调用Yacc生成C代码中的内置数据结构实现打印,不需要自己从头实现分析表逻辑:

  • Yacc生成的C代码默认包含以下核心全局数组,可直接引用:
    • yytable:动作表数组,存储每个状态对应每个终结符的动作
    • yydefred:默认归约规则表,存储每个状态无匹配动作时的默认归约规则
    • yyname:存储所有终结符、非终结符的名称字符串
  • 打印逻辑参考:先打印表头(状态列 + 所有终结符列 + 所有非终结符列),再逐行遍历每个状态,对每个符号对应输出s+移进目标状态/r+归约规则编号/acc/空(无匹配动作)即可。

适配经典AT&T Yacc的方案

如果你使用的是没有-v参数的旧版AT&T Yacc,可以直接修改生成的y.tab.c文件,在yyparse()函数执行前添加上述数组遍历的打印代码即可,旧版本Yacc的内置数组命名和Bison基本一致,部分版本前缀为y而非yy,可直接在生成的C代码中搜索表格相关定义确认。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:36:04