Производство ошибок - это восстановление после ошибки, чтобы попытаться продолжить обработку ввода, а не печать разумных или полезных сообщений об ошибках. Поэтому их следует использовать в точках грамматики, где вполне вероятно, что вы сможете правильно распознать и повторно синхронизировать входной поток. Например, если ваш язык состоит из последовательности конструкций, заканчивающихся символами ;
, хорошим производством ошибок будет что-то вроде construct: error ';'
, которое будет восстанавливаться после ошибок в construct
(что бы это ни было), пропуская вперед в введите ;
и попытайтесь продолжить оттуда.
Ввод многих правил восстановления после ошибок - это вообще плохая идея, поскольку парсер будет восстанавливать только самый близкий, и его часто самые глобальные на верхнем уровне, которые, скорее всего, будут полезны и пытаются использовать более тонкую детализацию просто приведет к каскаду ошибок, поскольку правила восстановления ошибок не могут правильно синхронизироваться с вводом.