0

私はこの対立を解決するために何度も試みました。

しかし、なぜここで競合が発生するのかわかりません。

コンパイル時に 2 つの競合が発生します。

yacc(bison) エラーは次のようになります。

State 314 conflicts: 1 shift/reduce
State 315 conflicts: 1 shift/reduce

state 314
  7 c_complex_object_id: type_identifier .
  8                    | type_identifier . V_LOCAL_TERM_CODE_REF 

    V_LOCAL_TERM_CODE_REF  shift, and go to state 77
    V_LOCAL_TERM_CODE_REF  [reduce using rule 7 (c_complex_object_id)]
    $default                reduce using rule 7 (c_complex_object_id)

state 315
  127 c_integer_spec:     integer_value .
  184 ordinal:            integer_value . SYM_INTERVAL_DELIM V_QUALIFIED_TERM_CODE_REF
  201 integer_list_value: integer_value . ',' integer_value
  203                   | integer_value . ',' SYM_LIST_CONTINUE

    SYM_INTERVAL_DELIM  shift, and go to state 380
    ','                 shift, and go to state 200
    SYM_INTERVAL_DELIM  [reduce using rule 127 (c_integer_spec)]
    $default             reduce using rule 127 (c_integer_spec)

state 77
  8 c_complex_object_id: type_identifier V_LOCAL_TERM_CODE_REF .

    $default  reduce using rule 8 (c_complex_object_id)

state 380
  184 ordinal: integer_value SYM_INTERVAL_DELIM . V_QUALIFIED_TERM_CODE_REF

    V_QUALIFIED_TERM_CODE_REF  shift, and go to state 422

state 200
  201 integer_list_value: integer_value ',' . integer_value
  203                        | integer_value ',' . SYM_LIST_CONTINUE

    V_INTEGER          shift, and go to state 2
    SYM_LIST_CONTINUE  shift, and go to state 276
    '+'                     shift, and go to state 170
    '-'                     shift, and go to state 171

    integer_value  go to state 277

...

yacc ソースは次のようになります。

c_complex_object_id
    : type_identifier 
    | type_identifier V_LOCAL_TERM_CODE_REF 
    ; 

type_identifier
    : '(' V_TYPE_IDENTIFIER ')' 
    | '(' V_GENERIC_TYPE_IDENTIFIER ')' 
    | V_TYPE_IDENTIFIER 
    | V_GENERIC_TYPE_IDENTIFIER 
    ;

c_integer_spec
    : integer_value 
    | integer_list_value 
    | integer_interval_value 
    ; 

c_integer
    : c_integer_spec 
    | c_integer_spec ';' integer_value 
    | c_integer_spec ';' error 
    ; 

ordinal
    : integer_value SYM_INTERVAL_DELIM V_QUALIFIED_TERM_CODE_REF 
    ; 

integer_list_value
    : integer_value ',' integer_value 
    | integer_value ',' SYM_LIST_CONTINUE 
    ; 

integer_value
    : V_INTEGER
    | '+' V_INTEGER
    | '-' V_INTEGER
    ;

上記の2つの問題があります。どうしたの?

4

1 に答える 1

1

最初のshift/reduceの競合からのメッセージを考えてみましょう。ピリオド( "。")をポインタとして読み取ることができます。メッセージが言うことは、多かれ少なかれ英語で、

「状態299にあり、を認識したtype_identifier場合、ルール7で削減する(認識するc_complex_object_id : type_identifier)か、状態63に移行する(スキャンを続行する)かを決定する必要がありV_LOCAL_TERM_CODE_REFます。」

通常、このような競合は、まだ認識されていないプロダクション(V_LOCAL_TERM_CODE_REF)がオプションの場合に発生します。

トークンV_LOCAL_TERM_CODE_REFなどの定義は、コメントからわかる限り、問題ないように見えます。

状態63のyacc診断出力を確認せずに、これをさらに診断することは困難です。状態63の出力を表示するように質問を編集できますか?それは私たちに何かを教えてくれるかもしれません。

ピート・ジンクスの講義ノートを見つけました。これはあなたにとって役立つ背景になるかもしれません。このページの右の列の「関連」の見出しの下にリストされている他の質問のいくつかを読むこともできます。

アップデート

ある意味では、あなたは正しいです。shift/reduceの競合は無視できます。bison / yaccは、何かを実行するパーサーを生成します。ただし、特定の競合を無視している理由を理解することが重要です。次に、パーサーが入力プログラムを提示されたときに、それをそのように解析し、それが行う出力を生成する理由を理解します。「ああ、これは複雑すぎて、理解できない」と言うのは良くありません。

于 2012-07-11T14:16:35.890 に答える