嘿伙计这让我发疯了我会列出错误和下面的相关代码。提前感谢您的帮助。
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*/};
如果我这样做的话,我会继续尝试解决它并发布答案。
答案 0 :(得分:0)
由于我们无法复制情况,我只是猜测......
看起来Yacc在eqliteral
非终结符后到达该位置时不知道该怎么办。由于错误消息中的.
in规则,您可以看到解析器生成器所在的位置。
当Yacc到达此位置且没有'{'
终端时,它是否应该使用bloco
规则进行转换(您也会在该规则中看到.
)或者应该减少看到其他什么?
一种可能的解决方案(我无法验证)是更改funcao
规则:
funcao: publico tIDENTIFIER '(' seq_vars ')' eqliteral
| publico tIDENTIFIER '(' seq_vars ')' eqliteral '{' seq_decls seq_inst '}'
;
可以工作,但可能不会。