2

私は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を追加することでそれらを解決しました。ちなみに、読みやすさを向上させるはずですが、エレガントな方法でそれを行う方法はありますか?

ありがとう。

4

1 に答える 1

3

だから、私は問題を解決しました。私がやったことは、基本的に3つのレベルの結合性を定義することです。

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

于 2010-07-26T18:14:19.957 に答える