Научная статья на тему 'Метакомпилятор RV-грамматик'

Метакомпилятор RV-грамматик Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
174
60
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ДИАГРАММАТИКА / ВИЗУАЛЬНЫЕ ЯЗЫКИ / КОМПИЛЯТОРЫ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Афанасьев Александр Николаевич, Войт Николай Николаевич, Гайнуллин Ринат Фаязович, Бригаднов Сергей Игоревич, Хородов Виталий Сергеевич

Предложено описание правил графических конструкций языка UML, на основе которых разработан алгоритм автоматического синтеза RV-грамматик для анализа визуальных языков. Рассмотрена организация метакомпилятора, включающая парсер GoldParser

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Афанасьев Александр Николаевич, Войт Николай Николаевич, Гайнуллин Ринат Фаязович, Бригаднов Сергей Игоревич, Хородов Виталий Сергеевич

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Метакомпилятор RV-грамматик»

УДК 621.372

А. Н. АФАНАСЬЕВ, Н. Н. ВОЙТ, Р. Ф. ГАЙНУЛЛИН, С. И. БРИГАДНОВ, В. С. ХОРОДОВ, О. Г. ШАРОВ

МЕТАКОМПИЛЯТОР ЯУ-ГРАММАТИК1

Предложено описание правил графических конструкций языка иМЬ, на основе которых разработан алгоритм автоматического синтеза ЯУ-грамматик для анализа визуальных языков. Рассмотрена организация метакомпилятора, включающая парсер ОоЫРатзвт.

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

Введение

Для создания парсера или компилятора формального описания некоторого целевого языка используют программы класса метакомпилято-ров. Подавляющее большинство современных программ данного класса — это компиляторы парсеров. В качестве формального описания чаще всего используют запись языка в форме Бэ-куса-Наура (БНФ) - формальная система описания синтаксиса, в которой одни синтаксические конструкции последовательно определяются через другие. Идеальный компилятор компиляторов по БНФ-описанию и множеству инструкций целевой архитектуры генерирует готовый к применению компилятор. На практике современные компиляторы компиляторов плохо интерпретируют семантику целевого языка, поэтому при проектировании компилятора компиляторов стоит ожидать только синтаксически верной интерпретации языка.

Существует ряд компиляторов компиляторов, среди которых наиболее известны следующие: ANTLR [1], Bison [2], Coco/R [3], DMS Software Reengineering Toolkit [4], Lemon [5], YACC [6].

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

1Исследование выполнено при финансовой поддержке РФФИ в рамках научного проекта №15-07-08268 а.

© Афанасьев А. Н., Войт Н. Н., Гайнуллин Р. Ф., Бригаднов С. И., Хородов В. С., Шаров О. Г., 2016

Целью настоящей работы является разработка схемы метатрансляции RV-грамматик [7].

Этапы и схема метатрансляции

Процесс метакомпиляции состоит из следующих этапов:

1) лексический разбор описания диаграммного языка;

2) синтаксический разбор и построение дерева разбора;

3) анализ дерева разбора и построение промежуточной структуры грамматики в терминах языка спецификаций;

4) трансляция - преобразование внутреннего представления в термины RV-грамматики;

5) оптимизация и минимизация;

6) сохранение таблиц RV-грамматики в формате XML.

В процессе анализа описания диаграммного языка метакомпилятор формирует набор паро-сочетаний между терминальными символами языка, строит таблицу переходов автомата RV-грамматики и генерирует набор операций с памятью для контроля соответствия вложенности нетерминальных символов и блоков с количеством входов или выходов больше одного.

«Отделение» описания RV-грамматики от её анализатора позволяет использовать полученный XML-файл на разных платформах вне зависимости от того, с каким приложением интегрирован анализатор.

Метакомпилятор представляет собой консольное приложение, написанное на C# с использованием GOLD Parser Builder [8] для разбора языка метаописаний. Структура взаимодействия его компонентов в составе проекта показана на рис. 1.

Разбор диаграмм происходит с помощью RV-грамматик.

Грамматика языка спецификаций

л Описание

GOLD Parser грамматики

Builder правил

л

Таблица Компилятор

разбора языка —- языка

спецификаций спецификаций

ш

XML представление RV-

Ж.

Открытый код RV-анализатора

ж

Внешний целевой проект

Рис. 1. Структура метакомпилятора диаграммных языков

Правила описания синтаксиса языка диаграмм активности UML

