Сдвиг/уменьшить конфликт с Sablecc
-
02-10-2019 - |
Вопрос
Я нахожусь в своем первом опыте с определением SABLECC и грамматики. У меня есть следующая грамматика (часть этого):
query =
{atop} attroperator |
{query_par} l_par query r_par |
{query_and} [q1]:query logic_and [q2]:query |
{query_or} [q1]:query logic_or [q2]:query |
{query_not} logic_not query ;
У меня есть следующие ошибки:
shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on
TRPar in {
[ PQuery = PQuery * TRPar ] (shift),
[ PQuery = TLogicNot PQuery * ] followed by TRPar (reduce)
}
shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on
TLogicAnd in {
[ PQuery = PQuery * TLogicAnd PQuery ] (shift),
[ PQuery = TLogicNot PQuery * ] followed by TLogicAnd (reduce)
}
shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on
TLogicOr in {
[ PQuery = PQuery * TLogicOr PQuery ] (shift),
[ PQuery = TLogicNot PQuery * ] followed by TLogicOr (reduce)
}
Я решил их, добавив L_PAR и R_PAR ко всем альтернативам, которые, кстати, должны увеличить читаемость, но есть ли способ сделать это элегантно?
Спасибо.
Решение
Итак, я решил проблему. То, что я сделал, в основном определяю три уровня ассоциативности.
query =
{query_or} query logic_or term |
{query_term} term ;
term =
{term_and} term logic_and factor |
{term_factor} factor ;
factor =
{atop} attroperator |
{query_not} logic_not attroperator |
{query_par} l_par query r_par ;
Это классическая схема ассоциативности +,* с таким унароженным оператором - где + = logic_or
, * = logic_and
, - = logic_not
.
Не связан с StackOverflow