如何在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
相关产品推荐
相关产品推荐

