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 个 shift/reduce 和 1 个 reduce/reduce 冲突,如何更改语法以消除冲突?

4

1 回答 1

1

你的语法模棱两可。A可以是AexpRexp。但是Rexp也可以是Aexp。这会导致减少/减少冲突。

假设你给你的解析器这个标记序列作为输入:

var = 数字;

开始符号 S 展开为var = A ;

非终结符A必须匹配令牌Num。但这应该是一个A扩展到和Aexp然后扩展到Num,还是应该是一个A扩展到和Rexp,然后扩展到Aexp,然后扩展到Num

于 2012-12-28T18:16:30.583 回答