Определенно не следует добавлять выдачу ошибок для каждого нетерминала.
Ресинхронизация работает, когда есть какой-то токен, который обычно сбрасывает контекст анализа в известное состояние.В языках с четким маркером конца оператора - точка с запятой в приведенном вами примере - этот маркер работает как точка ресинхронизации.Сброс текста до следующей точки с запятой и последующий синтаксический анализ оттуда не будет работать 100% времени, но он работает во многих случаях.
Круглые скобки и скобки также могут использоваться в качестве точек ресинхронизации, но эвристическийне так надежно, потому что многие синтаксические ошибки являются результатом несовпадающих скобок или скобок.Например, поиск отсутствующей закрывающей скобки может отбросить весь ввод, например.
Ресинхронизация более сложна в случае языков без четких разделителей операторов, включая такие языки, как Python, где символ новой строки завершает операторы только в том случае, если они не являются вложенными.в скобках.Отмена до новой строки может работать, но вам, возможно, придется иметь дело с обратной связью между сканером и анализатором, которая определяет, когда новая строка передается как токен, а когда пропускается как пробел.
Несогласованный отступполезный триггер ресинхронизации с парой предостережений.Во-первых, вы не должны отклонять допустимый ввод с «вводящим в заблуждение» отступом, поэтому триггер должен быть более чувствительным при повторной синхронизации, чем при обычном разборе.Во-вторых, для отслеживания несовместимых отступов обязательно требуется обратный канал синтаксического анализатора.Таким образом, это больше, чем простое восстановление от паники, но оно может быть эффективным.
Суть в том, что существует несколько универсальных алгоритмов для хороших отчетов об ошибках и восстановления, если они вообще есть.Вы должны основывать свою стратегию на синтаксической природе языка.
В идеале, вы захотите усовершенствовать код, изучив реакцию вашего синтаксического анализатора на распространенные ошибки, но в действительности это невозможно сделать, пока у вас нетфактическое развертывание и можно увидеть, каковы распространенные ошибки.Поэтому лучший совет, который я могу дать, - начать с простой стратегии восстановления и посмотреть, как она работает с различными синтаксическими ошибками, особенно с ошибками синтаксиса, которые вы случайно создали (или с ошибками ваших друзей и соавторов).Сохраните архив различных встреченных синтаксических ошибок, которые можно использовать для проверки улучшений кода диагностики и восстановления.Не ожидайте, что он будет идеальным, поскольку это трудная проблема, но постарайтесь сделать его более точным, когда сможете.