В ходе семантического анализа необходимо проверять ряд правил построения входной программы, которые невозможно описать с помощью КС-грамматик. Эти правила имеют общий характер и не отражают содержания задач, выраженных в форме предложений входного языка. Фактически эти правила характеризуют синтаксис входного языка в широком смысле слова и не затрагивают свойства программ, которые характеризуют задачи, реализованные с помощью этих программ. Такие правила называются семантическими соглашениями входного языка или контекстными условиями. Приведем несколько общих примеров типичных контекстных условий, определяющих свойства входных языков программирования [8].
1) Условие единственности описания идентификаторов, именующих следующие объекты в блоке: простые переменные, массивы, процедуры, метки. Кроме того, формальный параметр процедуры не должен входить более одного раза в список формальных параметров, список значений и список спецификаций.
2) Условие соответствия между определяющими и использующими вхождениями идентификаторов. Определяющим называется вхождение идентификатора в конструкцию, которая описывает этот идентификатор. Например, идентификатор метки помеченного оператора имеет определяющее вхождение, а идентификатор в операторе перехода goto — использующее. Идентификаторы переменных, входящие в некоторое выражение, или оператор присваивания имеют также использующее вхождение. Условие соответствия выполняется, если для использующего вхождения найдено определяющее вхождение идентификатора. Алгоритмы поиска определяющих вхождений называются алгоритмами идентификации. Для программ с блочной структурой действия алгоритма идентификации заключается в поиске определяющего вхождения идентификатора в минимальном блоке, содержащем использующие вхождения. В случае неудачи поиск выполняется в минимальном блоке, охватывающем уже рассмотренный и т.д. Если в программе не найдено определяющее вхождение и в языке не используется правило определения идентификаторов по умолчанию, то условие считается не выполненным.
Контекстные условия для формальных параметров процедур определяются следующим образом: идентификатор описывается либо в блоке, представляющем тело процедуры, либо в минимальном блоке, охватывающем описание процедуры, либо может входить в список формальных параметров. Каждому вхождению идентификатора в списке спецификаций должно соответствовать его вхождение в списке формальных параметров, и идентификатор, входящий в список значений, должен входить в список спецификаций. Алгоритмы идентификации помимо проверки условий соответствия осуществляют сбор информации об объектах программы. Эта информация затем используется для правильного построения фрагментов объектной программы с учетом контекстных условий.
3) Условие соответствия видов значений. Эти условия регламентируют соответствие видов величин, входящих в синтаксические конструкции программы. Например, операндами в арифметических выражениях могут быть только числовые константы, идентификаторы арифметических переменных, указатели арифметических функций, не допускается смешивать различные арифметические виды значений и т.д. При переводе операторов процедур-функций проверяется соответствие типов значений фактических и формальных параметров, их количественное равенство.
Следует отметить важность контекстных условий соответствия типов значений. Например, в языках Паскаль, Си и другие, в которых множество типов бесконечно, существуют различные способы конструирования новых типов из элементарных. Поэтому проверку соответствия типов значений в этих языках выполнять значительно сложнее.
4) Условие, определяющее количественные ограничения. Эти условия связаны с ограничениями, накладываемыми конкретной разработкой транслятора для входного языка (например, ограничиваются глубина вложенности блоков, число размерностей используемых массивов и т.д.).