Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебные пособия / ТЯПиМТ / новая курсовая работа.doc
Скачиваний:
63
Добавлен:
02.04.2015
Размер:
501.25 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

Санкт-Петербургский государственный университет

аэрокосмического приборостроения

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

Методические указания к выполнению курсовой работы

Санкт-Петербург

2011

Составитель: Т.М.Максимова

Рецензент: к.ф.-м.н., доцент В.А Костин (Санкт-Петербургский государственный университет)

В методические указания включены постановка задачи на курсовое проектирование, необходимые теоретические сведения и рекомендации по методике выполнения задания.

Методические указания предназначены для студентов специальностей 230105 – «Программное обеспечение вычислительной техники и автоматизированных систем» и 010503 – «Математическое обеспечение и администрирование информационных систем», изучающих дисциплину «Теория языков программирования и методы трансляции».

Методические указания подготовлены на кафедре компьютерной математики и программирования и рекомендованы к изданию редакционно-издательским советом Санкт-Петербургского государственного университета аэрокосмического приборостроения.

Задание на курсовую работу: «синтаксически управляемый анализ семантики идентификаторов в текстах программ»

В теоретическом и практическом разделах дисциплины «Теория языков программирования и методы трансляции» рассматриваются различные методы решения задачи синтаксического анализа, использующего формальные описания языков; лабораторный практикум предусматривает программирование некоторых алгоритмов решения такой задачи. На этапе курсового проектирования, как заключительном в изучении этой дисциплины, предлагается усложнить задачу синтаксического анализа подключением к ней частичного анализа семантики. В этом усложненном варианте задача облекается в следующую формулировку.

Разработайте программу синтаксического и семантического анализа для подмножества языка программирования, определенного вариантом задания. (Выбор подмножества языка согласуйте с преподавателем). Синтаксический разбор реализуйте с использованием детерминированного автомата с магазинной памятью. Семантические аспекты опишите грамматикой свойств. На семантический анализ возложите проверку правомерности использования идентификаторов с точки зрения их описания.

Варианты исходных языков: Pascal, C, Java, Flex, Perl, Lisp, Prolog, Matlab, Visual Basic, Shell.

Некоторые теоретические сведения о семантическом анализе с использованием грамматики свойств

Описывающая синтаксис языка контекстно-свободная грамматика (КС-грамматика) может использоваться не только для синтаксического анализа текста, но и для управления процессом его трансляции, если снабдить ее семантическими правилами, учитывающими контекстно-зависимые свойства языка. Такое приписывание семантических правил может быть выполнено в рамках так называемой атрибутной грамматики [1]. Атрибутной грамматикой называют КС-грамматику, символы которой связаны с атрибутами, описывающими контекстно-несвободные аспекты языка. Связывание выполняется в контексте порождающих правил КС-грамматики. С помощью атрибутов информация может передаваться как от символа левой части правила к символам правой части правила (такие атрибуты называются наследуемыми), так и в обратном направлении: от символов правой части правила к символу левой части правила (такие атрибуты называются синтезируемыми). Во втором случае способ определения синтезируемого атрибута может быть зафиксирован с помощью функции, заданной для всех правил КС-грамматики. А именно: правилу вида A::=X1Xn, имеющему номер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,ℓ) определено.

Пусть грамматика, описывающая некоторый язык, в частности, содержит правила:

  1. <описания>::=вещественное<список имен>

  2. <список имен>::=<список имен>,идентификатор

  3. <список имен>::=идентификатор

Словом идентификаторздесь обозначен терминальный для данной грамматики символ, представляющий собой код лексемы (токен) типа «идентификатор», которая распознается на этапе лексического анализа.

Пусть, например, идентификатор в таблицах имен, связываемых с вершинами дерева разбора, может приобретать свойства :

  1. нейтральное свойство (не имеет никакого отношения к символу вершины дерева),

  2. упоминается здесь,

  3. появляется в списке имен,

  4. объявляется переменной вещественного типа.

Будем теперь руководствоваться этим списком для задания значений атрибутов: они будут определяться своими номерами в списке. Это означает, что в виде своих номеров будут храниться свойства идентификаторов в таблицах свойств, и в виде номеров свойств будут представлены значения аргумента и значения функции .

Функция для приведенных трех правил грамматики может быть задана следующими тремя таблицами:

(i,ℓ)

00

0

02

3

(ii,ℓ)

000

0

200

2

001

2

(iii,ℓ)

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, алгоритмом «сдвиг-приведение» соответствует следующая последовательность состояний стека:

сдвиг

приведение

а

[а:1]

вещественное

[]

вещественное

[]по правилуiii

сдвиг

,

[] сдвиг

<список имен>

[а:2]

<список имен>

[а:2]

вещественное

[]

вещественное

[]

в

[в:1] приведение

приведение

,

[]

<список имен>

[а:2]по правилуii

<список имен>

[а:2,в:2] по правилуi

вещественное

[]

вещественное

[]

<описания>

[а:3,в:3]

Рис.2. Последовательность состояний стека при восходящем разборе

Еще одним примером синтаксически правильной, с точки зрения рассматриваемой КС-грамматики, строкой является строка вещественное а,a. Для нее можно построить дерево разбора, аналогичное приведенному на рис.1, а процесс ее разбора можно проиллюстрировать схемой, аналогичной схеме, приведенной на рис.2. Однако в момент выполнения операции приведения по правилуiiпопытка вычислить значение функции (ii,ℓ) для строки=201 свойств идентификатораaпозволит обнаружить семантическую ошибку, заключающуюся в повторном описании этого идентификатора.

Соседние файлы в папке ТЯПиМТ