Как решить смещать/уменьшать конфликт?

Я использую КУБОК для создания синтаксического анализатора, в котором я нуждаюсь для своего тезиса. У меня есть смещать/уменьшать конфликт в моей грамматике. У меня есть это порождающее правило:

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 и команда не.

8
задан Shane Lu 30 January 2017 в 10:51
поделиться

2 ответа

Ваша проблема вовсе не в этих правилах. Хотя ответ Майкла Мрозека является правильным подходом к решению «проблемы с болтающимся остальным», он не учитывает существующую проблему.

Если вы посмотрите на сообщение об ошибке, вы увидите, что конфликт сдвига / уменьшения присутствует при лексировании LPAREN . Я почти уверен, что сами по себе правила не приведут к конфликту.

Я не вижу вашей грамматики, поэтому не могу вам помочь. Но ваш конфликт, вероятно, возникает, когда за командой следует другое правило, которое начинается с LPAREN .

Посмотрите на любые другие правила, которые потенциально могут быть после команды и начинаться с LPAREN . Затем вам нужно будет закрепить правила. Есть очень большая вероятность, что ваша грамматика ошибочна для определенного ввода.

7
ответ дан 5 December 2019 в 12:07
поделиться

У вас есть две продукции:

command ::= IDENTIFIER
command ::= IDENTIFIER LPAREN parlist RPAREN;

Это конфликт сдвига / уменьшения, когда входные токены IDENTIFIER LPAREN , потому что:

  • LPAREN может быть начало новой продукции, которую вы не указали, и в этом случае синтаксический анализатор должен уменьшить IDENTIFIER , уже находящийся в стеке, до команды , и оставить команду LPAREN .
  • Они оба могут быть началом второго производства, поэтому ему следует переместить LPAREN в стек рядом с IDENTIFIER и продолжить чтение, пытаясь найти список parlist .

Вы можете исправить это, выполнив примерно следующее:

command ::= IDENTIFIER command2
command2 ::= LPAREN parlist RPAREN |;
5
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: