Научная статья на тему 'Алгоритм построения нерекурсивных программ-распознавателей линейной сложности по детерминированным синтаксическим диаграммам'

Алгоритм построения нерекурсивных программ-распознавателей линейной сложности по детерминированным синтаксическим диаграммам Текст научной статьи по специальности «Компьютерные и информационные науки»

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

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Поляков В.М., Рязанов Ю.Д.

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

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

Текст научной работы на тему «Алгоритм построения нерекурсивных программ-распознавателей линейной сложности по детерминированным синтаксическим диаграммам»

Поляков В. М., канд. техн. наук, доц., Рязанов Ю. Д., доц.

Белгородский государственный технологический университет им. В.Г. Шухова

АЛГОРИТМ ПОСТРОЕНИЯНЕРЕКУРСИВНЫХ ПРОГРАММ-РАСПОЗНАВАТЕЛЕЙ ЛИНЕЙНОЙ СЛОЖНОСТИ ПО ДЕТЕРМИНИРОВАННЫМ СИНТАКСИЧЕСКИМ

ДИАГРАММАМ

Ryazanov.iurij@yandex.ru

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

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

Одним из удобных способов описания формальных языков является синтаксическая диаграмма (СД). Этот графический, оперирующий образами способ ориентирован на человека и в основном применялся в руководствах по языкам программирования [1]. Сейчас известны примеры использования СД при инженерном, ручном проектировании трансляторов [2 — 6]. В системах автоматизированного построения трансляторов [7 — 10] СД не применяются. Как правило, спецификация транслятора в этих системах представляется в нотации РБНФ, выполняется классическое проектирование транслятора [11] и его реализация с использованием алгоритмов линейной сложности, если это позволяет исходная РБНФ, либо с использованием универсальных алгоритмов более высокой сложности, таких как ОЬЯ, ОЬЬ или алгоритмов с возвратами.

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

Табличный способ представления СД и предложенные алгоритмы ориентированы на их использование в системах автоматизированного построения трансляторов.

Синтаксическую диаграмму будем задавать четверкой Б = (Т, N О, 5), где

Т — конечное множество терминалов;

N — конечное множество нетерминалов;

5 е N — начальный нетерминал;

О = (V, Е) — ориентированный граф, где

V = Ут и VN и Уи и Уеход ^ Увыход, где

Уеход — множество точек входа, \ Увход\ = N1;

Ут — множество терминальных вершин;

V}! — множество нетерминальных вершин;

Уи — конечное множество узлов;

Увыход — множество точек выхода, \Увыход\ =

N1;

Е = Е\ и Е2 и Е3 и Е4 и Е5, где

Е1 <^{{а,Ъ) \ а е Увход, Ъ е Уи}— множество входных дуг;

Е2 с {(а,Ъ) \ а е Уи, Ъ е Увыход} — множество выходных дуг;

Е3 с {(а,Ъ) \ а е Уи, Ъ е Ути Уу} — множество дуг, выходящихиз узлов;

Е4 с {(а,Ъ) \ а е Ут и Ум Ъ е Уи} — множество дуг, входящих в узлы;

Е5 £ {{а,Ъ) \ а еУи, Ъ е Уи} — множество е-дуг, соединяющих узлы.

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

входить в узел. В каждую терминальную и нетерминальную вершину входит только одна дуга и выходит только одна дуга. На количество дуг,

входящих в узлы и выходящих из них, ограничений нет. На рис. 1 приведен пример синтаксической диаграммы.

Рис. 1. Синтаксическая диаграмма

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

Определим функцию Я: и ^ {1,2,...,|Г„|} разметки узлов, которая каждому узлу синтаксической диаграммы ставит во взаимнооднозначное соответствие элемент из множества {1,2,...,|Г„|}.

Компоненту А синтаксической диаграммы будем представлять одноименной таблицей А, содержащей т строк и п столбцов, где п — количество узлов в компоненте А, т=\Т\ + \Щ+1. Столбцы таблицы соответствуют узлам и отмечаются метками в соответствии с функцией Я. Столбцы, соответствующие начальным узлам, отмечаются стрелочками. Столбцы, соответствующие заключительным узлам, отмечаются символом 1. Строки отмечаются терминалами, нетерминалами и символом е. Каждый элемент таблицы содержит некоторое, возможно пустое, множество меток.

Пустая таблица А заполняется по следующим правилам. Если в диаграмме компоненты из узла с меткой г существует путь в узел с мет-

кой 7, проходящий только через одну терминальную вершину с терминалом а е Т, то в элемент таблицы Ац1 добавляем метку 7. Если из узла с меткой г существует путь в узел с меткой 7, проходящий только через одну нетерминальную вершину с нетерминалом В е Ы, то в элемент таблицы АВ,г добавляем метку7. Если существует е-дуга из узла г в узел7, то в элемент таблицы Ае,г добавляем метку 7. Синтаксическая диаграмма (см. рис. 1) в табличной форме представлена в табл. 1.

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

Н).

5 Ф 1

1 2 3 4

a 3

Ь

с 4

d

е

5

А 2

В 4 2

Табличное представление синтаксической диаграммы

Таблица 1

