0

yacc のコンパイル中に競合の問題に直面しました。

以下のエラー メッセージ:

24: shift/reduce conflict (shift 66, reduce 99) on '/'
state 24
arithmetic_leaf : absolute_path .  (99)
absolute_path : absolute_path . '/' relative_path  (102)

以下のコード:

arithmetic_leaf:  '(' arithmetic_expression ')'
    {
    }
| integer_value
    {
    }
| real_value
    {
    }
| absolute_path
    {
    }
;

absolute_path: '/'
    {
    }
| '/' relative_path
    {
    }
| absolute_path '/' relative_path
    {
    }
;

relative_path: path_segment
    {
    }
| relative_path '/' path_segment
    {
    }
; 

path_segment: V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF
    {
    }
| V_ATTRIBUTE_IDENTIFIER '[' V_ARCHETYPE_ID ']'
    {
    }
| V_ATTRIBUTE_IDENTIFIER
    {
    }
; 

この時点で、'shift/reduce' 競合が発生します。

何が問題なのかわからない。この競合を解決するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

0

競合は (私には見えます) の選択肢の間にありabsolute_pathます。

文字列 likeは、ルールまたは'/a/bルールのいずれかに一致するようです。absolute_path '/' relative_path'/' relative_path

少なくとも私には、2 つのうちの 1 つを排除したいだけのように見えます。私はおそらくそれを次のように書くでしょう:

absolute_path: '/'
             | '/' relative_path
             ;

あるいは、 a を空の文字列にする方が理にかなっているかもしれませんrelative_path。その場合、次のような結果になる可能性があります。

absolute_path: '/' relative_path
             ;

relative_path:
             | path_segment
             | relative_path '/' path_segment
             ;
于 2012-07-10T07:18:22.910 に答える