2017-04-13 161 views
0

我想製作一個編譯器,現在我正在嘗試製作解析器。 我得到這個狀態的警告: 國家89如何刪除移位/減少警告?

62 expr: '(' expr . ')' 
    66  | expr . '+' expr 
    67  | expr . '-' expr 
    68  | expr . '*' expr 
    69  | expr . '/' expr 
    70  | expr . '%' expr 
    74  | expr . '&' expr 
    75  | expr . '|' expr 
    77 cond: expr . 
    78  | '(' expr . ')' 
    82  | expr . '=' expr 
    83  | expr . "<>" expr 
    84  | expr . '<' expr 
    85  | expr . '>' expr 
    86  | expr . ">=" expr 
    87  | expr . "<=" expr 

    "<>" shift, and go to state 91 
    ">=" shift, and go to state 92 
    "<=" shift, and go to state 93 
    '+' shift, and go to state 94 
    '-' shift, and go to state 95 
    '|' shift, and go to state 96 
    '*' shift, and go to state 97 
    '/' shift, and go to state 98 
    '%' shift, and go to state 99 
    '&' shift, and go to state 100 
    '=' shift, and go to state 101 
    '<' shift, and go to state 102 
    '>' shift, and go to state 103 
    ')' shift, and go to state 119 


$default reduce using rule 77 (cond) 


State 119 

    62 expr: '(' expr ')' . 
    78 cond: '(' expr ')' . 

    "and"  reduce using rule 62 (expr) 
    "and"  [reduce using rule 78 (cond)] 
    "or"  reduce using rule 62 (expr) 
    "or"  [reduce using rule 78 (cond)] 
    ':'  reduce using rule 62 (expr) 
    ':'  [reduce using rule 78 (cond)] 
    ')'  reduce using rule 62 (expr) 
    ')'  [reduce using rule 78 (cond)] 
    $default reduce using rule 62 (expr) 

我給這部分語法是:

expr: 
    T_const | 
    T_char_const | 
    l_value | 
    '(' expr ')' | 
    func_call | 
    '+' expr | 
    '-' expr | 
    expr '+' expr | 
    expr '-' expr | 
    expr '*' expr | 
    expr '/' expr | 
    expr '%' expr | 
    T_true | T_false | 
    '!' expr | 
    expr '&' expr | 
    expr '|' expr 
; 

cond: 
    '(' cond ')' | 
    expr | 
    T_not cond | 
    cond T_and cond | 
    cond T_or cond | 
    expr '=' expr | 
    expr T_not_equal expr | 
    expr '<' expr | 
    expr '>' expr | 
    expr T_greater_equal expr | 
    expr T_less_equal expr 
; 

什麼這裏的問題是,我怎麼能可能解決它,我已經定了嗎?一些轉移/減少問題,但通常我不明白這個問題是什麼。 非常感謝您

+0

我在狀態89結束時忘了那兩條線:''[減少使用規則77(cond)] $默認減少使用規則77(條件) – Nwlis

+1

使用[編輯]編輯您的文章。 –

回答

1

您的問題所引述的語法具有生產:

cond: '(' cond ')' 

但一個輸出文件中引用具有生產:

cond: '(' expr ')' 

還有一些其他的差異這就清楚地表明輸出文件不是從引用的語法生成的。這使得回答你的問題的任務變得複雜,儘管在兩種情況下問題都是一樣的。我將輸出文件用作答案剩餘部分的參考。

既然你也有:

cond: expr 

有在其中cond得出一個括號字符串的任何方面的不確定性。 (所示的衝突爲國家119表明,相當清楚。)假設,例如,分析器遇到

not (x) 

x只能(通過l_value)減少到expr,但隨後有兩種可能性:

not (expr) => not expr [ from expr: (expr) ] 
      => not cond [ from cond: expr ] 
not (expr) => not cond [ from cond: (eχpr) ] 

這種歧義存在於允許使用cond的所有環境中。

將表達式句法上的劃分爲布爾表達式和非布爾表達式是非常棘手的,並且通常是不必要的。您最終允許將任何表達式用作布爾值(cond: expr),並且很可能允許(或者您的用戶期望您允許)將布爾值分配給變量。所以最簡單和最常見的解決方案就是說,一個值是一個值,一個表達式是一個表達式,沒有特殊的布爾值。

如果您確實需要在語法上將兩者分開,您可以在this recent question中找到示例。