更新了...... 我知道,我的语法含糊不清但我怎么能重写这个语法来消除这种模糊性呢? ..................
我的语法就像这样:
野牛档案
%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个减少/减少冲突这样做,如何更改语法以消除冲突?
答案 0 :(得分:1)
你的语法含糊不清。 A 可以是 Aexp 或 Rexp 。但 Rexp 也可以是 Aexp 。这导致减少/减少冲突。
假设你给你的解析器这个标记序列作为输入:
var = Num;
起始符号S扩展为 var = A;
非终端 A 必须与令牌 Num 相匹配。但是应该是 A 扩展到和 Aexp 然后扩展到 Num ,还是应该是 A 扩展为和 Rexp ,然后扩展为 Aexp ,然后扩展为 Num ?