当前位置: 首页 > 工具软件 > Reduce > 使用案例 >

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

屈升
2023-12-01

 

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进行规约,所以就出现了规约冲突。

 

 类似资料: