информатика
I
I г
Мартыненко Борис Константинович
УДК 21.7.12
каскадный метод регуляризации
кс-грамматик
Аннотация
Описывается метод регуляризации приведённых КС-грамматик без самовставлений, основанный на топологической сортировке нетерминалов грамматики по отношению зависимости, определяемой правилами грамматики.
Ключевые слова: КС-грамматика, регулярное выражение, отношение зависимости, топологическая сортировка нетерминалов, эквивалентное преобразование грамматики.
Определим отношение Я зависимости между нетерминалами КС-грамматики следующим образом.
Определение 1. Пусть С = (У№ Ут, Р, 5) -КС-грамматика. Будем считать, что нетерминал А е Ук зависит от В е У№ если существует правило вида А ® аВр е Р, где а, Ре V*, У = Уми Ут. Этот факт будем записывать (А, В) е Я, а множество всех таких пар Я будем называть отношением зависимости между нетерминалами КС-грамматики. Другими словами, Я с Ук х У№ Когда А = В говорят, что нетерминал А самозависим.
Определение 2. Нетерминал А е Ук назовём абсолютно независимым, если не существует никакого В е У№ чтобы пара (А, В) е Я.
Другими словами, абсолютно независимые нетерминалы определяются правилами, в правых частях которых нет ни одного нетерминала.
Наша ближайшая задача разделить всё множество нетерминалов Ук данной при-
© Мартыненко Б.К., 2012
ведённой КС-грамматики без самовставлений на такие непересекающиеся подмножества $0, 81, $2, ... , , т < п, где п - число нетерминалов грамматики, которые обладали бы ниже следующими свойствами.
1. Все нетерминалы А е $0 абсолютно независимы. Другими словами, регулярные выражения для таких нетерминалов априори определены А-правилами, то есть правилами с нетерминалом А в левой части.
2. Нетерминалы любого множества , 1 < I < т, независимыг, то есть для любой пары нетерминалов А, Ве $гвыполняется (А, В) г Я.
3. Нетерминалы множества , 1 < I < т, непосредственно «вычислимы» по регулярным значениям нетерминалов из множеств
, 0 < к < I - 1. Другими словами, если А е $1, то в правой части А-правила все вхождения нетерминалов замещаются регулярными значениями нетерминалов из $к, 0 < к < I - 1, уже вычисленных к этому моменту.
Метод разбиения множества нетерминалов грамматики на подмножества независимых нетерминалов $0, $1, $2, ... , $т с такими
свойствами - это топологическая сортировка множества ^ в отношении Я.
Будем говорить, что нетерминалы из множества относятся к уровню 1. Очевидно, что на максимальном уровне (т) всегда располагается начальный нетерминал грамматики 5 и только он, если он не встречается в правых частях правил. Это всегда можно гарантировать предварительно.
На уровне 0 находятся нетерминалы, регулярные значения которых уже определены. Их можно назвать опорными. Далее, параллельно продвигаясь по уровням, «вычис-
ляются» регулярные значения всех других нетерминалов путём замещения, как указано выше в свойстве 3. В результате такого «каскадного» процесса в последнюю очередь мы получим регулярное выражение для начального нетерминала грамматики 5 на уровне т. Именно оно и есть искомый результат эквивалентных преобразований исходной КС-грамматики.
Остаётся описать метод топологической сортировки множества нетерминалов грамматики в отношении зависимости Я и определить порядок получения регулярных вы-
Пример 1. Грамматика чисел в языке Алгол 68.
Дана КС-грамматика G = (VN, VT, P, S), где VT = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', , 'e', '+' ; '-'} = {d, , '.', , 'e', '+' ; '-'}. V = {A A A A A
N I 15{number}> 1{plusminus}' 2{plusminus option }' 3{power often }' 4{times ten to the power choice }'
AAA A A
5{exponent part}' 6{stagnant part}' 7{floating point numeral}' 8{fractional part}' 9{integral part}'
A A A A
10{integral part option}' 11{variable point numeral}' 12{digit cypher }' 13 {digit cypher sequence}'
A
14{fixed point numeral
;}» S — A1 5'
Р - {Ai5: A14• Aii • A7- A11 A10 , A8. A 7: A6 ' A5' A3: A2 , A14.
A 14' A13- A10 A9 • e' A6: A14 • A11. A2: A1 • e.
A ' A • A A12' A9' A 14. A5: A4 ' A3' A1: • '-'.}
A 12: 0 • 1 • 2 • ? ? 5'; '6'; '7'- u ? v ? ' ? '8'; '9'. A8' '.' , A . . , A14' A4: '\' - 'e'.
Рис. 1. Синтаксическая граф-схема чисел в языке программирования Алгол 68
ражений для нетерминалов с учётом результата этой сортировки. Лево- и/или правосторонние рекурсии в преобразуемых правилах, в случае их обнаружения, исключаются по образцам А: Аа; А: (Д), (а)* или А: аА; А: (а)*(Д) соответственно (см. [2]).
Для иллюстрации будем использовать грамматику чисел Алгола 68 [1], приведённую в [2], с двойственной трактовкой правил, как регулярных формул с операциями объединения и конкатенации [3].
В процессе преобразований правил грамматик могут появляться и другие регулярные операции: два вида замыкания, рефлексивно-транзитивное замыкание, обозначаемое «звёздочкой» Клини, и транзитивное замыгкание, обозначаемое «плюсом» Клини.
Напомним, что все альтернативы для каждого нетерминала собраны в один «пакет» и разделены металингвистическом символом «;», а конкатенируемые символы правых частей - символом «,». Конец пакета отмечен «.».
На рис. 1 эта грамматика представлена в виде многокомпонентной синтаксической граф-схемы, аналога синтаксических диаг-
рамм Н. Вирта.
Отношение зависимости нетерминалов R легко построить непосредственно по правилам грамматики или, глядя на рис. 1, в виде множества пар R с VN х VN.
Получаем R = {(A2, A1), (A3, A2), (A3, A14),
(A5, A3), (A5, A4), (A6, A11), (A7, A5), (A7, A6), (A8, A14), (A9, A 14), (A 10, A9), (A 11, A8), (A 11,A10), (A 13, A 12), (A 13, A13), (A 14, A13), (A 15, A7), (A 15, A11), (A15, A 14)}.
Это отношение зависимости R для наглядности можно представить и в виде матрицыг зависимости (табл. 1). Строки и столбцы этой матрицы «оцифрованы» нетерминальными символами грамматики (A 1, A 2, ..., A15). Непустой элемент матрицы, размещающийся г-й строке и j-м столбце, помеченный символом T (true), означает, что
нетерминал A. зависит от нетерминала A.
г j
(как, например, A 2 зависит от A1; A 3 зависит от A2 и A14 и т. д.). Пустые строки матрицы (как, например, 1-я, 4-я, 12-я) означают абсолютную, то есть полную независимость нетерминалов A1, A4, A12, которым эти строки соответствуют, от всех других нетерминалов грамматики. Элемент (A 13, A13) = T
Табл. 1. Зависимость между нетерминалами
A1 A2 A3 A4 A5 A6 A7 As A9 A10 A11 A12 A13 A14 A15
Ai
A2 T
A3 T T
A4
A5 T T
A6 T
A7 T T
As T
A9 T
A10 T
A11 T T
A12
A13 T T
A14 T
A15 T T T
означает самозависимость нетерминала А13, то есть нетерминал А13 - (лево-) рекурсивен, поскольку входная грамматика без самовставлений.
Отношение зависимости Я можно изобразить и в виде графа зависимости, как на рис. 2. Узлы этого графа помечены нетерминалами грамматики, а ориентированные дуги представляют зависимость нетерминалов. Если нетерминал А зависит от В, то от узла, помеченного символом А, проводится дуга к узлу, помеченному символом В.
Читатель вправе выбирать эти или другие представления данных при обдумывании решения поставленной проблемы.
1. МЕТОД ТОПОЛОГИЧЕСКОЙ
СОРТИРОВКИ НЕТЕРМИНАЛОВ
Опишем в абстрактных терминах алгоритм топологической сортировки нетерминалов КС-грамматики, исходя из построенного отношения зависимости Я, а иллюстрации - в более зримых представлениях.
Цель алгоритма - расположить множество нетерминалов грамматики по уровням таким образом, чтобы все нетерминалы одного уровня I (1 < I < т) зависели только от нетерминалов уровня к < I в соответствии с отношением Я. Уровень I = 0 отводится абсолютно независимым нетерминалам, то есть тем, альтернативы которых представляются терминальными цепочками.
J t Al }*-{ Ь-{ ) ( м
Алгоритм 1. Топологическая сортировка нетерминалов грамматики
Вход: G = (VN, VT, P, S) - приведённая КС-грамматика без самовставлений.
R с VN х VN - отношение зависимости нетерминалов.
Выгход: N = {s0, s1, s2, ... , sm}, где sk с VN+ - непустое подмножество нетерминалов данной грамматики уровня k,
0 < к < т.
Шаг 0. Расположение на уровне 1 = 0 всех абсолютно независимые нетерминалов:
1 = 0; S0 = {A |V (A, B e Vn): (a, b e V*): A ® aBbe P)};
Шаг 1. Построение множества нетерминалов следующего уровня: 1 = 1 + 1; Si = {A | V (A e Vn): ($ B e Vn): (B e s1-1) & (A, B) e R & (A ФB)};
Шаг 2. Исключение из всех подмножеств sk, где 0 < к < 1 - 1, нетерминалов, содержащихся в подмножестве s1: for V (A e s1): do for к from 0 to 1 - 1
do if A e sk then sk := sk \ {A} od do;
Шаг 3. Продолжать ли процесс топологической сортировки нетерминалов:
if s1 Ф 0 then goto Шаг 1 else goto Шаг 4;
Шаг 4. Процесс топологической сортировки нетерминалов закончен:
т = 1 - 1; {Максимальный уровень нетерминалов}
Результат: N = {s0, s1, s2, ... , sm}. В применении к нашему примеру 1 результат получается такой:
s0 = {A1, A4, A12}; S1 = {A2, A13}; S2 = {A14}; S3 = {A3, A8, A 9}; S4 = {A5, A10}; S5 = {A11}; s6 = {A6}; S7 = {A7}; S8 = { A 15}.
Максимальный номер уровня в рассматриваемом примере m = 8. На нём всегда располагается начальный нетерминал грамматики (S = A15).
Заметим, что условие A Ф B, используемое на шаге 1 алгоритма 1, существенно. Оно предотвращает бесконечный рост уровней.
Рис. 2. Граф зависимости нетерминалов КС-грамматики
2. КАСКАДНОЕ ВЫЧИСЛЕНИЕ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
Используя результат топологической сортировки нетерминалов и правила исходной КС-грамматики, будем строить регулярные выражения для всех нетерминалов, исходя из следующих соображений.
Вычисление регулярных значений нетерминалов, представленных регулярными выражениями, опирается на априорныге значения, порождаемые правилами грамматики, альтернативы которых представлены терминалами грамматики. Такие априорные значения всегда существуют, поскольку грамматика приведённая. Все они относятся к нетерминалам уровня 0.
В рассматриваемом примере (см. табл. 2) это нетерминалы А1, А4 и А12 и соответствующие регулярные выражения для них V! = ('+'; '-'), V, = ('\' ; 'е') и Уп = (ё).
Будем использовать массив У[1.. п], где п - число нетерминалов грамматики для хранения правых частей регуляризованных правил, используя для доступа к его элементам номер нетерминала. Так, в нашем примере У[1] = Vv У[4] = V,, У[12] = V12.
Задав регулярные значения для всех нетерминалов уровня 0, мы инициализировали процесс построения регулярных значений нетерминалов уровня 1, 1 < I < т, по значениям нетерминалов предыдущих уровней. При этом мы можем быть уверены, благодаря выполненной топологической сортировке нетерминалов, что в массиве У уже существуют регулярные значения нетерминалов, необходимые для вычисления значений нетерминалов уровня I путём замещения
вхождений нетерминалов в альтернативы исходных правил КС-грамматики соответствующими регулярными выражениями из массива У.
Обращаясь к примеру, по матрице зависимости (табл. 1) определяем, что от регулярного значения нетерминала А1, равного VI, зависит значение нетерминала А2 и только оно, и, стало быть, замещая в правиле для А2 вхождение А1 значением VI, получаем регулярное выражение V2 = (('+' ; '-'), е) в качестве правой части нового правила для нетерминала А2. В массиве У оно сохраняется под индексом 2: У[2] = УТ
Аналогичные рассуждения приводят к заключению, что регулярное значение V, = ('\' ; 'е') должно передаваться в правую часть правила для А5, а = (ё) - в А13. В результате подстановок получаем регулярные выражения У5 = (('\' ; 'е'), (('+' ; '-'), е), (ё)+) и = ((ё), (ё)*) в качестве правых частей новых правил для нетерминалов А5 и А13 уровня 1. Они также фиксируются в массиве У как элементы с индексами 5 и 13: У[5] = Г5, У[13] =
Затем мы переходим к вычислению значений нетерминалов 2-го уровня. В нашем примере это А14. После подстановки в исходном правиле для А14 вместо А13 значения из У[13], получаем У14 = (((ё), (ё)*)), которое фиксируется в массиве У : У[14] = Г14.
Подобным же образом вычисляются регулярные значения нетерминалов следующих уровней вплоть до максимального, на котором находится всегда один - начальный - нетерминал грамматики. Его регуляр-
Табл. 2. Распределение нетерминалов по уровням
А, А2 Аз А4 А5 Аб А7 А8 А, А,о А,, А,2 А,з А,4 А,5
8 Т
7 Т
6 Т
5 Т
4 Т Т
3 Т Т Т
2 Т
1 Т Т
0 Т Т Т
ное значение и есть цель преобразований исходной КС-грамматики.
Напомним, что в правилах исходной грамматики подстановки регулярных значений производятся после устранения рекурсии, если она имеет место в данном правиле.
Ход преобразований исходной КС-грамматики примера 1 показан в табл. 3.
В ней представлены исходные правила, относящиеся к нетерминалам последовательных уровней 0, 1, 2, ..., 8, и соответствующие им регулярные выражения. При этом за первыми представлениями этих значений, получаемых автоматически, следуют регулярные выражения, получаемые за счёт искусного (неавтоматического) применения эквивалентных тождеств.
Итак, регуляризованная КС-грамматика, эквивалентная исходной, есть ЯБМР-грам-матика (см. рис. 3), или приведённая к «красивому» виду (см. рис. 4).
Описанный способ получения регулярных выражений на основе топологической сортировки нетерминалов по отношению зависимости между ними естественно назвать каскадным1 методом регуляризации грамматики. Далее приводятся две синтаксические граф-схемы, соответствующие этим грамматикам (см. рис. 5 и рис. 6).
Заметим, что конечный автомат, построенный по грамматике О' имеет 16 состояний, конечный автомат, построенный по грамматике О'', имеет 9 состояний, а минимальные автоматы после оптимизации со-
О' = ({А 15}, {ё, , '.', , 'е', '+' ; '-'} ,
{А 15: (((ё), (ё)*) ; (((((ё), (ё)*)) ; е), '.', ((ё), (ё)*)) ; (((ё), (ё)*), ((((ё), (ё)*)) ; е),'.', ((ё), (ё)*)) , (('\' ; 'е'), ((((('+' ; "-') , е), е)), ((ё), (ё)*)))).}, А,,)
Рис. 3.
О'' = ({А15}, {ё, , '.', '\' , 'е', '+' ; '-'}, {А15: (ё+; ё*, '.', ё+), [('\' ; 'е'), ['+' ; '-'], ё+].}, А,,)
Рис. 4.
Рис. 5. Синтаксическая граф-схема чисел Алгола 68 - грамматика О'
Рис. 6. Синтаксическая граф-схема чисел Алгола 68 - грамматика О''
1 Метафора, естественная для автора, жителя Петергофа, столицы фонтанов и водяных каскадов.
Табл. 3. Порядок вычислений регулярных значений нетерминалов
Уровень ПРАВИЛА РЕГУЛЯРНЫЕ ЗНАЧЕНИЯ
0 Ль '+' ; '-'. А4: ; 'е'. Л12: '0'; '1'; '2'; '3'; '4'; '5'; '6'; '7'; '8'; '9'. К = ('+' ; '-') "] К4 = ('\' ; 'е') >- Опорные значения К12 = (ё) J
Подстановка значений VI, К12 в правые части правил для нетерминалов уровня 1
1 Л2: А ; е. А13: Л12 ; А13 , Л12 ° А12, (А12)*. К2 = (('+' ; '-') , е) ° (['+' ; '-']) К13 = ((ё), (ё)*) ° Устранение левой рекурсии
Подстановка значения К13 в правую часть правила для нетерминала уровня 2
2 А14: Л13. К14 = ((ё), (ё)*) °
Подстановка значений К2 , К14 в правые части правил для нетерминалов уровня 3
3 А3: А , А14. Л: '.' , А14. = '.' , ((ё), (ё)*). А9: Лм. К3 = ((('+' ; '-'), е), ((ё), (ё)*)) ° ['+' ; '-'], К = '.', ((ё), (ё)*) ° '.', К, = ((ё), (ё)*) °
Подстановка значений К3 , в правые части правил для нетерминалов уровня 4
4 А5: А4 , А3. А10: А ; е. К = ('\' ; 'е'), (((('+' ; '-'), е)), ((ё), (ё)*)) ° ° ('\' ; 'е'), ['+' ; '-'], (ё)+ Кю = ((((ф, (ё)*)) ; е) ° ё*
Подстановка значений К8, Кю в правую часть правила для в нетерминала уровня 5
5 Аи: Лю , Л8. К„ = (((((ё), (ё)*)) ; е), '.', ((ё), (ё)*)) ° ° ё*, '.',
Подстановка значений Кц, К14 в правую часть правила для нетерминала уровня 6
6 Аб: А14 ; Лц. К6 = ((ё), (ё)*), ((((ё), (ё)*)) ; е), '.', ((ё), (ё)*) ° ° ; ё*, '. ',
Подстановка значений в правую часть правила для нетерминала уровня 7
7 А7: А , А5. К7 = (((ё), (ё)*), ((((ё), (ё)*)) ; е), '.', ((ё), (ё)*)), (('\' ; 'е'), (((('+' ; '-'), е), ((ё), (ё)*)))) ° ° (ё+; ё*, '.', ё+), ('\' ; 'е'), ['+' ; '-'],
Подстановка значений К7, Кп,К14 в правую часть правила для нетерминала уровня 8
8 А15: А14 ; Ац ; Л7. К15 = ((ё), (ё)*) ; (((((ё), (ё)*)) ; е), '.', ((ё), (ё)*)) ; (((ё), (ё)*), ((((ё), (ё)*)) ; е), '.', ((ё), (ё)*)) , (('\' ; 'е'), ((((('+' ; '-'), е), е)), ((ё), (ё)*)))) ° ° ; ё*, '.', ; (ё+; ё*, '.', ('\' ; 'е'), ['+' ; '-'], ° ° (ё+; ё*, '.', ё+), [('\' ; 'е'), ['+' ; '-'],
впадают и имеют 7 состояний (см. табл. 1 в [2]). Это значит, что в 8УКТЛХ-технологии нет нужды заботиться о «красоте» грамматики - любая даёт минимальный конечный автомат. Однако получение «красивой» грамматики автоматически является трудной проблемой, достойной темой дипломной работы для ИТ-студентов.
Замечание. Необходимым и достаточным условием применимости метода каскадной регуляризации КС-грамматики является отсутствие циклов в графе зависимости её нетерминалов.
Циклы, если они существуют, обнаруживаются по ходу алгоритма 1 сами собой, когда ещё не все нетерминалы распределены по уровням, а на шаге 2 в результате исключения нетерминалов текущего верхнего уровня, уже распределённых по всем предыдущим уровням, не остаётся ни одного.
Если угодно, можно использовать алгоритм 1 специально как логическую функ-
цию, которая отвечает на вопрос: существует ли в данном графе цикл или нет. Её значение истина, если процесс распределения вершин графа по уровням, заканчивается успешно (все вершины графа распределены), и ложь, когда он прерывается на шаге 2.
ЗАКЛЮЧЕНИЕ
В статье приведён алгоритм топологической сортировки по отношению зависимости нетерминалов КС-грамматики. Причём некоторые особенности именно этого отношения явно присутствуют в описании алгоритма сортировки. Однако не трудно его переписать в терминах, независимых от конкретных свойств отношения, по которому производится топологическая сортировка. Эта задача оставляется в качестве упражнения читателю, как и сравнение с алгоритмом на графах, описанному в [5].
Литература
1. Пересмотренное сообщение об Алголе 68. Под редакцией А. ван Вейнгаарден, Б. Майу, Дж. Пек, К. Костер и др. М., 1979.
2. Мартытенко Б.К. Регулярные языки и КС-грамматики // Компьютерные инструменты в образовании. 2012, № 1. С. 14-20.
3. Мартытенко Б.К. Синтаксически управляемая обработка данных. 2-издание, исправленное и дополненное. Ленинград: СПбГУ, 2004.
4. Мартытенко Б.К. Языки и трансляции. Ленинград: СПбГУ, 2004.
5. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы. Построение и анализ. МЦНМО, Москва, 1999.
Abstract
The method for the regularization of reduced non-self-embedding context-free grammars, based on the topological sorting of nonterminals of the grammar according the relation of the dependence defined by the grammar rules, is described.
Keywords: context-free grammar, regular expression, dependence relation, topological sorting of nonterminals, equivalent conversion of grammar.
Мартыненко Борис Константинович, доктор физико-математических наук, профессор кафедрыы информатики математико-механического факультета СПбГУ, [email protected]
© Наши авторы, 2012. Our authors, 2012.