已更新...我知道,我的语法是模棱两可的,但是我如何重写这个语法来消除这种歧义呢?
我有一个语法就像这样:
Bison文件
%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冲突,我如何改变语法来消除冲突?
发布于 2012-12-29 02:16:31
你的语法模棱两可。A可以是Aexp或Rexp。但Rexp也可以是Aexp。这会导致reduce/reduce冲突。
假设您将此令牌序列作为输入提供给解析器:
变量= Num ;
开始符号S扩展为var =A ;
非终端A必须与令牌Num匹配。但这应该是一个A,它扩展到Aexp,然后扩展到Num,或者它应该是一个A,它扩展到and Rexp<代码>E227,然后扩展到<代码>E128Aexp<代码>E229,然后扩展到<代码>E130Num<代码>E231
https://stackoverflow.com/questions/14073024
复制相似问题