Bison YACC规则没有减少

Bison YACC规则没有减少,bison,yacc,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 SETSC

我正在努力学习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_场景中删除WORD,这样它就不会像其他标记一样寻找任何相同的标记,并且仍然不会减少。我可以测试所有的规则,因为无论哪个规则在顶部,都是有效的。我是否在第一条规则的末尾缺少了一些语法,这会导致其他规则出现问题?

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

define_character: WORD IS STRING COLOR
yacc认为
define_character
是起始符号。你还有两部作品,分别是

dialog: WORD COLON STRING

但是,请注意,无法从
定义字符
派生
对话框
更改场景
。因此,yacc告诉您有两个无用的非终结符,即这两个,因为它们永远无法派生。关于两个无用产品的错误产生是因为解析器实际上无法触发上述两个产品


我不确定我是否理解您试图用这段代码做什么,但要解决这一问题,您需要以某种方式使其能够访问这些非终端。你能详细说明一下你想用yacc完成什么吗?

谢谢,我想我现在已经修好了。我所看到的所有例子都没有真正向您展示如何处理多个操作。我有一本O'Reilly的书,我正在努力构建我的解析器。我想我应该读得更深入一些。我在为一部视觉小说做翻译。我通过将commands语句放在顶部,命令列表用|分隔来修复它。
change_scene: SCENE SETSCENE WORD