0

我有以下规则,当用野牛实施它们时,我得到 5 个班次/减少警告。

规则的一部分是:

Type---->        BOOL   
    |   INT 
    |   CHAR    
    |   DOUBLE  
    |   ID  
    |   INT '['']'
;
rule:           VarDec rule
    |   VarDec
;
VarDec: Type ID ';'
;

Parser.output在这种状态下给我警告:

**state 25**

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

谁能帮我解决这个问题,我已经阅读了很多文章,但我无法弄清楚出了什么问题,并提前感谢每个人...... :)

4

2 回答 2

1

上面的例子不足以重现移位/减少冲突。您可能有一个rule其他地方的实例,VarDec或者它以它开头的标记。

如果我添加以下规则,我可以重现冲突:

decl : rule VarDec;

该规则正在导致您的问题。

于 2013-05-29T06:10:21.567 回答
0

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

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

rule: rule VarDec
  | VarDec
;

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

Bison 识别的实际状态可能会因该更改而有所不同,但在可能的情况下,堆栈顶部仍有一个 VarDec 并且 BOOL、INT、CHAR、DOUBLE 或 ID 之一作为下一个标记,将只有一种可能的操作(仅显示规则):将堆栈上的 VarDec 减少为“规则”。没有其他可能的解析,即使即将到来的令牌后来证明不会减少到 VarDec。

于 2013-10-28T18:38:20.370 回答