|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Нейтрализация семантических ошибок
Под семантическими ошибками, обнаруженными в процессе компиляции, понимаются ошибки, связанные с некорректным использованием идентификаторов и выражений. При этом важно уметь подавлять лишние или повторные сообщения об ошибках. Во многих случаях, когда неправильно используется идентификатор, достаточно вывести сообщение об ошибке и продолжить компиляцию. Например, если анализируется оператор A:=B; где A – переменная типа REAL, а B – переменная типа BOOLEAN, то мы можем просто сообщить о несовместимости типов для A и B в операторе присваивания и продолжить работу, так как нет необходимости связывать с нетерминалом <инструкция присваивания> какую либо “семантику” и, следовательно, лишние сообщения выводится не будут. Рассмотрим теперь переменную с индексами A[e1, ¼, en], когда с идентификатором связана некоторая “структура”. Положим, что в программе A не объявлено, как массив. Тогда будет выдано сообщение об ошибке и продолжится грамматический разбор индексов. После окончания разбора индексов их число будет сравниваться с размерностью массива, которая указана в элементе таблицы идентификаторов для A. Так как A не имя массива, то появится второе сообщение об ошибке. Такую ошибку можно довольно просто нейтрализовать и подавить лишние сообщения, относящиеся к данному идентификатору, если заменить его в исходной программе “корректным” идентификатором. В таблицу идентификаторов заносится новый корректирующий элемент с правильными, насколько это возможно, атрибутами. Программе, формирующей сообщения об ошибке, передается в качестве параметра указатель элемента таблицы идентификаторов, который вызвал ошибку. Программа проверяет, не является ли этот элемент корректирующим идентификатором, вставленным для нейтрализации ранее обнаруженной ошибки, и если это так, то лишнее сообщение об ошибке не формируется. Если неописанный или неверно описанный идентификатор встречается в нескольких местах программы, то повторные сообщения можно легко устранить, используя подход, приведенный выше. Можно также с каждым элементом таблицы идентификаторов, связать список элементов, описывающих все разновидности некорректного использования этого идентификатора. Если идентификатор используется неправильно, то нужно просмотреть этот список, и если ранее встречалась такая же некорректность, то выводить повторное сообщение об ошибке не следует. Если раньше такой вид некорректности использования не встречался, то выдается сообщение об ошибке и эта новая некорректность добавляется в список. Если у программиста возникнет желание точно знать все места некорректного использования идентификатора, то количество сообщений тоже можно сократить, добавив к каждому элементу списка, описывающего некорректное использование идентификатора, перечень номеров строк исходной программы, где эта некорректность встречается. После того как анализ завершен, каждое сообщение можно вывести только один раз, сопроводив его перечнем номеров строк, в которых встретилась данная ошибка. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |