
- •Задание на курсовую работу: «синтаксически управляемый анализ семантики идентификаторов в текстах программ»
- •Некоторые теоретические сведения о семантическом анализе с использованием грамматики свойств
- •Пример формального описания синтаксиса и семантики языка Неформальное описание языка
- •Список семантических ошибок, подлежащих обнаружению
- •Описание грамматики свойств
- •Тестовый пример
- •Комментарии к тестовому примеру
- •Некоторые практические рекомендации Общие рекомендации
- •Рекомендации по использованию Flex-Bison в курсовом проектировании
- •Содержание пояснительной записки
- •Библиографический список
- •Приложение 1 Синтаксический анализ с использованием детерминированного автомата с магазинной памятью
- •Lr(1)-реализация алгоритма «сдвиг-приведение»
- •Восходящий разбор с использованием грамматики простого предшествования
- •Приложение 2 Примеры тестов для вариантов задания на курсовую работу
- •Приложение 3 График выполнения курсовой работы
- •Содержание
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
Санкт-Петербургский государственный университет
аэрокосмического приборостроения
ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ
Методические указания к выполнению курсовой работы
Санкт-Петербург
2011
Составитель: Т.М.Максимова
Рецензент: к.ф.-м.н., доцент В.А Костин (Санкт-Петербургский государственный университет)
В методические указания включены постановка задачи на курсовое проектирование, необходимые теоретические сведения и рекомендации по методике выполнения задания.
Методические указания предназначены для студентов специальностей 230105 – «Программное обеспечение вычислительной техники и автоматизированных систем» и 010503 – «Математическое обеспечение и администрирование информационных систем», изучающих дисциплину «Теория языков программирования и методы трансляции».
Методические указания подготовлены на кафедре компьютерной математики и программирования и рекомендованы к изданию редакционно-издательским советом Санкт-Петербургского государственного университета аэрокосмического приборостроения.
Задание на курсовую работу: «синтаксически управляемый анализ семантики идентификаторов в текстах программ»
В теоретическом и практическом разделах дисциплины «Теория языков программирования и методы трансляции» рассматриваются различные методы решения задачи синтаксического анализа, использующего формальные описания языков; лабораторный практикум предусматривает программирование некоторых алгоритмов решения такой задачи. На этапе курсового проектирования, как заключительном в изучении этой дисциплины, предлагается усложнить задачу синтаксического анализа подключением к ней частичного анализа семантики. В этом усложненном варианте задача облекается в следующую формулировку.
Разработайте программу синтаксического и семантического анализа для подмножества языка программирования, определенного вариантом задания. (Выбор подмножества языка согласуйте с преподавателем). Синтаксический разбор реализуйте с использованием детерминированного автомата с магазинной памятью. Семантические аспекты опишите грамматикой свойств. На семантический анализ возложите проверку правомерности использования идентификаторов с точки зрения их описания.
Варианты исходных языков: Pascal, C, Java, Flex, Perl, Lisp, Prolog, Matlab, Visual Basic, Shell.
Некоторые теоретические сведения о семантическом анализе с использованием грамматики свойств
Описывающая синтаксис языка
контекстно-свободная грамматика
(КС-грамматика) может использоваться
не только для синтаксического анализа
текста, но и для управления процессом
его трансляции, если снабдить ее
семантическими правилами, учитывающими
контекстно-зависимые свойства языка.
Такое приписывание семантических правил
может быть выполнено в рамках так
называемой атрибутной грамматики [1].
Атрибутной грамматикой называют
КС-грамматику, символы которой связаны
с атрибутами, описывающими
контекстно-несвободные аспекты языка.
Связывание выполняется в контексте
порождающих правил КС-грамматики. С
помощью атрибутов информация может
передаваться как от символа левой части
правила к символам правой части правила
(такие атрибуты называются наследуемыми),
так и в обратном направлении: от символов
правой части правила к символу левой
части правила (такие атрибуты называются
синтезируемыми). Во втором случае способ
определения синтезируемого атрибута
может быть зафиксирован с помощью
функции, заданной для всех правил
КС-грамматики. А именно: правилу вида
A::=X1…Xn,
имеющему номерi,
ставится в соответствие функция,
аргументами которой являются атрибуты
символовX1,…,Xnправой части правила, а значением –
атрибут символаAлевой части правила. В работе [2] описан
один из частных видов атрибутной
грамматики с синтезируемыми атрибутами,
названный грамматикой свойств. Функция
грамматики свойств задается в табличной
форме.
Инструмент грамматики свойств, как и любой атрибутной грамматики, позволяет во время выполнения синтаксического разбора производить некоторые действия семантического анализа. Одним из наиболее эффектных применений этого инструмента является анализ соответствий описаний и использований символьных имен, идентификаторов. Такие соответствия, очевидно, представляют собой контекстно-несвободные свойства языка, т.е. не могут быть описаны только средствами КС-грамматик. Для решения этой задачи с использованием грамматики свойств в процессе синтаксического разбора с каждой вершиной дерева разбора следует связать таблицу атрибутов – свойств идентификаторов. (Запись таблицы содержит, как минимум, два поля: поле идентификатора и поле свойства идентификатора). Если по окончании восходящего разбора с корнем дерева (аксиомой грамматики) связалась таблица, содержащая только свойства из заранее определенного множества допустимых свойств, разобранный текст можно считать семантически корректным. Вывод о семантической некорректности текста может быть сделан в двух ситуациях:
- таблица свойств не может быть построена
для внутренней вершины дерева разбора
в силу некорректности последовательности
таблиц, связанных с непосредственными
потомками этой вершины (значение функцииот аргументов-атрибутов символов правой
части правила не определено);
- таблица свойств, связанная с корнем дерева разбора, содержит свойства, не принадлежащие множеству допустимых свойств.
Грамматика свойств [2] задается восьмеркой
компонент: G(V,T,P,S,,
,
,
),
где
(V,T,P,S)– КС- грамматика (V– множество нетерминальных символов, T – множество терминальных символов, P– множество порождающих правил, S- аксиома);
– множество свойств,
– нейтральное свойство(
),
– множество допустимых свойств (
),
–
функция, определяющая отображение изP×
* в
(A*
- множество слов, составленных из
символов алфавитаA,
и пустая строка).
С помощью функции
определяется свойство, связываемое с
внутренней вершиной дерева разбора, в
зависимости от свойств потомков этой
вершины. Значения
(p,ℓ)
задаются таблично для каждогоpP.
При этом длина строкиℓсвойств
равна длине правой части правилаp,
сама строкаℓявляется строкой
свойств, связанных с символами правой
части этого правила, значение функции
равно свойству, связываемому с нетерминалом
левой части правилаp,
и таблица, соответствующая правилуp,
содержит только такие строкиℓ, для
которых значение
(p,ℓ)
определено.
Пусть грамматика, описывающая некоторый язык, в частности, содержит правила:
<описания>::=вещественное<список имен>
<список имен>::=<список имен>,идентификатор
<список имен>::=идентификатор
Словом идентификаторздесь обозначен терминальный для данной грамматики символ, представляющий собой код лексемы (токен) типа «идентификатор», которая распознается на этапе лексического анализа.
Пусть, например, идентификатор в таблицах
имен, связываемых с вершинами дерева
разбора, может приобретать свойства
:
нейтральное свойство (не имеет никакого отношения к символу вершины дерева),
упоминается здесь,
появляется в списке имен,
объявляется переменной вещественного типа.
Будем теперь руководствоваться этим
списком для задания значений атрибутов:
они будут определяться своими номерами
в списке. Это означает, что в виде своих
номеров будут храниться свойства
идентификаторов в таблицах свойств, и
в виде номеров свойств будут представлены
значения аргумента ℓи значения
функции
.
Функция
для приведенных трех правил
грамматики может быть задана следующими
тремя таблицами:
ℓ |
|
00 |
0 |
02 |
3 |
ℓ |
|
000 |
0 |
200 |
2 |
001 |
2 |
ℓ |
|
0 |
0 |
1 |
2 |
Длина строк ℓв таблице для
(i,ℓ)
равна двум, поскольку правая часть
правилаiсостоит из
двух символов. Первый из этих символов
является терминалом (вещественное),
с которым не может быть связано никакое
свойство, кроме нейтрального, никакого
идентификатора. Этим объясняются
значения 0 в первых разрядах строкℓдля таблицы
(i,ℓ).
Второй разряд соответствует нетерминальному
символу <список имен>, и он может
иметь значения 2 или 0, в зависимости от
того, был ли замечен идентификатор в
списке имен. Если был замечен (строка
02), то с нетерминалом левой части правила
(<описания>) следует связать новое
свойство идентификатора: объявляется
переменной вещественного типа. Это
свойство имеет номер 3, который и стал
значением функции
(i,02).
Таблицы для
(ii,ℓ)
и для
(iii,ℓ)
показывают, каким образом идентификатор
может появиться в списке имен (приобрести
свойство 2). Следует особо отметить, что
значение функции
(ii,ℓ)
для строкиℓ=201 не определено. Это
означает, что идентификатору не разрешено
появляться в списке имен два и более
раз.
Примером правильной строки, с точки зрения вышеприведенных правил, может быть (из соображений наглядности примера терминалы идентификаторизобразим в виде двух разных лексем-идентификаторов):
вещественное а,в
На рис.1 приведено дерево разбора этой строки с таблицами свойств, приписанными вершинам дерева.
<описания> [а:3,в:3]
вещественное[а:0,в:0] <список имен>[а:2,в:2]
<список имен>[а:2,в:0] ,[a:0,b:0] в[а:0,в:1]
а[а:1,в:0]
Рис.1. Дерево разбора с таблицами свойств
Поскольку синтезируемыми атрибутами
информация передается от правой части
правила к левой, ими удобно пользоваться
при выполнении восходящего разбора.
Алгоритм типа «сдвиг-приведение» [3]
восходящего разбора можно взять за
основу синтаксически управляемой
трансляции. Записи стека, с которым
работает такой алгоритм, следует
дополнить полями со значениями атрибутов.
Для грамматики свойств такое поле может,
например, содержать ссылку на таблицу
свойств. Выполнение операции приведения
(замены правой части правила, размещенной
в верхней части стека, на нетерминал
левой части этого правила) должно
сопровождаться вычислением значения
функции
для этого правила и занесением
вычисленного значения в таблицу свойств
в качестве атрибута нетерминала, на
который заменена правая часть правила,
если только это значение не оказалось
нейтральным свойством. Процессу неявного
построения дерева, приведенного на
рис.1, алгоритмом «сдвиг-приведение»
соответствует следующая последовательность
состояний стека:
|
|
сдвиг |
|
|
приведение |
|
|
|
а |
|
|
в |
|
[] |
вещественное |
|
[]по правилуiii |
|
|
сдвиг |
, |
|
[] сдвиг |
|
<список имен> |
|
|
<список имен> |
|
|
|
вещественное |
|
[] |
вещественное |
|
[] |
|
в |
|
[в:1] приведение |
|
|
приведение |
, |
|
|
|
|
|
<список имен> |
|
[а:2]по правилуii |
<список имен> |
|
[а:2,в:2] по правилуi |
вещественное |
|
[] |
вещественное |
|
[] |
|
|
|
<описания> |
|
[а:3,в:3] |
Рис.2. Последовательность состояний стека при восходящем разборе
Еще одним примером синтаксически
правильной, с точки зрения рассматриваемой
КС-грамматики, строкой является строка
вещественное а,a.
Для нее можно построить дерево разбора,
аналогичное приведенному на рис.1, а
процесс ее разбора можно проиллюстрировать
схемой, аналогичной схеме, приведенной
на рис.2. Однако в момент выполнения
операции приведения по правилуiiпопытка вычислить значение функции
(ii,ℓ)
для строкиℓ=201 свойств идентификатораaпозволит обнаружить
семантическую ошибку, заключающуюся в
повторном описании этого идентификатора.