список литературы
1. OMG UML Version 2.3 [Электронный ресурс]: <http://www.omg.org/spec/UML/2.3/>, 2010.
2. Бураков В. В. Управление качеством программных средств. СПб: СПбГУАП, 2009. 287 с.
Вадим Витальевич Бураков
Сведения об авторе д-р техн. наук, профессор; СПИИРАН, лаборатория информационных технологий в системном анализе и моделировании; E-mail: [email protected]
Рекомендована СПИИРАН
Поступила в редакцию 10.06.14 г.
УДК 681.3.062
Л. Н. Федорченко
МЕТОД РЕГУЛЯРИЗАЦИИ ГРАММАТИК В СИСТЕМАХ ПОСТРОЕНИЯ ЯЗЫКОВЫХ ПРОЦЕССОРОВ
Описывается алгоритм регуляризации приведенных контекстно-свободных грамматик, основанный на эквивалентных преобразованиях, который совместно с алгоритмом устранения рекурсий редуцирует грамматику к единственному регулярному выражению.
Ключевые слова: контекстно-свободная грамматика, эквивалентное преобразование грамматики.
Регулярные множества и контекстно-свободные языки с различными ограничениями и расширениями успешно применяются в технологии построения трансляторов. При создании разного вида трансляторов языков программирования используется множество технологических средств построения анализаторов формальных языков. Как правило, эти технологические средства обеспечивают лишь проверку предъявляемых к грамматике требований и выдачу диагностических сообщений об их нарушениях. Для получения эквивалентной грамматики, удовлетворяющей условиям алгоритма анализа, существуют способы эквивалентных преобразований контекстно-свободных (КС) грамматик. Эти преобразования могут быть выполнены автоматически. Такие эквивалентные преобразования реализованы в программном средстве SynGT (Syntax Graph Transformations), разработанном в СПИИРАН.
В настоящей статье рассматривается алгоритм редукции приведенной КС-грамматики к одному регулярному выражению с помощью эквивалентных преобразований.
Определим отношение R зависимости между нетерминалами КС-грамматики следующим образом.
Определение 1. Пусть G = ( VN, VT, Р, S) — КС-грамматика, где VN — алфавит нетерминалов, VT — алфавит терминалов, Р — множество правил грамматики, S е VN — начальный символ грамматики. Будем считать, что нетерминал A е VN зависит от нетерминала Bе VN, если существует правило вида A ^aBР еР, где а, Ре V*, V = VN^ VT. Этот факт будем записывать как (A , B) е ©, а множество всех таких пар © будем называть отношением
зависимости между нетерминалами КС-грамматики. Другими словами, © ^VNxVN. При A = B считаем нетерминал A самозависимым (рекурсивным).
Определение 2. Нетерминал А е назовем абсолютно независимым, если -ЗБ : (А, В) е ©.
Другими словами, абсолютно независимые нетерминалы определяются правилами, в правых частях которых нет ни одного нетерминала.
Рассмотрим схему эквивалентного преобразования КС-грамматики в одно регулярное выражение.
1. Множество всех нетерминалов У^ данной приведенной КС-грамматики разбивается на непересекающиеся подмножества (уровни) ¡1, 0 < г < к <| N |, в соответствии с уровнем зависимости нетерминала. Нетерминалы, правила для которых содержат только терминальные символы в правых частях, принадлежат к самому нижнему нулевому уровню ¡0 , т. е. такие нетерминалы А еУN, значения (регулярные множества) Я( А) которых содержатся в правой части соответствующего ^-правила с терминальными символами.
2. Для каждого следующего уровня ¡1 и для всех нетерминалов этого уровня осуществляется замещение (подстановка) нетерминалов уровня I— их значениями. Самый последний уровень ¡к содержит только один элемент — начальный символ £ грамматики, который замещается регулярным выражением на последнем шаге преобразования.
Все подстановки осуществляются в соответствии с иерархией на нетерминалах, определяемой отношением зависимости ©, т.е. если правая часть Ау -правила содержит вхождение
нетерминала Бу, то пара (Ау, Бу) принадлежит отношению зависимости © согласно определению 1.
Задача состоит в том, чтобы разбить все нерекурсивные нетерминалы на непересекающие множества э0, 51, э2, ... , эт , т < п, где п = \У^, которые должны обладать следующими свойствами.
1) Все нетерминалы Аеэ0 абсолютно независимы, т.е. регулярные выражения для таких нетерминалов априори определены А-правилами.
2) Нетерминалы любого множества , 1 < г < т, независимы друг от друга, т.е. для любой пары нетерминалов (А, В) е выполняется условие (А, В) £ © .
3) Нетерминалы множества , 1 < г < т, непосредственно вычислимы по регулярным значениям нетерминалов из множеств Эу, 1 < у < г -1, предыдущих уровней. Другими словами, если А е , то в правой части А-правила все вхождения нетерминалов замещаются регулярными значениями вычисленных к этому моменту нетерминалов из множества Эу,
1 < у < г -1.
Примем, что нетерминалы из множества э относятся к уровню ¡. Очевидно, что на максимальном уровне (т) всегда располагается начальный нетерминал £ грамматики, и только он, если он не встречается в правых частях правил. Это условие задается предварительно [1].
На уровне „0" находятся нетерминалы, регулярные значения которых уже определены: их можно назвать опорными. Далее, при параллельном продвижении по уровням, „вычисляются" регулярные значения всех других нетерминалов путем замещения в соответствии с вышеуказанным свойством 3. В результате такого процесса формируется регулярное выражение для начального нетерминала £ грамматики на уровне т. Именно оно и есть искомый результат эквивалентных преобразований исходной КС-грамматики.
Лево- и/или правосторонние и центральная рекурсии в преобразуемых правилах, в случае их обнаружения, исключаются согласно приведенному в работах [2, 3] алгоритму с использованием операций итерации (бинарной или унарной).
В качестве примера будем использовать грамматику с трактовкой правил как регулярных формул с операциями объединения, конкатенации и обобщенной итерации [3]. В процессе преобразований правил грамматики могут появляться и другие регулярные операции: два вида замыкания — рефлексивно-транзитивное, обозначаемое „звездочкой" Клини, и транзитивное, обозначаемое „плюсом" Клини, а также обобщенная итерация, обозначаемая как „#" (см. определение в работах [2, 3]).
Пример 1. Дана КС-грамматика G = (Ум,УТ, Р, 5), где
Ут = {Я, '.', , V, '+' ; '-'}; Уы = { Аь ¿2, Аз, А4, Аз, А6, Аъ А», Ад, Аю, Ап, АЦ, А13, Лм, А15}; 5 = А15;
Р состоит из 15 правил.
Список правил грамматики приведен на рис. 1.
Аь '+' ; '-'. А2: А1 ; е. А3: А2 , А14. А4: Г ; 'e'.
А5: А4 , А3. Аб: А14 ; Ац. А7: Аб , А5. А8: '.' , А14.
А9: А14. А10 А9 ; е. Ац А10 , А8. А12: У.
А13 А12 ; А13 , А12. А14 А13. А15 А14 ; А11 ; а7.
Рис. 1
Альтернативы для каждого нетерминала А представлены в виде регулярных выражений с помощью операции объединения и разделены металингвистическом символом „ ; ", а конкатенируемые символы правых частей — символом „ , "; конец А-правила отмечен как „ . ". Таким образом, рассматривается КС-грамматика в регулярной форме, все правила которой имеют следующий вид:
<нетерминал>:<регулярное выражение>.
Строгие определения для обобщенных регулярных выражений в правилах КС-грамматик в регулярной форме приведены в работах [2, 3].
Отношение зависимости между нетерминалами © легко построить непосредственно по правилам грамматики в виде множества пар © ^ VNxVN. В результате получаем
© = {(¿2, Al), (А3, A2), (А3, A14), (А5, А3), (А5, A4), (Аб, A11), (Аб, A14), (А7, А5), (А7, Аб), (¿8, А14), (¿9, А14), (А 10, А9), (¿11, As), (¿11, А10), (А 13, А12), (А 13, А13), (А14, А13), (А15, А7), (А15, Ац), (А15, А14)}.
Для наглядности отношение зависимости © можно представить и в виде матрицы
(рис. 2). Строки и столбцы этой матрицы — нетерминальные символы грамматики. Непустой элемент матрицы, находящийся i-й строке и j-м столбце, помеченный символом T, означает, что нетерминал А¡ зависит от нетерминала Aj (например, А2 зависит от А1, А3 зависит от А2 и А14 и т.д.). Пустые строки матрицы (например, 1, 4, 12-я) означают абсолютную, т. е. полную независимость нетерминалов А1, А4, А12 от всех других нетерминалов грамматики. Элемент (А13, А13)=Т означает самозависимость нетерминала А13, т. е. нетерминал А13 леворекурсивен. Применяя эквивалентное преобразование, получаем А13: А12,(А12)*. = (А12)#.
Рассмотрим метод сортировки нетерминалов. Опишем в абстрактных терминах алгоритм сортировки нетерминалов КС-грамматики, исходя из построенного отношения зависимости. Цель алгоритма — расположить множество нетерминалов грамматики по уровням
таким образом, чтобы все нетерминалы одного уровня I, 1 < I < т, зависели только от нетерминалов уровня к < I в соответствии с отношением В.
A1 A2 A3 A4 A5 A6 Ai As A9 A10 An A12 A/3 A/4 A15
A1
Л2 T
A3 T T
A4
T T
A6 T
Ai T T
As T
A9 T
A10 T
Au T T
A12
A13 T T
A14 T
A15 T T T
Рис. 2
Алгоритм: сортировка нетерминалов грамматики.
Входные данные: G = ( VN, VT, P, S) — приведенная КС-грамматика, не содержащая рекурсивных нетерминалов; ©^ VNxVN — отношение зависимости нетерминалов.
Выходные данные: N = {s0, si, s2, ... , sm}, где sk ^ VN — подмножество нетерминалов данной грамматики уровня к, 0 < к < m.
Шаг 0. Расположение на уровне l = 0 всех абсолютно независимых нетерминалов:
l = 0; so = {A \ V (A, B e VN ): (-,3 (a, p e V*): A ^ aBp e P)}.
Шаг 1. Построение множества нетерминалов следующего уровня:
l = l + 1; si = {A \ V (A e Vn): (3 B e VN): (B e si-1) & (A, B)eR & (A*B)}.
Шаг 2. Исключение из всех подмножеств sk, 0 < к < l-1, нетерминалов, содержащихся в подмножестве sl:
for V (A e s1): do for k from 0 to 1—1
do if A e sk then sk := sk \ {A} od
do;
Шаг 3. Определение необходимости продолжения процесса сортировки нетерминалов: if s1 Ф 0 then goto Шаг 1;
Шаг 4. Окончание процесса сортировки:
m = l— 1; {максимальный уровень нетерминалов}. Результат: N={s0, s1, s2, ... , sm}.
Применительно к рассмотренному примеру получен следующий результат:
s0 = {A1, A4, A12}; s1 = {A2, A13}; s2 = {A14}; s3 = {A3, As, A9}; s4 = {A5, A10};
s5 = {A11}; s6 = {A6}; si = {A7}; ss = { A15}.
Динамика вычисления уровней зависимости показана на рис. 3, где символ T означает рассматриваемый нетерминал, а символ Т — удаление его с более низкого уровня отношения
зависимости. Максимальный номер уровня т = 8. Заметим, что условие ЛфБ, используемое на шаге 1 алгоритма, существенно: оно предотвращает бесконечный рост уровней.
А, А2 Аз А4 А 5 Аб А7 А8 а9 Аю Аи А]2 Аи А]4 А15
8 Т
7 Т т
6 Т т т
5 т т Т т
4 Т т Т т
3 Т т т Т Т т
2 т т Т
1 Т т Т
0 Т Т Т
Рис. 3
Используя результат сортировки нетерминалов и правила исходной КС-грамматики, построим регулярные выражения для всех нетерминалов, исходя из следующих соображений.
Регулярные значения нетерминалов, представленных регулярными выражениями (см. рис. 1), вычисляются на основе априорных значений тех правил грамматики, правые части которых являются регулярными выражениями над алфавитом терминалов. Такие априорные значения всегда существуют, поскольку грамматика приведенная. Все они относятся к нетерминалам уровня „0".
В рассматриваемом примере три нетерминала уровня „0": Л1, Л4 и Л12, и соответствующие регулярные выражения для них: Я( Л1) =('+' ; '-'), Я( Л4) = ('\' ; 'е') и Я( Л12) = ('С).
Задание регулярных значений для всех нетерминалов уровня „0" обеспечивает инициализацию процесса построения регулярных значений нетерминалов уровня I, 1 < I, по значениям нетерминалов предыдущих уровней. При этом можно утверждать, благодаря выполненной сортировке нетерминалов, что уже существуют регулярные значения, необходимые для вычисления значений нетерминалов уровня I путем замещения (подстановки) вхождений нетерминалов в правила КС-грамматики соответствующими регулярными выражениями, полученными на более низком уровне.
Согласно матрице зависимости (см. рис. 2), от регулярного значения нетерминала Л1 зависит значение нетерминала Л2, и только оно, и, следовательно, замещая (в соответствии с рис. 1) в правиле для Л2 вхождение Л1 значением ('+' ; '-'), получаем регулярное выражение (('+' ; '_'), 8) в качестве правой части нового правила для нетерминала Л2. Аналогичные рассуждения приводят к заключению, что регулярное значение Я(Л4) = ('\' ; 'е') должно передаваться в правую часть правила для Л5, а Л(Л12)= (с) — для Л13. (Для упрощения записи исключим знаки-кавычки „ ' ' " для обобщенного терминала с.) В результате подстановок получаем регулярные выражения Я(Л5)= (('\' ; 'е'), (('+' ; '-'), в), (С)+) и Я(Л13)= =((^, (с)*) в качестве правых частей новых правил для нетерминалов Л5 и Л13 уровня „1".
Далее вычисляем значения нетерминалов уровня „2", т.е. Л14. После подстановки в исходном правиле для Л14 вместо Л13 значения Я( Л13) получаем Я( Лм) = (((с), (с)*)). Подобным
же образом вычисляются регулярные значения нетерминалов следующих уровней вплоть до максимального, на котором находится всегда один — начальный — нетерминал грамматики £ = Л15. Его регулярное значение и есть цель преобразований исходной КС-грамматики.
Итак, регуляризованная КС-грамматика 01, эквивалентная исходной, — есть КС-грамматика в регулярной форме:
Я(Л15) = ад ((О, (О*) ;
(((((О, (О*)) ; в), '.', т, (с!)*)) ;
т, (О*), ((((О, (О*)) ; в), '.', ((О, (О*)) ,
(('\' ; 'e'), ((((('+' ; '-'), в), в)), ((d), (d)*)))) ^ = d+ ; d*, '.', d+ ; (d+; d*, '.', d+), ('\' ; 'e'), ['+' ; '-'], d+ = ^ (d+; d*, '.', d+), [('\' ; 'e'), ['+' ; '-'], d+]. Предложенный алгоритм получения регулярного выражения, эквивалентного приведенной КС-грамматике без ограничений на рекурсии, может быть применен при построении языковых процессоров. Используется метод сортировки нетерминалов КС-грамматики по отношению зависимости [4], реализованный в системе SynGT [2]. Приведенный алгоритм регуляризации позволяет обнаружить любые рекурсии (левая/правая/вложенная) по ходу распределения нетерминалов по уровням. Благодаря применению алгоритма удаления таких рекурсий [2, 3] снимаются ограничения на рекурсивности в исходной грамматике.
список литературы
1. Handbook of Formal Languages / Eds.: G. Rozenberg, A. Salomaa. Berlin, Heidelberg, New York: Springer-Verlag, 1997. Vol. 2. 527 p.
2. Fedorchenko L. Regularization of Context-Free Grammars. Saarbrucken: LAP LAMBERT Academic Publishing, 2011.
3. Федорченко Л. Н. О регуляризации контекстно-свободных грамматик // Изв. вузов. Приборостроение. 2006. Т. 49, № 11. C. 50—54.
4. Мартыненко Б. К. Регулярные языки и КС-грамматики // Компьютерные инструменты в образовании. 2012. № 1. С. 14—20.
Сведения об авторе
Людмила Николаевна Федорченко — канд. техн. наук; СПИИРАН, ст. научный сотрудник;
E-mail: [email protected]
Рекомендована СПИИРАН Поступила в редакцию
10.06.14 г.