Небольшой конфликт Shift/Reduce в CUP

У меня возникла небольшая проблема при попытке выяснить, как разрешить конфликт в моем проекте синтаксического анализатора CUP. Я понимаю, почему возникает ошибка, первый терминал VariableDeclStar может быть ID, а также Type, что вызывает конфликт, однако я не могу понять, как разрешить конфликт таким образом, чтобы сохранить Type и Variable как отдельные состояния. Любая помощь или советы будут оценены.

VariableDecl    ::= Variable SEMICOLON                  {::};
Variable        ::= Type ID                             {::};
Type            ::= INT                                 {::}
                    | DOUBLE                            {::}
                    | BOOLEAN                           {::}
                    | STRING                            {::}
                    | Type LEFTBRACKET RIGHTBRACKET     {::}
                    | ID                                {::};
VariableDeclStar::= VariableDecl VariableDeclStar       {::}
                    |                                   {::};

https://i.gyazo.com/0ac3fbf4ebc2d3968f1c2a78c292bc0d.png


person Hacker Zen    schedule 07.03.2018    source источник
comment
Эта грамматика работает так же хорошо, как представлено (с использованием VariableDeclStar в качестве начального символа). Но у нее всего 15 состояний, и ваше изображение (которое должно было быть вставленным текстом) говорит, что проблема находится в состоянии 63. Итак, я предполагаю, что вы не представляет всю вашу грамматику и что конфликт S/R вызван каким-то другим правилом (правилами) грамматики. Предоставьте минимально воспроизводимый пример с акцентом на полный (и, насколько это возможно, минимальный). В процессе изготовления вы вполне можете решить свою проблему самостоятельно, а в остальном мы посмотрим еще раз.   -  person rici    schedule 08.03.2018
comment
Спасибо за ответ, также я извиняюсь за ссылку, моей первоначальной мыслью было включить ее как встроенное изображение, но, поскольку у меня нет достаточного статуса, я автоматически прибегнул к ссылке. Что касается проблемы, я не знаю границ конфликта, будет ли приемлема вся моя грамматика? Это 6 строк меньше 100. Я не ожидаю полного решения грамматики, я просто хочу более тщательно понять методологию их решения.   -  person Hacker Zen    schedule 08.03.2018
comment
Обычно этот конкретный конфликт S/R возникает из-за чего-то вроде Block ::= VariableDeclStar StatementStar, где оператор также может начинаться с идентификатора. Парсеры «снизу вверх» могут работать с двумя продуктами, начинающимися с одного и того же токена; это конфликт предсказаний, и он влияет только на синтаксические анализаторы сверху вниз (LL). Есть несколько ответов SO об этой проблеме. Вы должны попытаться найти минимальное подмножество вашей грамматики, которое может быть обработано как полная грамматика и которое демонстрирует конфликт. В процессе добавления правил к текущей выписке вы, скорее всего, сами обнаружите проблему.   -  person rici    schedule 08.03.2018
comment
Вот, возможно, релевантный ответ: stackoverflow.com/questions/28665795/. Или stackoverflow.com/questions/43579367/shift-reduce-conflict/ . Или, возможно, stackoverflow.com/questions/25185601 /   -  person rici    schedule 08.03.2018