yacc转移/减少冲突。这真的很复杂

时间:2012-07-10 08:49:45

标签: conflict bison yacc shift-reduce-conflict

我尝试了很多次来解决这场冲突。

但我不知道为什么会在这里发生冲突。

在赞美时发生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
    ;

我上面有两个问题。怎么了?

1 个答案:

答案 0 :(得分:1)

让我们考虑来自第一次转移/减少冲突的消息。您可以将句点(“。”)作为指针读取。消息所说的或多或少是英文的,

“当我处于状态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的输出吗?它可能会告诉我们一些事情。

我找到了一些lecture notes by Pete Jinks可能对你有用的背景。您还可以阅读本页右栏中“相关”标题下列出的其他一些问题。

<强>更新

在某种程度上,你是对的:可以忽略转移/减少冲突。 bison / yacc将生成一个运行的解析器,它可以运行某些东西。但重要的是要理解为什么你忽略了特定的冲突。然后,您将理解为什么解析器在提供输入程序时会按照它的方式对其进行解析并生成它所做的输出。不好说,“哦,这太复杂了,我无法理解。”