前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Postgresql中yacc语法树冲突解决方法(shift/reduce conflicts)

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

作者头像
mingjie
发布2022-10-31 10:40:27
2K0
发布2022-10-31 10:40:27
举报
文章被收录于专栏:Postgresql源码分析

处理方法

Postgresql中的gram.y可以独立编译,独立编译可以控制bison的参数来打印具体错误:

PG15

代码语言:javascript
复制
cd src/backend/parser

bison -d -o gram.c gram.y -Wno-deprecated

正常执行后会产生gram.c文件,一旦发生冲突,bison会报错,例如:

在这里插入图片描述
在这里插入图片描述

但没有进一步的信息不好定位问题,这里提供两种方式打印更详细的错误帮助定位:

一、命令行直接输出冲突位置:

代码语言:javascript
复制
bison -d -o gram.c gram.y -Wno-deprecated -Wcounterexamples

(如果命令不支持counterexamples请更新bison:https://ftp.gnu.org/gnu/bison/)

结果:

在这里插入图片描述
在这里插入图片描述

可以看出这是一个reduce/recude冲突,位置也给出了。

二、冲突信息输出到文件:

代码语言:javascript
复制
bison --report="cex" -d -o gram.c gram.y

会在当前目录下生成gram.output文件。在文件中搜索conflict on token即可:

在这里插入图片描述
在这里插入图片描述

yacc的两种冲突

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

实例:VARCHAR改规约哪个?发生冲突。

在这里插入图片描述
在这里插入图片描述

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

实例:VARCHAR向右移进 还是 向上规约?发生冲突。

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 处理方法
  • yacc的两种冲突
    • reduce/reduce冲突:两条规则都可以规约当前token
      • shift/reduce冲突:两条规则既可以移进也可以规约token
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档