野牛语法(1减少/减少1班/减少)

时间:2012-12-28 17:03:51

标签: grammar bison yacc

更新了...... 我知道,我的语法含糊不清但我怎么能重写这个语法来消除这种模糊性呢? ..................

我的语法就像这样:

野牛档案

%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个减少/减少冲突这样做,如何更改语法以消除冲突?

1 个答案:

答案 0 :(得分:1)

你的语法含糊不清。 A 可以是 Aexp Rexp 。但 Rexp 也可以是 Aexp 。这导致减少/减少冲突。

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

var = Num;

起始符号S扩展为 var = A;

非终端 A 必须与令牌 Num 相匹配。但是应该是 A 扩展到和 Aexp 然后扩展到 Num ,还是应该是 A 扩展为和 Rexp ,然后扩展为 Aexp ,然后扩展为 Num