Правила YACC не снижаются - PullRequest
5 голосов
/ 27 июля 2011

Я пытаюсь выучить 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 обычно добавляет это к выводу предупреждения, если таковые имеются, но просто чтобы убедиться, что я попытался удалить WORD из change_scene, чтобы он не искал те же токены, что и другие, и все равно не уменьшал,Я могу проверить все правила, потому что какой бы ни был наверху, тот работает.Я пропускаю некоторый синтаксис в конце первого правила, которое вызывает проблемы с остальными из них?

1 Ответ

3 голосов
/ 27 июля 2011

Я считаю, что проблема в том, что yacc предполагает, что левая сторона самого первого производства является начальным символом.В этом случае это означает, что, поскольку у вас есть

define_character: WORD IS STRING COLOR

, yacc считает, что define_character является начальным символом.У вас есть два других производства, а именно:

dialog: WORD COLON STRING

и

change_scene: SCENE SETSCENE WORD

Однако обратите внимание, что нет никакого способа получить dialog или change_scene из define_character.Следовательно, yacc говорит вам, что у вас есть два бесполезных нетерминала, а именно эти два, поскольку они никогда не могут быть получены.Ошибки в двух бесполезных продуктах возникают из-за того, что оба из вышеупомянутых продуктов не могут быть запущены парсером.

Я не уверен, что понимаю, что вы пытаетесь сделать с этим кодом, но чтобыисправить это вам нужно как-то сделать так, чтобы эти нетерминалы были доступны.Можете ли вы рассказать, что именно вы пытаетесь достичь с помощью yacc?

...