我不知道为什么下面的代码会产生移位/减少冲突
primary_no_literal_expression
: IDENTIFIER
{
$$ = mioc_create_identifier_expression($1);
}
| IDENTIFIER LC RC // shift/reduce conflicts
{
}
| function_no_argument_call_expression
| function_with_argument_call_expression
| primary_no_literal_expression slice_index_expression
| primary_no_literal_expression DOT IDENTIFIER
| primary_no_literal_expression DOT IDENTIFIER LP RP
| primary_no_literal_expression DOT function_with_argument_call_expression
;
显示状态53冲突:1转换/减少
状态53中的y。输出
state 53
95 primary_no_literal_expression: IDENTIFIER .
96 | IDENTIFIER . LC RC
103 function_no_argument_call_expression: IDENTIFIER . LP RP
107 function_with_argument_list: IDENTIFIER . LP argument_list RP
LP shift, and go to state 105
LC shift, and go to state 106
LC [reduce using rule 95 (primary_no_literal_expression)]
$default reduce using rule 95 (primary_no_literal_expression)
state 106
96 primary_no_literal_expression: IDENTIFIER LC . RC
RC shift, and go to state 159
...
state 159
96 primary_no_literal_expression: IDENTIFIER LC RC .
$default reduce using rule 96 (primary_no_literal_expression)
规则95
95 primary_no_literal_expression: IDENTIFIER
96 | IDENTIFIER LC RC
97 | function_no_argument_call_expression
98 | function_with_argument_call_expression
99 | primary_no_literal_expression slice_index_expression
100 | primary_no_literal_expression DOT IDENTIFIER
101 | primary_no_literal_expression DOT IDENTIFIER LP RP
102 | primary_no_literal_expression DOT function_with_argument_call_expression
LC [使用规则95减少(primary_no_literal_expression)]primary_no_literal_expression规则是“ IDENTIFIER LC RC”(规则95)为什么只读LC来减少?]
完整代码
移位/减少冲突的出现是因为在某些情况下使用了primary_no_literal_expression
(在某些规则的右侧),可以在其后跟一个LC
标记。这意味着在看到IDENTIFIER
标记后,当下一个标记(超前)为LC
时,解析器不知道是否应该将LC
移至(最终匹配primary_no_literal_expression: IDENTIFIER LC RC
规则)或减少[ C0]规则(匹配primary_no_literal_expression: IDENTIFIER
之后允许LC
的任何内容>
[您需要找到该规则并弄清楚该怎么做-摆脱其中一个规则(如果事情含糊不清),或者弄清楚如何知道要匹配的规则(基于额外的前瞻性和/或词法分析器反馈或其他))>
在您的情况下,罪魁祸首(至少其中一个)可能是规则primary_no_literal_expression
,因为if_statement: IF logical_or_expression block
可以扩展为logical_or_expression
(或以primary_no_literal_expression
结尾),而block
可以以[[ C0]。因此,冲突告诉您解析器无法判断这样的表达式在何处结束,并且该块开始。