Какова стратегия добавления продуктов ошибок в грамматику?

Как обычно добавляются ошибки? Я столкнулся с проблемой, что мои продукты ошибок слишком поверхностны: когда синтаксический анализатор начинает выталкивать состояния ошибки в операторе, он всплывает, пока не столкнется с выводом ошибок для раздела, в котором он находится, и выводит недопустимую ошибку сообщение.

Будет хорошей идеей просто добавить описательную ошибку для каждого нетерминала?


person Alex    schedule 04.05.2011    source источник


Ответы (1)


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

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

person Chris Dodd    schedule 04.05.2011
comment
Кроме того, правило construct: error ';' должно иметь действие, которое вызывает yyerrok; для вывода синтаксического анализатора из режима исправления ошибок. - person Kaz; 10.07.2014
comment
@Kaz: yyerrok может быть полезен, но не обязателен - его использование означает, что если сразу после этой ошибки произойдет другая ошибка, она не будет проигнорирована (поэтому будет выдано другое сообщение об ошибке синтаксиса), что может быть или не быть тем, что вы хотите . Без него вам нужно будет сдвинуть еще 2 жетона (3, включая ;), чтобы выйти из режима исправления ошибок. - person Chris Dodd; 11.07.2014