2012-06-07 86 views
1

这里是[文件名] .OUTPUT 状态的摘录94如何解决这个减轻/减少野牛冲突?

32 expr: expr . opt_at_type '.' TYPEID '(' opt_expr_list ')' 
    39  | expr . '+' expr 
    40  | expr . '-' expr 
    41  | expr . '*' expr 
    42  | expr . '/' expr 
    42  | expr '/' expr . 
    44  | expr . '<' expr 
    45  | expr . LE expr 
    46  | expr . '=' expr 

    '@' shift, and go to state 73 

    '.'  reduce using rule 23 (opt_at_type) 
    '.'  [reduce using rule 42 (expr)] 
    $default reduce using rule 42 (expr) 

    opt_at_type go to state 74 

opt_at_type被定义为:

opt_at_type: 
      { $$ = idtable.add_string("SELF_TYPE"); } 
      |  '@' TYPEID 
      { $$ = $2; } 
      ; 

,你可以告诉我为什么它是怎么回事?

回答

1

你正在运行到的问题是,YACC优先级别仅考虑解决移位/减少冲突的帐户,而不是减少/减少。在这种情况下,opt_at_type规则可以匹配空字符串(它是可选的),从而导致减少/减少冲突。

为了解决这个问题,你需要unfactor规则摆脱小量生产:

expr: expr '.' TYPEID '(' opt_expr_list ')' 
    | expr '@' TYPEID '.' TYPEID '(' opt_expr_list ')' 
    | expr '+' expr 
     : 

没有小量生产,它并不需要尽早降低,使冲突成为移进/减少可以通过yacc优先级正常解决的冲突。

0

当野牛见下表:

expr '/' expr '.' 

它不知道这是否等同于:

1) expr opt_at_type '.' 

OR

2) expr '/' expr opt_at_type '.' 

为1),这将减少对expr '/' exprexpr首先和2)它会减少/ *空* /到首先10。

所以我们发现了含糊之处,为了解决它,你必须确定你想要的语法。一个解决办法是使第一EXPR排除一个单独的规则,使其无法在其他表达式,像这样的内部使用:

typeexpr: expr opt_at_type '.' TYPEID '(' opt_expr_list ')'