postgresql解决shift/reduce 和reduce/reduce冲突

 

1. 生成output文件

 

bison -v ora_gram.y

 

bison冲突一般分为shift/reduce 和reduce/reduce冲突

 

shift/reduce冲突的一般原因:

 

一、路径冲突

InsertMultStmt:

INSERT multi_insert_level into_target_list1 SelectStmt

into_target_list1:

into_target1

| into_target_list1 into_target1

into_target1:

WHEN a_expr THEN into insert_target multi_insert_rest

SelectStmt:

SELECT column_name_list FROM table_name

 

multi_insert_reset:

‘(’ insert_column_list ‘)’ opt_values_clause

{

}

| opt_values_clause SELECT

{

}

| opt_values_clause

{

}

查看ora_gram.output文件

State 3025

1781 multi_insert_rest : opt_values_clause . SELECT

| opt_values_clause .

SELECT shift, and go to state 3869

SELECT [reduce using rule 1781 (multi_insert_rest)]

以上可以看到,一个路径读取了SELECT,认为是SelectStmt子句的开头,multi_insert_rest子句结束,需要reduce。另外一个路径读取SELECT,认为是multi_insert_rest子句的SELECT,需要shift。在这种情况下,同一个字符既存在可以规约的情况,又存在能够移进的情况,就会存在冲突。

二、结合性

InsertMultStmt:

INSERT multi_insert_level into_target_list1 SelectStmt

into_target_list1:

into_target1

| into_target_list1 into_target1

into_target1:

WHEN a_expr THEN into insert_target multi_insert_rest

SelectStmt:

SELECT column_name_list FROM table_name

 

multi_insert_reset:

‘(’ insert_column_list ‘)’ opt_values_clause

{

}

| opt_values_clause

{

}

insert_target:

qualified_name

{ }

| qualified_name as ColId

{ }

 

opt_values_clause:

VALUES ctext_row

{

}

| /**EMPTY/

{

}

其中VALUES 关键字没有作为保留关键字,也就是说可以作为普通名字字符使用,

出现冲突

into_target: INTO insert_target . multi_insert_rest

VALUES shift, and go to state 3022

VALUES [reduce using rule 1783(opt_values_clasuse)]

 

reduce/reduce冲突一般原因:

一、路径重复

into_target_list1:

into_target1

| into_target_list1 into_target1

 

into_target1:

WHEN a_expr THEN into insert_target multi_insert_rest

 

multi_insert_reset:

‘(’ insert_column_list ‘)’ opt_values_clause

{

}

| opt_values_clause

{

}

| opt_values_clause

{

}

查看ora_gram.output文件

State 3025

1781 multi_insert_rest : opt_values_clause .

| opt_values_clause .

WHEN reduce using rule 1781 (multi_insert_rest)

WHEN [reduce using rule 1781 (multi_insert_rest)]

以上可以看到 multi_insert_rest 子句读取完毕,存在两个路径都读到了一下个into_target1的WHEN 字符,需要对mulit_insert_rest进行规约,所以就出现了规约冲突。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值