0

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

错误:

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*/};

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

4

1 回答 1

0

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

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

当 Yacc 到达这个位置并且没有'{'终端时,它应该使用bloco规则移动(您也看到该.规则中的 )还是应该在看到其他东西时减少?

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

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

可能有效,也可能无效。

于 2013-05-15T18:34:15.523 回答