Я использую КУБОК для создания синтаксического анализатора, в котором я нуждаюсь для своего тезиса. У меня есть смещать/уменьшать конфликт в моей грамматике. У меня есть это порождающее правило:
command ::= IDENTIFIER | IDENTIFIER LPAREN parlist RPAREN;
и у меня есть это предупреждение:
Warning : *** Shift/Reduce conflict found in state #3
between command ::= IDENTIFIER (*)
and command ::= IDENTIFIER (*) LPAREN parlist RPAREN
under symbol LPAREN
Теперь, я на самом деле хотел, чтобы это сместилось так, я соглашаюсь довольно с ним, но мой преподаватель сказал мне находить способ решить конфликт. Я являюсь слепым. Я всегда читал о, если/еще конфликт, но мне это не кажется случаем. Можно ли помочь мне?
P.S.: ИДЕНТИФИКАТОР, LPAREN" (" и RPAREN")" является терминальным, parlist и команда не.
Ваша проблема вовсе не в этих правилах. Хотя ответ Майкла Мрозека является правильным подходом к решению «проблемы с болтающимся остальным», он не учитывает существующую проблему.
Если вы посмотрите на сообщение об ошибке, вы увидите, что конфликт сдвига / уменьшения присутствует при лексировании LPAREN . Я почти уверен, что сами по себе правила не приведут к конфликту.
Я не вижу вашей грамматики, поэтому не могу вам помочь. Но ваш конфликт, вероятно, возникает, когда за командой
следует другое правило, которое начинается с LPAREN
.
Посмотрите на любые другие правила, которые потенциально могут быть после команды
и начинаться с LPAREN
. Затем вам нужно будет закрепить правила. Есть очень большая вероятность, что ваша грамматика ошибочна для определенного ввода.
У вас есть две продукции:
command ::= IDENTIFIER
command ::= IDENTIFIER LPAREN parlist RPAREN;
Это конфликт сдвига / уменьшения, когда входные токены IDENTIFIER LPAREN
, потому что:
LPAREN
может быть начало новой продукции, которую вы не указали, и в этом случае синтаксический анализатор должен уменьшить IDENTIFIER
, уже находящийся в стеке, до команды
, и оставить команду LPAREN
. LPAREN
в стек рядом с IDENTIFIER
и продолжить чтение, пытаясь найти список parlist
. Вы можете исправить это, выполнив примерно следующее:
command ::= IDENTIFIER command2
command2 ::= LPAREN parlist RPAREN |;