Для описания конструкций языка (в качестве примера выбран UML) разработаны правила, расширяющие нотацию БНФ. Подобное расширение позволяет производить описание графических конструкций в виде, наиболее похожем на их визуальное представление. Правая часть правила разделяется на две группы - блоки и связи между ними. Связи, в свою очередь, делятся на внутренние, связывающие элементы внутри, и внешние, связывающие правило с «внешними» элементами.

Описание спецификаций диаграммных языков состоит из правил, содержащих имя нетерминального символа, следующего после зарезервированного слова Rule, перечисления набора терминальных и нетерминальных символов, входящих в правило, а также описания отношений между терминальными и нетерминальными символами внутри правила.

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

Первое правило описывает диаграмму в целом. Далее правила описывают множество допустимых блоков в диаграмме активности. Последнее правило «Продолжение» рекурсивно ссылается на себя, благодаря чему может содержать несколько параллельных ветвей «Блоки».

Синтез RV-грамматики производится в соответствии со следующими этапами:

1) построение квазитерминального алфавита;

2) построение множества имён правил;

3) анализ количественных характеристик правил (выборка элементов, имеющих более одно входа или выхода);

4) синтез операций с внутренней памятью.

5) на основе приведённых правил генерируются терминальные и квазитерминальные символы.

Построение квазитерминального алфавита

Квазитерминальный алфавит строится на основе части правила, начинающегося с Consist of. Построение происходит в два прохода: построение множества имён и фильтрация множества имён.

Во время первого прохода собираются все имена из правил. Для этого в каждом правиле из части Consist of строится множество используемых имён. Во время этого же прохода строится дополнительное множество имён правил. Для первого правила получим следующие множества (табл. 2).

После окончания первого прохода необходимо отфильтровать множество имён. Целевое отфильтрованное множество равно разности Множества имён и Множества правил. Таким образом формируется квазитерминальный алфавит блоков.

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

• обрабатываются правила Relation;

• выделяются все типы связей для их правила;

• добавляется квазитерминальный символ в алфавит.

В табл. 3 приведены терминальные и соответствующие квазитерминальные символы. Последняя строка табл. 3 соответствует случаю, когда анализатор не достигает конечного состояния, и во входном потоке нет символов для анализа. В процессе анализа правил присваиваются произвольные квазитерминальные символы (обычно a, b, c...). Для наглядности в табл. 3 приведены семантически понятные имена квазитерминальных символов.

Синтез операций с внутренней памятью

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

Конструкции диаграммы активности и метаописания их правил

Rule Диаграмма

Consist of Начало начало, Конец конец, Блоки блок Internal Relationships: блок.Вход = начало.Выход, блок.Выход = конец .Вход External Relationships:

Rule Блоки

Consist of Действие действие, Блоки блок Internal Relationships: блок.Вход = действие.Выход External Relationships: Блоки.Вход = действие. Вход, Блоки.Выход = блок.Выход

Rule Блоки

Consist of Блоки блок1, Блоки блок2, Условие условие , Слияние слияние

Internal Relationships: условие. Выход 1 = блок1.Вход, условие. Выход2 = блок2.Вход, слияние.Вход 1=Блок1.Вход, слияние .Вход2=Блок2.Вход

External Relationships: блоки.Вход = условие.Вход,

блоки.Выход = слияние.Выход_

Rule Блоки

Consist of Блоки блок, Распараллеливание распараллеливание, Слияние параллельных ветвей слияние, Продолжение продолжение

Internal Relationships: распаралеливание.Выход1 = блок.Вход, распараллеливание=продолжение. Вход, слияние =продолжение. Выход

External Relationships: блок.Вход =

распаралеливание.Вход, блок.Выход = слияние.Выход

Consist of Блоки блок, Распараллеливание распараллеливание, Слияние параллельных ветвей слияние, Продолжение продолжение

Internal Relationships: распараллеливание. Выход 1 = блок.Вход, распараллеливание=продолжение.Вход, слияние =продолжение .Выход

External Relationships: продолжение. Вход = распаралеливание, продолжение.Выход = Слияние

Таблица 2

Формирование квазитерминального алфавита

Правило Множество имён Множество имён правил

Rule Диаграмма Consist of Начало, Конец, Блоки Internal Relationships: External Relationships: Блоки.Вход = Начало.Выход, Блоки.Выход = Конец.Вход Начало, Конец, Блоки Диаграмма

i

1 1 ! г | !

1 1 ' продолжение |

1 1 . Г 1 1

1 " |

Г

1 ■ 1 ' 1 1

|блок продолжение

X i i

Терминальный и квазитерминальный алфавит

Терминальный символ Квазитерминальный символ Примечание

• A0 Начало диаграммы

• Ak Конец диаграммы

I | A Действие

