解决YACC转移/减少。快把我逼疯了

时间:2013-05-15 17:19:06

标签: yacc

嘿伙计这让我发疯了我会列出错误和下面的相关代码。提前感谢您的帮助。

ERROR:

51: shift/reduce conflict (shift 69, reduce 28) on '{'
state 51
funcao : publico tIDENTIFIER '(' seq_vars ')' eqliteral . corpo  (13)
corpo : .  (28)

'{'  shift 69
$end  reduce 28
tVOID  reduce 28
tPUBLIC  reduce 28
tCONST  reduce 28
tIF  reduce 28
tDO  reduce 28
tFOR  reduce 28
tCONTINUE  reduce 28
tBREAK  reduce 28
tRETURN  reduce 28
tINTEGER  reduce 28
tNUMBER  reduce 28
tSTRING  reduce 28

corpo  goto 70
bloco  goto 71

这是相关的代码

// Função
funcao: publico tIDENTIFIER '(' seq_vars ')' eqliteral corpo {};
// Corpo do bloco
corpo: bloco |;
// Bloco
bloco:  '{' seq_decls seq_inst '}' {/*figure this out later*/};

如果我这样做的话,我会继续尝试解决它并发布答案。

1 个答案:

答案 0 :(得分:0)

由于我们无法复制情况,我只是猜测......

看起来Yacc在eqliteral非终结符后到达该位置时不知道该怎么办。由于错误消息中的. in规则,您可以看到解析器生成器所在的位置。

当Yacc到达此位置且没有'{'终端时,它是否应该使用bloco规则进行转换(您也会在该规则中看到.)或者应该减少看到其他什么?

一种可能的解决方案(我无法验证)是更改funcao规则:

funcao: publico tIDENTIFIER '(' seq_vars ')' eqliteral
      | publico tIDENTIFIER '(' seq_vars ')' eqliteral '{' seq_decls seq_inst '}'
      ;

可以工作,但可能不会。