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