首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决GnuWin32野牛中的Shift/Reduce警告?

解决GnuWin32野牛中的Shift/Reduce警告?
EN

Stack Overflow用户
提问于 2013-05-29 01:53:01
回答 2查看 70关注 0票数 0

规则的一部分是:

代码语言:javascript
复制
Type---->        BOOL   
    |   INT 
    |   CHAR    
    |   DOUBLE  
    |   ID  
    |   INT '['']'
;
rule:           VarDec rule
    |   VarDec
;
VarDec: Type ID ';'
;

在这种情况下,Parser.output会给我一个警告:

**state 25**

代码语言:javascript
复制
4 rule: VarDec . rule
5     | VarDec .

BOOL        shift, and go to state 3
INT         shift, and go to state 4
CHAR        shift, and go to state 5
DOUBLE      shift, and go to state 6
ID          shift, and go to state 7

BOOL        [reduce using rule 5 (rule)]
INT         [reduce using rule 5 (rule)]
CHAR        [reduce using rule 5 (rule)]
DOUBLE      [reduce using rule 5 (rule)]
ID          [reduce using rule 5 (rule)]
$default    reduce using rule 5 (rule)

rule            go to state 28
VarDec          go to state 25
Type            go to state 27

有没有人能帮我解决这个问题,我已经读了很多文章,但是我不知道出了什么问题,并提前感谢大家……:)

EN

回答 2

Stack Overflow用户

发布于 2013-05-29 14:10:22

上面的例子不足以再现shift/reduce冲突。

代码语言:javascript
复制
decl : rule VarDec;

这条规则导致了你的问题。

票数 1
EN

Stack Overflow用户

发布于 2013-10-29 02:38:20

冲突发生在这样一种状态下:解析堆栈顶部有一个规则,而下一个标记是BOOL、INT、CHAR、DOUBLE或ID。然后,解析器需要提前查看至少两个标记,以确定它是否正在寻找另一个规则--在这种情况下,现在正确的操作是转移,以预期稍后将后面的标记减少为“规则”--或者是否正在寻找其他东西--在这种情况下,正确的操作是将当前位于堆栈顶部的VarDec减少为“规则”。

应该可以通过更改您的“规则”规则来解决此特定冲突,如下所示:

代码语言:javascript
复制
rule: rule VarDec
  | VarDec
;

使用左递归而不是右递归。这也很好,因为您应该始终使用左递归而不是 rules中的右递归。这确保了您可以在有限的堆栈空间内解析任何输入。

Bison标识的实际状态可能会随着这种变化而略有不同,但如果仍有一个状态在堆栈顶部具有规则,并且BOOL、INT、CHAR、DOUBLE或ID中的一个作为下一个令牌,则只有一个可能的操作(仅提供规则):将堆栈上的VarDec减少为“规则”。没有其他可能的解析,即使即将到来的令牌后来被证明不会简化为VarDec。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16798450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档