Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bolshakov_Poyasnitelnaya_zapiska.doc
Скачиваний:
29
Добавлен:
08.03.2015
Размер:
1.58 Mб
Скачать

2.2.2.1.6 Семантический анализ пользовательской программы

Во время построения транслятора языка семантические правила были заложены на двух этапах:

- на этапе описания грамматики (правила линковки);

- на этапе валидации языка.

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

В особую категорию правил стоит выделить семантические правила, касающиеся типизации параметров языка. Для упрощения данных правил при разработке транслятора была использован сторонний компонент TypeSystem [44], позволяющий задать набор типов для объектов дерева разбора, а также правила вывода соответствия этих типов. Система типов в общем смысле обычно состоит из следующих блоков:

- установка типа элементу языка;

- вычисления типа некоторого объекта в языке по известным типам его элементов;

- ограничения типа.

Внедрение в систему платформы для работы с системой типов позволяет повысить надежность и масштабируемость целевой системы. Наиболее наглядно возможности компонента TypeSystem представляет его программный интерфейс, используемый для задания системы типов (таблица 2.3).

2.2.2.1.7 Генерация кода на целевом языке

При генерации кода разработчику доступно дерево разбора (абстрактное синтаксическое дерево), поэтому используемый алгоритм генерации кода на языке С основывается на обходе дерева в глубину и генерации кода для каждого узла дерева. Стоит отметить, что для разработки собственного генератора в Eclipse возможно использовать не только императивный язык (Java), но также язык-надстройку Xtend [45]. Данный язык обладает большой библиотекой расширений Java, специализированной для генерации кода.

Таблица 2.3 – API компонента TypeSystem

Метод компонента TypeSystem

Назначение метода

useCloneAsType(TypeInstance)

создание типа и установление выбранного объекта как представителя типа во внутренних ресурсах файловой системы

declareSubtype(Type1,Type2)

установить Type1 как подтип типа Type2

useFixedType(Class1, Type1)

становить для объектов типа Class1 внутреннее представление типа Type1

useTypeOfFeature(Class1, Class1_feature1)

установить правила для вывода типа экземпляров класса Class1 как типа его свойства Class1_feature1

ensureOrderedCompatibility(Class1, Class1_feature1, Class1_feature2)

установить правило, ограничивающее свойства Class1_feature2 быть типов равным или ниже по иерархии чем Class1_feature1

ensureUnorderedCompatibility(Class1, Class1_feature1, Class1_feature2)

установить правило, ограничивающее Class1_feature2 быть типом, равным или ниже по иерархии чем Class1_feature1 или наоборот (чтобы была возможность вывести общий тип двух свойств, это например нельзя сделать для типов String и Integer, но возможно для Integer и Double).

computeCommonType(Class1, Class1_feature1, Class1_feature2)

собственно вычислить тип экземпляра объекта класса Class1 как супер-тип объектов классов его свойств Class1_feature1 и Class1_feature2

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]