为什么此yacc代码会产生移位/减少冲突

问题描述 投票:1回答:1

我不知道为什么下面的代码会产生移位/减少冲突

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来减少?]

完整代码

y.output https://controlc.com/56d66aea/fullscreen.php?hash=4f3bc1c214e1f3347b3a64df69a9b519&toolbar=true&linenum=false

test.y https://controlc.com/04d49e1b/fullscreen.php?hash=6dde9e69b9ea5873ff6ac234474a5927&toolbar=true&linenum=false

yacc
1个回答
2
投票

移位/减少冲突的出现是因为在某些情况下使用了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]。因此,冲突告诉您解析器无法判断这样的表达式在何处结束,并且该块开始。

© www.soinside.com 2019 - 2024. All rights reserved.