سؤال

I was trying many many time to solve this conflict.

But I don't know why occur conflict here.

2 conflicts occur at compliation time.

yacc(bison) error goes:

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 source goes:

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
    ;

I have two problems above. What's wrong with it?

هل كانت مفيدة؟

المحلول

Let's consider the messages from the first shift/reduce conflict. You can read the period (".") as a pointer. What the message says, more or less in English, is

"When I'm in state 299, and I have recognized a type_identifier, I must decide whether to reduce by rule 7 (recognize c_complex_object_id : type_identifier) or to shift to state 63 (continue scanning for a V_LOCAL_TERM_CODE_REF)."

Usually a conflict like this comes about when the production not yet recognized (V_LOCAL_TERM_CODE_REF) is optional.

Your definition of the tokens V_LOCAL_TERM_CODE_REF, etc. looks OK as far as I can tell from your comment.

It's hard to diagnose this further without seeing the yacc diagnostic output for state 63. Could you edit your question to show the output for state 63? It might tell us something.

I found some lecture notes by Pete Jinks that might be useful background for you. You might also read some of the other questions listed in the right column of this page, under the "Related" heading.

Update

In one way, you are correct: a shift/reduce conflict can be ignored. bison/yacc will produce a parser that runs, that does something. But it is important to understand why you are ignoring a specific conflict. Then you will understand why the parser, when presented with an input program, parses it the way it does and produces the output that it does. It is not good to say, "oh, this is too complex, I can't figure it out."

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top