【发布时间】:2020-01-26 22:53:23
【问题描述】:
不知道为什么下面的代码会产生移位/减少冲突
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 班次/减少
y.output 处于状态 53
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_expression_list assignment_operator right_expression吗?虽然我听说 yacc 已经十年了,但我认为您的冲突是因为解析器无法判断a, b = 1应该是(a), (b=1)还是(a, b) = 1。而且我不知道您正在构建的语言,但多重分配 (a=1, b=2) 不是您在这里所做的。 -
是的,我需要
primary_expression_list assignment_operator right_expression,但我对primary_expression assignment_operator right_expression的修改并没有消除 状态 53 冲突:1 班次/减少 -
删除
primary_expression其|primary_no_literal_expression和| DOT primary_no_literal_expression可以消除primary_no_literal_expression其| IDENTIFIER LC RC冲突不知道问题出在哪里?
标签: yacc