Postgresql中yacc语法树冲突解决方法(shift/reduce conflicts)

处理方法

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即可:
在这里插入图片描述

yacc的两种冲突

reduce/reduce冲突:两条规则都可以规约当前token

实例:VARCHAR改规约哪个?发生冲突。
在这里插入图片描述cex结果
在这里插入图片描述

shift/reduce冲突:两条规则既可以移进也可以规约token

实例: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高铭杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值