2017-04-13 15 views
0

コンパイラを作成しようとしていますが、今ではパーサを作成しようとしています。 私はこの状態に警告を得る:この部分の 州89shift/reduseの警告を取り除くには?

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 
; 

とどのように私はおそらくそれを修正することができ、私はすでに固定されています?いくつかシフト/問題を減らすが、一般的に私はこの問題が何かを理解していない。

cond: '(' cond ')' 

しかし、出力ファイルから引用1は、生産を持っています:

cond: '(' expr ')' 

他のいくつかの相違があります は、あなたの質問で引用された文法は生産を持っている非常に

+0

[状態77の終わりに2行を忘れてしまった:] '[[規則77(cond)を使って減らす] $ 77規則(cond)を使用してデフォルトで減らす – Nwlis

+1

投稿を編集するには[編集]を使用してください。 –

答えて

1

をありがとう引用された文法から出力ファイルが生成されなかったことが明らかになりました。それは問題に答える作業を複雑にしますが、根本的に問題はどちらの場合も同じです。私は答えの残りの参照として出力ファイルを使用しています。

あなたも持っているので:

cond: expr 

condが括弧で囲まれた文字列を導出する任意のコンテキストで曖昧さがあります。 (衝突は、かなりはっきり状態119ショーのため図示。)とし、例えば、パーサが遭遇

not (x) 
xのみ( l_valueを介して) exprに減少させることが、2つの可能性があることができ

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

この曖昧さは、condが許可されているすべてのコンテキストに存在します。

構文的にブール値とブール代数式にを分割するのは難しく、ほとんど不要です。最終的には、任意の式をブール値(cond: expr)として使用できるようになります。ブール値を変数に割り当てることを許可する(またはユーザーが許可することを期待している)可能性があります。したがって、最も簡単で最も一般的な解決策は、値が値であり、式が式であり、特殊なブーリアンがないということだけです。

2つを構文的に分離する必要があると感じたら、this recent questionに例があります。

関連する問題