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
    ;

我上面有两个问题。它出什么问题了?

4

1 回答 1

1

让我们考虑来自第一个班次/减少冲突的消息。您可以将句点 (".") 作为指针读取。信息或多或少用英语说的是

“当我处于状态 299 并且我已经识别出 atype_identifier时,我必须决定是按照规则 7 减少(识别c_complex_object_id : type_identifier)还是转移到状态 63(继续扫描 a V_LOCAL_TERM_CODE_REF)。”

通常,当尚未识别的产生式 ( V_LOCAL_TERM_CODE_REF) 是可选的时,就会发生这样的冲突。

据我从您的评论中可以看出,您对令牌 V_LOCAL_TERM_CODE_REF 等的定义看起来不错。

如果没有看到状态 63 的 yacc 诊断输出,很难进一步诊断。您能否编辑您的问题以显示状态 63 的输出?它可能会告诉我们一些事情。

我发现了Pete Jinks 的一些讲义,它们可能对你有用。您还可以阅读本页右栏中“相关”标题下列出的其他一些问题。

更新

一方面,您是正确的:可以忽略移位/减少冲突。bison/yacc 将生成一个运行的解析器,它会做一些事情。但重要的是要了解您为什么忽略特定冲突。然后你就会明白为什么解析器在出现输入程序时会以它的方式解析它并产生它所做的输出。不好说,“哦,这太复杂了,我想不通。”

于 2012-07-11T14:16:35.890 回答