сдвиг / уменьшение конфликта с SableCC - PullRequest
2 голосов
/ 07 июля 2010

У меня первый опыт работы с 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 ко всем альтернативам, которые, с помощьюКстати, должно улучшить читабельность, но есть ли способ сделать это элегантно?

Спасибо.

1 Ответ

3 голосов
/ 26 июля 2010

Итак, я решил проблему. В основном я определил три уровня ассоциативности.

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.

...