О P Ветвление

S Объединение взаимоисключающих ветвей

]с R Параллельное выполнение действий

L Слияние выполнения параллельных ветвей

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

-!_► label Связь

0 Отсутствие связей меток

Таблица 4

Грамматика диаграммы активности UML

№ пп Комплекс Квазитерм Комплекс -преемник RV - отношение

1 Го label Гз 0

2 Г1 label Гз 0

3 Г2 labelP Гз W2{b'm)

4 labelw Гз W2(b2m)

5 labelR Гз W2(b3m)

6 labelL Гз W2(b 4m )/ W3(mt (2) == kt (3))

7 Гз A Г1 0

8 P Г1 Wx(tlm)

9 W Г2 W1(1t(1),t2m )/W2(et (1))

10 W Г2 W1(2t (1))/ W2(1t (1))

11 R Г1 i (k -1) W(t3m )/ W3(k > 1)

12 L Г2 W (1t (2), kt (3), t4m)/ W2(et (2))

13 L Г2 Wl(inc(mt(2)))/W3(mt(2) <kt(3))

14 Ak Гк 0

элемент. Если путей в правиле более одного, то возникает вопрос, когда заканчивается обработка одного правила и начинается обработка следующего.

Для контроля количества путей необходимо определить, сколько выходов имеет стартовый блок и сколько входных связей проанализировано в конечном блоке. Рассмотрим в качестве примера правило условного ветвления. В начале обработки правила в стек записывается вершина условия, в ленту в ячейку i, соответствующую номеру условной вершины, записывается число выходов из вершины (для нашего случая 2). При достижении точки слияния в ячейку j, соответствующую номеру слияния условных ветвей, записывается значение, на единицу большее предыдущего (начальное значение ноль). Когда значения в ячейках i и j совпадут, считается, что все возможные пути проанализированы, и дальнейший анализ продолжается по связи метки, соответствующей выходу из конечного элемента. Для правила распараллеливания данный механизм аналогичен.

В результате получаем автоматную RV-грамматику, содержащую 69 комплексов продукций.

После минимизации, заключающейся в исключении одинаковых комплексов продукций, получаем RV-грамматику (табл. 4).

На выходе метакомпилятора формируется RV-грамматика в формате XML, которая используется кодом RV-анализатора для разбора конкретных графических предложений.

Заключение

Предложены организация метакомпилятора, правила описания конструкций визуального языка (на примере UML) и алгоритм синтеза RV-грамматики. Полученные результаты легко масштабируются на другие языки.

СПИСОК ЛИТЕРАТУРЫ

1. Parr T. The definitive ANTLR reference: Building domain-specific languages. - Pragmatic Bookshelf, 2007.

2. Donnelly C., Stallman R. Bison //Free Software Foundation. - 1995.

3. The Compiler Generator Coco/R URL: http ://ssw .j ku. at/Coco/

4. Baxter I. D., Pidgeon C., Mehlich M. DMS®: Program transformations for practical scalable software evolution //Proceedings of the 26th International Conference on Software Engineering. - IEEE Computer Society, 2004. - С. 625-634.

5. Mairesse F. et al. Phrase-based statistical language generation using graphical models and active learning //Proceedings of the 48th Annual Meeting of the Association for Computational Linguistics. -Association for Computational Linguistics, 2010. -С. 1552-1561.

6. Lex & Yacc Tutorial URL: http:// epaperpress.com/lexandyacc/

7. Шаров О.Г., Афанасьев А.Н. Синтаксически-ориентированная реализация графических языков на основе автоматных графических грамматик // Программирование. - 2005. - №6. -С. 56-66.

8. GOLD Parsing System - A Free, MultiProgramming Language, Parser Generator URL: http: //goldparser.org/

Афанасьев Александр Николаевич, первый проректор-проректор по ДиДО, доктор технических наук, профессор кафедры «Вычислительная техника» УлГТУ.

Войт Николай Николаевич, кандидат технических наук, доцент кафедры «Вычислительная техника» УлГТУ, заместитель директора по научно-исследовательской работе ИДДО УлГТУ.

Гайнуллин Ринат Фаязович, кандидат технических наук, сотрудник ООО «Эквид». Бригандов Сергей Игоревич, аспирант кафедры «Вычислительная техника» УлГТУ. Хородов Виталий Сергеевич, кандидат технических наук, сотрудник Russian IT Group. Шаров Олег Геннадьевич, кандидат технических наук, Chief Technology Officer в компании «ITECH.games ».

Поступила 21.12.2016 г.

i Надоели баннеры? Вы всегда можете отключить рекламу.