4.1.1. Проверка контекстных условий

В ходе семантического анализа необходимо проверять ряд правил построе­ния входной программы, которые невозможно описать с помощью КС-грамма­тик. Эти правила имеют общий характер и не отражают содержания задач, выраженных в форме предложений входного языка. Фактически эти правила характеризуют синтаксис входного языка в широком смысле слова и не затра­гивают свойства программ, которые характеризуют задачи, реализованные с помощью этих программ. Такие правила называются семантическими согла­шениями входного языка или контекстными условиями. Приведем несколько общих примеров типичных контекстных условий, определяющих свойства вход­ных языков программирования [8].

1) Условие единственности описания идентификаторов, именующих следу­ющие объекты в блоке: простые переменные, массивы, процедуры, метки. Кроме того, формальный параметр процедуры не должен входить более одного раза в список формальных параметров, список значений и список спецификаций.

2) Условие соответствия между определяющими и использующими вхож­дениями идентификаторов. Определяющим называется вхождение идентифи­катора в конструкцию, которая описывает этот идентификатор. Например, идентификатор метки помеченного оператора имеет определяющее вхождение, а идентификатор в операторе перехода goto — использующее. Идентификато­ры переменных, входящие в некоторое выражение, или оператор присваива­ния имеют также использующее вхождение. Условие соответствия выполняется, если для использующего вхождения найдено определяющее вхождение иден­тификатора. Алгоритмы поиска определяющих вхождений называются алго­ритмами идентификации. Для программ с блочной структурой действия алгоритма идентификации заключается в поиске определяющего вхождения идентификатора в минимальном блоке, содержащем использующие вхожде­ния. В случае неудачи поиск выполняется в минимальном блоке, охватывающем уже рассмотренный и т.д. Если в программе не найдено определяющее вхождение и в языке не используется правило определения идентификаторов по умолчанию, то условие считается не выполненным.

Контекстные условия для формальных параметров процедур определяются следующим образом: идентификатор описывается либо в блоке, представляю­щем тело процедуры, либо в минимальном блоке, охватывающем описание про­цедуры, либо может входить в список формальных параметров. Каждому вхождению идентификатора в списке спецификаций должно соответствовать его вхождение в списке формальных параметров, и идентификатор, входящий в спи­сок значений, должен входить в список спецификаций. Алгоритмы идентифика­ции помимо проверки условий соответствия осуществляют сбор информации об объектах программы. Эта информация затем используется для правильного по­строения фрагментов объектной программы с учетом контекстных условий.

3) Условие соответствия видов значений. Эти условия регламентируют со­ответствие видов величин, входящих в синтаксические конструкции програм­мы. Например, операндами в арифметических выражениях могут быть только числовые константы, идентификаторы арифметических переменных, указате­ли арифметических функций, не допускается смешивать различные арифме­тические виды значений и т.д. При переводе операторов процедур-функций проверяется соответствие типов значений фактических и формальных пара­метров, их количественное равенство.

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

4) Условие, определяющее количественные ограничения. Эти условия свя­заны с ограничениями, накладываемыми конкретной разработкой транслятора для входного языка (например, ограничиваются глубина вложенности блоков, число размерностей используемых массивов и т.д.).