补充说明
bison 读取 BNF 风格的文法文件(.y),生成 C/C++ 语法分析器。它实现 LALR(1)(也可用 GLR),常与 flex 生成的词法分析器配合,是编译器和配置语言解析器的标准工具。
文法文件分为声明、规则、用户代码三段。出现 shift/reduce 或 reduce/reduce 冲突时,应先用 -v 生成 .output 文件查看状态机,再调整优先级或改写文法,而不是盲目增加 %expect。
语法
bison [选项] 文件.y
选项
-d:同时生成头文件(默认文件.tab.h),供词法器共享 token 定义-o FILE:指定生成的 C 源文件名-v:生成.output状态机报告-W:启用警告,如-Wcounterexamples-y:模仿 yacc 的输出文件名-t:在生成代码中启用调试宏
实例
# 生成 parser.tab.c 与 parser.tab.h
bison -d parser.y
# 自定义输出文件名并生成状态报告
bison -d -v -o parser.c parser.y
# 与 flex 配合编译
flex lexer.l
cc -o calc parser.c lex.yy.c
# 查看冲突详情
grep -n 'conflict' parser.output
规则中的动作使用 $$ 表示左部符号值,$1、$2 表示右部各符号值;%token、%left、%right、%nonassoc 用于声明 token 与优先级。