А Ф 1 1

5 6 7 8

а 5

Ь 6

с

d 8

е

5

А

В 7 8

В Ф 1

9 10 11

а

Ь

с

d 11

е 10

5

А

В 11

Символ x, который может быть добавлен в цепочку после прохождения выходящей из узла дуги e, принадлежит множеству выбора дуги e. Узел u называется детерминированным, если множества выбора любых двух дуг, выходящих из узла u, не пересекаются. СД является детерминированной, если в ней все узлы детерминированные. В работе [12] описаны алгоритмы вычисления множеств выбора дуг, выходящих из узлов, и определения принадлежности СД классу детерминированных СД.

Определим интуитивно множества выбора дуг, выходящих из узлов, в СД на рис. 1 и припишем их к соответствующим дугам. Множества выбора дуг, входящих в терминальную вершину, очевидно, содержат только терминал, записанный в этой вершине. Множество выбора дуг, входящих в вершину с нетерминалом В, равно {^ e}, т. к. из начального узла 9 компоненты В дуги идут только в вершины с терминалами d и e. Множество выбора дуги (1, А) рав-

но {Ь, d, e, с}}. Принадлежность символа Ь этому множеству объясняется дугой (5, Ь), символов d и e — дугой (5, B) и дугами, выходящими из узла 9, символа с — дугами (5, выход) и (2, с). Множество выбора дуги (4, выход) содержит только концевой маркер {-| }, т. к. после прохождения этой дуги цепочка заканчивается. Множество выбора дуги (8, выход) со-

держит только символ с потому, что после выхода из вершины с нетерминалом А (дуга (А, 2)) попадаем в узел 2, из которого выходит единственная дуга (2, с). Множество выбора дуги (11, выход) равно {а, с, d, e, - }. Это объясняется последовательностями дуг ((В, 8), (8, a)), ((В, 2), (2, с)), ((В, 4), (4, B), (9, ^ и (9, e)) и ((В, 4), (4, выход)). Выполнив анализ множеств выбора дуг, выходящих из узлов, можно сделать вывод, что СД детерминированная.

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

Таблица 2

5 4 1

1 2 3 4

а а

Ь

с с

d

е

5

А Ь,с^,е

В d,e d,e

выход -

А 4 1 1

5 6 7 8

а а

Ь Ь

с

d d

е

5

А

В d,e d,e

выход 3 3

В 4 1

9 10 11

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

а

Ь

с

d d

е е

5

А

В d,e

выход а,с^,е,\

Теперь рассмотрим алгоритм построения нерекурсивных программ-распознавателей по

таблицам детерминированных синтаксических диаграмм.

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

1) инициализация магазина — при выполнении этой команды создается пустой магазин;

2) магазин пуст — проверка пустоты магазина;

3) втолкнуть (т) — втолкнуть узел т в магазин;

4) т := вытолкнуть — вытолкнуть верхний магазинный символ (узел СД) и присвоить его переменной т;

Опишем другие команды и элементы псевдокода, используемые в программе-распознавателе:

1) Программа и Конец программы — начало и конец программы;

2) читать (х) — чтение очередного символа входной цепочки в переменную х (при первом выполнении читается первый символ цепочки);

3) 1, 2, 3 ... — метки, соответствующие узлам СД;

4) логические выражения

— х = t, где t — терминал или концевой маркер (-); истина, если значение переменной х равно V,

— х е <подмножество терминалов, которое может содержать концевой маркер>;

— х = - и магазин пуст;

5) если <логическое выражение> то <Опе-ратор1> иначе <Оператор2> — условный оператор, где < Оператор 1> может представлять собой один из четырех вариантов:

— читать (х), переход на <метка>;

- втолкнуть (<метка>) переход на < метка> ;

— т := вытолкнуть, переход на т;

—Допустить, конец;

<Оператор2> — условный оператор или Отвергнуть, конец.

В программе-распознавателе инициализируется магазин, читается первый символ входной цепочки и далее последовательно описываются все узлы СД. Описание узла отмечается одноименной меткой и представляет собой последовательность описаний дуг, выходящих из узла. Дуга описывается условным оператором, в котором определяется принадлежность обрабатываемого символа множеству выбора дуги. Если символ принадлежит множеству выбора дуги и дуга идет в терминальную вершину, то читается следующий символ входной цепочки и выполняется переход на метку, соответствующую узлу, в который идет дуга из терминальной вершины. Если символ принадлежит множеству выбора и дуга идет в нетерминальную вершину с нетерминалом А, то нужно перейти на начальный узел компоненты А, предварительно запомнив узел и, в который идет дуга из нетерминальной вершины, в магазине. Из начального узла компоненты А начинается «движение» по узлам компоненты, и, как только попадем в заключительный узел и обрабатываемый символ будет принадлежать множеству выбора выходной дуги, нужно будет перейти в узел и, который будет находиться на верху магазина. Из магазина этот узел извлекается. Если символ непринадлежит множеству выбора и дуга не последняя, то описывается следующая дуга, выходящая из рассматриваемого узла, а если дуга последняя, то цепочка отвергается. Выходная дуга заключительного узла, идущая в точку выхода, описывается последней. Если символ принадлежит множеству выбора, то узел, на который следует перейти, извлекается из магазина и выполняется переход, иначе цепочка отвергается. Цепочка допускается, если при посещении заключительного узла начальной компоненты все ее символы обработаны (обрабатываемый символ — концевой маркер) и магазин пуст.

