М.Ю. Харламов, ВНУ им. В.Даля, 2010
Семантический анализатор Семантический анализатор выполняет следующие основные действия: проверку соблюдения во входной программе семантических соглашений входного языка дополнение внутреннего представления программы в компиляторе операторами и действиями, неявно предусмотренными семантикой входного языка проверку элементарных семантических (смысловых) норм языков программирования, напрямую не связанных со входным языком Тема 7. Семантический анализ 2
3 Семантический анализатор Таблица идентификаторов Результаты синтаксического анализа Результаты проверки семантической правильности программы
каждая метка, на которую есть ссылка, должна один раз присутствовать в программе каждый идентификатор должен быть описан один раз и ни один идентификатор не может быть описан более одного раза (с учетом блочной структуры описаний) все операнды в выражениях и операциях должны иметь типы, допустимые для данного выражения или операции типы переменных в выражениях должны быть согласованы между собой при вызове процедур и функций число и типы фактических параметров должны быть согласованы с числом и типами формальных параметров и т.д. Тема 7. Семантический анализ 4
5 a := b + c; Идентификаторы должны быть описаны a a не может быть константой Вид операции определяется типом аргументов (конкатенация или алгебр.сложение) Идентификаторы должны быть совместимы для использования операции + (или строковые, или числовые)
Cвязано с добавлением в текст программы операторов и действий, неявно предусмотренных семантикой входного языка преобразование типов операндов в выражениях и при передаче параметров в процедуры и функции операции вычисления адреса, когда происходит обращение к элементам сложных структур данных Тема 7. Семантический анализ 6
7 a := b + c; var а : double: b : integer; с : real; var а : double: b : integer; с : real; Исходный текст Код, порождаемый компилятором a := double( real(b) + c); Вариант разработчика a := double(b + trunc(c)); (Без использования явного преобразования типов) (С использованием явного преобразования типов)
Обеспечивает проверку компилятором соглашений, выполнение которых связано со смыслом как всей исходной программы в целом, так и отдельных ее фрагментов каждая переменная или константа должна хотя бы один раз использоваться в программе; каждая переменная должна быть определена до ее первого использования при любом ходе выполнения программы (первому использованию переменной должно всегда предшествовать присвоение ей какого-либо значения); результат функции должен быть определен при любом ходе ее выполнения каждый оператор в исходной программе должен иметь возможность хотя бы один раз выполниться; операторы условия и выбора должны предусматривать возможность хода выполнения программы по каждой из своих ветвей; операторы цикла должны предусматривать возможность завершения цикла … Тема 7. Семантический анализ 8
9 int f_test(int а) {int b, c; b = 0; c = 0; if (b=1) { return a;} c = a + b; } int f_test(int а) {int b, c; b = 0; c = 0; if (b=1) { return a;} c = a + b; }
Идентификация переменных, типов, процедур, функций и др. лексических единиц языков программирования это установление однозначного соответствия между лексическими единицами и их именами в тексте исходной программы имена лексических единиц не должны совпадать как между собой, так и с ключевыми словами синтаксических конструкций языка локальные переменные имеют область видимости Тема 7. Семантический анализ 10
На этапе семантического анализа каждой лексической единице языка дается уникальное имя в пределах всей исходной программы и потом используется при синтезе результирующей программы имена локальных переменных дополняются именами тех блоков (функций, процедур), в которых эти переменные описаны имена внутренних переменных и функций модулей исходной программы дополняются именами самих модулей имена процедур и функций, принадлежащих объектам (классам) в объектно-ориентированных языках программирования дополняются наименованиями типов объектов (классов), которым они принадлежат имена процедур и функций модифицируются в зависимости от типов их формальных аргументов и др. Тема 7. Семантический анализ 11