2012-06-07 129 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 ')'