0

更新...私の文法があいまいであることはわかっていますが、この文法を書き直してこのあいまいさをなくすにはどうすればよいですか? ...................

私はこのような文法を持っています:

バイソンファイル

%left equal nEqual
%left gre less greOrEqual lessOrEqual
%left plus sub
%left DIV mult exp mod
%left not
%left leftB rightB
%%


S :
var "=" A ";"  
;


A:
 Aexp   
|Rexp   
;

Aexp :
Num                                     
| leftB Aexp  rightB               
| Aexp  plus    Aexp            
| Aexp  sub     Aexp            
| Aexp  DIV     Aexp            
| Aexp  mult    Aexp            
;


Rexp :
Aexp                            
| Rexp  gre Rexp                
| Rexp  less Rexp               
| Rexp  greOrEqual  Rexp                
| Rexp  lessOrEqual Rexp            
| Rexp  equal Rexp              
| Rexp  nEqual Rexp             
;

これを行うと、1 つのシフト/リデュースと 1 つのリデュース/リデュースの競合が発生します。文法を変更して競合をなくすにはどうすればよいですか?

4

1 に答える 1

1

あなたの文法はあいまいです。AはAexpまたはRexpにすることができます。しかし、RexpはAexpにすることもできます。これにより、reduce/reduce の競合が発生します。

パーサーにこのトークン シーケンスを入力として与えるとします。

var = 数値;

開始記号 S はvar = A に展開されます。

非終端記号Aは、トークンNumと一致する必要があります。しかし、それはAに展開され、その後Numに展開されるAexpである必要がありますか、それともAであり、Rexpに展開され、その後Aexpに展開され、その後Numに展開される必要がありますか?

于 2012-12-28T18:16:30.583 に答える