У меня возникла небольшая проблема при попытке выяснить, как разрешить конфликт в моем проекте синтаксического анализатора CUP. Я понимаю, почему возникает ошибка, первый терминал VariableDeclStar может быть ID, а также Type, что вызывает конфликт, однако я не могу понять, как разрешить конфликт таким образом, чтобы сохранить Type и Variable как отдельные состояния. Любая помощь или советы будут оценены.
VariableDecl ::= Variable SEMICOLON {::};
Variable ::= Type ID {::};
Type ::= INT {::}
| DOUBLE {::}
| BOOLEAN {::}
| STRING {::}
| Type LEFTBRACKET RIGHTBRACKET {::}
| ID {::};
VariableDeclStar::= VariableDecl VariableDeclStar {::}
| {::};
Block ::= VariableDeclStar StatementStar
, где оператор также может начинаться с идентификатора. Парсеры «снизу вверх» могут работать с двумя продуктами, начинающимися с одного и того же токена; это конфликт предсказаний, и он влияет только на синтаксические анализаторы сверху вниз (LL). Есть несколько ответов SO об этой проблеме. Вы должны попытаться найти минимальное подмножество вашей грамматики, которое может быть обработано как полная грамматика и которое демонстрирует конфликт. В процессе добавления правил к текущей выписке вы, скорее всего, сами обнаружите проблему. - person rici   schedule 08.03.2018