Postgresql中的gram.y可以独立编译,独立编译可以控制bison的参数来打印具体错误:
PG15
cd src/backend/parser
bison -d -o gram.c gram.y -Wno-deprecated
正常执行后会产生gram.c文件,一旦发生冲突,bison会报错,例如:
但没有进一步的信息不好定位问题,这里提供两种方式打印更详细的错误帮助定位:
一、命令行直接输出冲突位置:
bison -d -o gram.c gram.y -Wno-deprecated -Wcounterexamples
(如果命令不支持counterexamples请更新bison:https://ftp.gnu.org/gnu/bison/)
结果:
可以看出这是一个reduce/recude冲突,位置也给出了。
二、冲突信息输出到文件:
bison --report="cex" -d -o gram.c gram.y
会在当前目录下生成gram.output文件。在文件中搜索conflict on token
即可:
实例:VARCHAR改规约哪个?发生冲突。
cex结果
实例:VARCHAR向右移进 还是 向上规约?发生冲突。
实例:NULL_P移进?规约?
bison -Wno-deprecated -d -o gram.c gram.y -Wcounterexamples
gram.y: error: shift/reduce conflicts: 1 found, 0 expected
gram.y: warning: shift/reduce conflict on token NULL_P [-Wcounterexamples]
Example: xmltable_column_option_el • NULL_P
Shift derivation
xmltable_column_option_list
↳ 1868: xmltable_column_option_el • NULL_P
Reduce derivation
xmltable_column_option_list
↳ 1867: xmltable_column_option_list xmltable_column_option_el
↳ 1866: xmltable_column_option_el • ↳ 1872: NULL_P