YACC规则没有减少

时间:2011-07-27 05:34:34

标签: bison yacc

我正在努力学习YACC并且在弄清楚它给我的警告信息时遇到了一些麻烦。这是我文件的一部分:

define_character: WORD IS STRING COLOR
{
    printf("%s's full name is %s and thier color is %s", $1, $3, $4);
};

dialog: WORD COLON STRING
{
    printf("%s says %s", $1, $3);
};

change_scene: SCENE SETSCENE WORD
{
    printf("%s is the new scene", $3);
};

它给我的警告是:

2 rules never reduced
2 useless nonterminals and 2 useless rules
warning: useless nonterminal: dialog
warning: useless nonterminal: change_scene
warning: useless rule: dialog: WORD SEMICOLON STRING
warning: useless rule: change_scene: SCENE SETSCENE WORD

我该如何解决这些问题?我试过搜索,我发现由于转移/减少冲突而导致错误的人。似乎YACC通常会将其添加到警告输出中,如果有的话,只是为了确保我尝试从change_scene中删除WORD,这样它就不会寻找任何与其他令牌相同的令牌,但它仍然没有减少。我可以测试所有的规则,因为无论哪个都在顶部是有效的。我是否在第一条规则的末尾错过了一些语法,导致其余部分出现问题?

1 个答案:

答案 0 :(得分:3)

我认为问题在于yacc假设第一个产品的左侧是起始符号。在这种情况下,这意味着,因为你有

define_character: WORD IS STRING COLOR

yacc认为define_character是起始符号。你有两个其他的作品,即

dialog: WORD COLON STRING

change_scene: SCENE SETSCENE WORD

但请注意,无法从dialog派生change_scenedefine_character。因此,yacc告诉你,你有两个无用的非终结,即这两个,因为它们永远不会被推导出来。关于两个无用制作的错误是因为上述两个制作实际上都不能被解析器触发。

我不确定我是否理解您要对此代码执行的操作,但要解决此问题,您需要以某种方式使其能够达到这些非终结符。你能详细说明你想用yacc做什么吗?