Обработка синтаксических ошибок 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Обработка синтаксических ошибок



Если компилятор будет иметь дело исключительно с корректными программа­ми, его разработка и реализация существенно упрощаются. Однако от компиля­тора ожидается, что он будет помогать программисту обнаруживать и устранять ошибки, которые неизбежно содержатся в программах несмотря на огромные усилия даже самых квалифицированных программистов. Примечательно, что хо­тя ошибки явление чрезвычайно распространенное, лишь в нескольких языках вопрос обработки ошибок рассматривался еще на фазе проектирования языка. Наша цивилизация была бы совсем другой, если бы в естественных языках были такие же требования к синтаксической точности, как и в языках программиро­вания. Большинство спецификаций языков программирования, тем не менее, не определяет реакции компилятора на ошибки — этот вопрос отдается на откуп разработчикам компилятора. Однако планирование системы обработки ошибок с самого начала работы над компилятором может как упростить его структуру, так и улучшить его реакцию на ошибки.

Ошибки в программе могут быть на самых разных уровнях.

· Лексические ошибки включают неверно записанные идентификаторы, клю­чевые слова или операторы, например использование идентификатора elipseSize вместо ellipseSize или отсутствие кавычек вокруг тек­ста, являющегося строкой.

· Синтаксические ошибки включают неверно поставленные точки с запя­той или лишние или недостающие фигурные скобки { или }. В качестве еще одного примера в С или Java синтаксической ошибкой является кон­струкция case без охватывающего switch (однако эта ситуация часто пропускается синтаксическим анализатором и перехватывается позже, на уровне генерации кода).

· Семантические ошибки включают несоответствие типов операторов и их операндов. В качестве примера можно привести оператор return со зна­чением в методе Java, возвращающем тип void.

· Логические ошибки могут быть любыми — от неверных решений программиста до использования в программе на языке С оператора присваивания = вмесго оператора сравнения ==. Программа, содержащая оператор, может быть корректной, но делать совсем не то, чего хотел от нее программист.

Точность современных методов разбора позволяет очень эффективно выявлять синтаксические ошибки в программе. Некоторые методы синтаксического анали­за, такие как LL- и LR-, обнаруживают ошибки на самых ранних стадиях, т.е. когда разбор потока токенов от лексического анализатора в соответствии с граммати­кой языка становится невозможен. Говоря более точно, они обладают свойством корректного префикса (viable-prefix property), т.е. они обнаруживают ошибку, как только встречают префикс, который не может быть префиксом ни одной коррект­ной строки данного языка.

Еше одна причина, по которой делается упор на восстановление после ошиб­ки в процессе синтаксического анализа, — многие ошибки, чем бы они ни были вызваны, оказываются синтаксическими и выявляются при дальнейшей невоз­можности синтаксического анализа. Эффективно обнаруживаются и некоторые семантические ошибки, такие как несоответствие типов. Однако в обшем случае точное определение семантических и логических ошибок во время компиляции является крайне трудной задачей.

Обработчик ошибок синтаксического анализатора имеет очень просто форму­лируемые, но очень сложно реализуемые цели:

• он должен ясно и точно сообщать о наличии ошибок;

• он должен обеспечивать быстрое восстановление после ошибки, чтобы продолжить поиск других ошибок;

• он не должен существенно замедлять обработку корректной программы.

К счастью, обычные ошибки достаточно просты, и для их обработки часто достаточно относительно простых механизмов обработки ошибок.

Каким образом обработчик ошибок должен сообщить об обнаруженных непри­ятностях? Самое меньшее, что он должен сделать, — указать место в исходной программе, где выявлена ошибка, поскольку, скорее всего, реальная ошибка на­ходится несколькими токенами ранее. Распространенная стратегия заключается в том, чтобы вывести проблемную строку с указателем позиции, в которой обна­ружена ошибка.



Поделиться:


Последнее изменение этой страницы: 2021-03-09; просмотров: 79; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.220.114 (0.006 с.)