Текст программы-распознавателя, соответствующей СД (см. рис. 1, табл. 1 и 2) представлен ниже на псевдокоде:

Программа

инициализация магазина; читать (х);

1: если х = а то читать (х), переход на 3 иначе

если х е {Ъ, с, й, е} то втолкнуть(2), переход на 5

иначе Отвергнуть, конец. 2: если х = с то читать (х), переход на 4

иначе Отвергнуть, конец. 3: если х е {й, е} то втолкнуть(4), переход на 9

иначе Отвергнуть, конец. 4: если х = - и магазин пуст, то Допустить, конец иначе если х е {й, е} то втолкнуть(2), переход на 9 иначе

если х е {- } то т: = вытолкнуть , переход на т иначе Отвергнуть, конец.

5: если х = Ь то читать (х), переход на 6 иначе

если х е е} то втолкнуть(7), переход на 9 иначе если х е {с} то т := вытолкнуть , переход на т иначе Отвергнуть, конец. 6:если х е {^ е} то втолкнуть(8), переход на 9

иначе Отвергнуть, конец. 7: если х = dто читать (х), переход на 8

иначе Отвергнуть, конец. 8: если х = а то читать (х), переход на 5 иначе

если хе {с} то т := вытолкнуть , переход на тиначе Отвергнуть, конец.

9: если х = dто читать (х), переход на 11 иначе если х = е то читать (х), переход на 10

иначе Отвергнуть, конец. 10: если хе {^ е} то втолкнуть(11), переход на 9

иначе Отвергнуть, конец.

11: если хе {а, с, d, е, - } то

т := вытолкнуть , переход на тиначе Отвергнуть, конец.

Конец программы Алгоритм построения программы-распознавателя по таблицам СД следующий:

1. Выдать «инициализация магазина;»

2. Выдать «читать (х);»

Алгоритм процедуры СинтезКода(А, ЫУ). Вход: А — таблица компоненты А;

ЫУ — таблица, хранящая множества выбора дуг, выходящих из узлов компоненты А. Выход: фрагмент кода программы, соответствующий компоненте А.

1. Для всех узлов и компоненты А (столбцов таблицы А) выполнить:

1.1. Выдать метку, соответствующую узлу и.

Если А — начальная компонента и узел и — заключительный, то выдать «если х = —и магазин пуст, то Допустить, конец иначе»

1.2. Для всех строк-терминалов t выполнить: если А,иФ 0, то выдать

«если х = t то читать (х), переход на т иначе», где т = А,и.

1.3. Для всех строк-нетерминалов У выполнить: если АУиф 0, то выдать

«если х е ЫУУи то втолкнуть(АУ?и), переход на т иначе», где т — первый столбец таблицы У.

1.4. Если АвЬКод,и Ф 0, то выдать

«если х е ЫУвыход,и то т := вытолкнуть , переход на т иначе».

1.5. Выдать «Отвергнуть, конец.».

2. Конец алгоритма.

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

3. Для всех компонент СД сформировать фрагмент кода, используя процедуру СинтезКо-да.

4. Выдать «Конец программы».

5. Конец алгоритма.

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Йенсен К., Вирт Н. Паскаль. Руководство для пользователя и описание языка. М: Финансы и статистика, 1982. 151 с.

2. Легалов А.И.Основы разработки трансляторов. URL:

http://www.softcraft.ru/translat/lect/content.shtml (дата обращения: 15.09.2013)

3. Легалов А.И., Швец Д.А., Легалов И.А. Формальные языки и трансляторы. Красноярск: Сибирский федеральный университет, 2007. 213 с.

4. Свердлов С.З. Введение в методы трансляции. Вологда: Издательство «Русь», 1994. 80 с.

5. Свердлов С. З. Языки программирования и методы трансляции. СПб.: Питер, 2007. 638 с.

6. Карпов Ю. Г. Теория и технология программирования. Основы построения трансляторов. СПб.: БХВ-Петербург, 2005. 272 с.

7. ANTLR.URL: http://www.antlr.org/ (дата обращения: 15.09.2013)

8. ASF+SDF.URL:

http://www.cwi.nl/projects/MetaEnv/ (дата обращения: 15.09.2013)

9. Bison.URL: http://www.gnu.org/software/bison/ (дата обращения: 15.09.2013)

10. Coco/R.URL: http://www.ssw.uni-linz. ac.at/Research/Projects/Coco/ (дата обращения: 15.09.2013)

11.Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции. М.: Мир, 1978. т. 1, 612 с. т. 2, 487 с.

12. Рязанов Ю. Д., Севальнева М. Н. Анализ синтаксических диаграмм и синтез программ-распознавателей линейной сложности // Научные ведомости БелГУ. Сер. История. Политология. Экономика. Информатика. 2013. № 8 (151). Вып. 26/1. С. 128-136.

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