Минимизация синтаксических диаграмм с многовходовыми компонентами | ПДМ. 2018. № 41. DOI: 10.17223/20710410/41/9

Минимизация синтаксических диаграмм с многовходовыми компонентами

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

Minimization of syntax diagrams with multiport components.pdf Введение Синтаксические диаграммы Вирта представляют собой наглядный, интуитивно понятный графический способ задания синтаксиса языка, они используются для документирования языков программирования [1, 2] и в проектировании трансляторов [37]. Для построения трансляторов линейной сложности применяются детерминированные синтаксические диаграммы [8, 9], при этом размер транслятора зависит от размера синтаксической диаграммы. Поэтому с целью уменьшения размера транслятора целесообразно использовать «компактные» синтаксические диаграммы. Характерной особенностью классических синтаксических диаграмм Вирта является то, что каждая компонента имеет ровно один вход и один выход. Эти ограничения позволяют легко строить наглядные и понятные диаграммы для задания контекстно-свободных языков. В работе рассматриваются синтаксические диаграммы, в которых снято ограничение на количество входов в компонентах. Это позволяет сократить количество компонент и узлов диаграммы. Для сокращения количества компонент и узлов вводится отношение на множестве узлов, обладающее свойством эквивалентности, и предлагается алгоритм, позволяющий разбить множество узлов на классы эквивалентности и на основе этого преобразовать исходную диаграмму в более компактную. Платой за компактность представления языка в виде синтаксической диаграммы с многовходовыми компонентами является некоторое снижение наглядности по сравнению с классическими диаграммами. Снижение наглядности представления языка в данном случае не является существенным, так как все преобразования могут быть выполнены автоматически по описанным алгоритмам. В первой части работы поясняются понятия, связанные с диаграммами Вирта (ДВ), необходимые для дальнейшего изложения. Во второй части даётся определение синтаксической диаграммы с многовходовыми компонентами (СД) и способ преобразования ДВ в эквивалентную ей «вырожденную» СД. Далее определяются отношение на множестве узлов СД, названное отношением сильной эквивалентности; преобразование СД, сохраняющее сильную эквивалентность; алгоритм разбиения множества узлов на классы эквивалентности и сокращения СД. Все алгоритмы сопровождаются примерами их применения. 1. Синтаксические диаграммы Вирта На рис. 1 представлен пример синтаксической диаграммы Вирта. Эта ДВ состоит 10 >•-► W а )->Ф-> V16 и -► W ъ ->•-► в -U- 6 >ф 12 А 17 а 13 1 "М i -И ь -Н с 14 8 18 В 5 15 9 5 Ь Рис. 1. Синтаксическая диаграмма Вирта из трёх компонент, соответствующих нетерминалам S, A и B (S - начальный нетерминал). Прямоугольниками изображены нетерминальные вершины, в которые вписаны нетерминалы, кружками - терминальные вершины, в которые вписаны терминалы, жирными точками - узлы, обозначенные натуральными числами. Множество дуг разбивается на четыре подмножества: 1) входящие дуги, которые входят в узлы из одной точки входа; 2) выходящие дуги, которые выходят из узлов и входят в одну точку выхода; 3) внутренние дуги, которые связывают либо узлы с терминальными или нетерминальными вершинами, либо терминальные или нетерминальные вершины с узлами; 4) е-дуги, связывающие между собой узлы (в примере на рис. 1 таких дуг нет). Точки входа и выхода на диаграмме не показываются. Узлы, в которые входят входящие дуги, называются начальными (в примере на рис. 1 начальными являются узлы 1, 2 и 3), а узлы, из которых выходят выходящие дуги,-заключительными (в примере на рис. 1 заключительными являются узлы 16, 17 и 18). С помощью ДВ можно получить (вывести) любую цепочку языка, заданного этой ДВ. Рассмотрим подробно способы получения цепочки языка. Пусть ДВ G состоит из компонент G1, G2,... , G|n|, где |N| -мощность множества нетерминалов. Рассмотрим некоторой путь в компоненте Gi от узла u до какого-либо заключительного узла в этой компоненте. Пройдём по нему и в процессе прохождения будем добавлять в изначально пустую цепочку а символы, записанные в терминальных и нетерминальных вершинах. Цепочку а будем называть цепочкой, связывающей узел u с заключительным узлом компоненты Gi. Множество всех цепочек, связывающих узел u с каким-либо заключительным узлом, образует язык L(u). Очевидно, что язык L(Gi) равен объединению всех L(uj), где uj -начальный узел компоненты Gi. Вывод цепочки языка, заданного ДВ, можно выполнить по следующему правилу: 1. Записать цепочку, принадлежащую языку L(G1), где компонента G1 соответствует начальному нетерминалу. 2. Если цепочка содержит некоторый нетерминал Ni, то заменить его цепочкой языка L(Gi) и выполнить п. 2, иначе - вывод закончить. Ниже представлен вывод цепочки в ДВ, изображенной на рис. 1: S ^ aAa ^ abBba ^ abcba. Процесс вывода терминальной цепочки в ДВ можно представить и по-другому - как «движение» по дугам от точки входа начальной компоненты к точке выхода. При этом если дуга идёт в терминальную вершину, то вписанный в неё символ добавляем в терминальную цепочку; если в нетерминальную, то переходим в соответствующую компоненту и движемся по ней аналогичным образом до точки выхода, после чего возвращаемся в предыдущую компоненту и продолжаем движение. После прохождения выходной дуги начальной компоненты в терминальную цепочку добавляем концевой маркер (Ч) и вывод заканчивается. Символ x, который может быть добавлен в терминальную цепочку непосредственно после прохождения дуги e, принадлежит множеству выбора дуги e (x Е ВЫБОР(е)). В множестве ДВ можно выделить класс детерминированных ДВ. В детерминированной ДВ каждая компонента имеет только один начальный узел, не содержит е-дуг и каждый её узел детерминированный. Узел является детерминированным, если множества выбора любых двух дуг, выходящих из него, не пересекаются. Детерминированные ДВ являются основой для построения программ-распознавателей линейной сложности [8, 9], поэтому в дальнейшем будем рассматривать только детерминированные ДВ. 2. Синтаксические диаграммы с многовходовыми компонентами Синтаксическую диаграмму с многовходовыми компонентами (СД) определим восьмеркой R = (T, U, U', U", u0, G, FT, FU), где - T - конечное множество терминалов; - U - конечное множество узлов; - U' - конечное множество начальных узлов, U' С U; - U" - конечное множество заключительных узлов, U" С U; - u0 - стартовый узел, u0 Е U'; - G = (V, E) -ориентированный граф, V = VT U U U, VT - множество терминальных вершин, Vn -множество нетерминальных вершин; E = E1 U E2, E1 С С U х (VT U Vn ) - множество дуг, выходящих из узлов и входящих в терминальные или нетерминальные вершины; E2 С (VT U V^) х U - множество дуг, выходящих из терминальных или нетерминальных вершин и входящих в узлы; - Ft : VT ^ T - отображение множества терминальных вершин в множество терминалов; - Fu : VN ^ U' - отображение множества нетерминальных вершин в множество начальных узлов. Терминальная вершина изображается на диаграмме кружком, в который вписан терминал в соответствии с отображением Ft. Нетерминальная вершина изображается прямоугольником, в который вписан узел из множества начальных узлов в соответствии с отображением Fu. Узел изображается жирной точкой, которая отмечается соответствующим номером. Начальные узлы отмечаются входящей стрелочкой, стартовый узел - жирной входящей стрелочкой, заключительные - выходящей стрелочкой. Дуга может выходить из терминальной или нетерминальной вершины и входить в узел, или выходить из узла и входить в терминальную или нетерминальную вершину. В каждую терминальную и нетерминальную вершину входит только одна дуга; из них выходит только одна дуга. На количество дуг, входящих в узлы и выходящих из узлов, ограничений нет. Определим способ получения цепочки языка, заданного СД. Будем говорить, что цепочка а, состоящая из терминалов и/или начальных узлов, связывает узел u СД с заключительным узлом uk, если её можно получить, «двигаясь» в СД от узла м к узлу Uk и выписывая из вершин по пути символы (терминалы или начальные узлы) в изначально пустую цепочку. Множество всех цепочек, связывающих узел м с заключительными узлами, обозначим L(u). Чтобы получить цепочку языка, заданного СД со стартовым узлом м0, возьмём цепочку, принадлежащую L(u0). Если она содержит некоторый начальный узел ui, заменим его на цепочку из множества L(ui). Если новая цепочка содержит начальный узел, то аналогичные действия повторяем. Полученная таким образом цепочка, не содержащая начальных узлов, принадлежит языку, заданному СД. ДВ можно преобразовать в эквивалентную ей СД, заменив записанный в каждой нетерминальной вершине нетерминал на его начальный узел и определив начальный узел начальной компоненты (соответствующей начальному нетерминалу) стартовым. На рис. 2 представлена СД, полученная из ДВ (рис. 1). Сравнивая способы получения цепочек языка по ДВ и СД, можно сделать вывод, что язык, заданный ДВ, равен языку, заданному СД, полученной из ДВ описанным способом. Процесс получения одной из цепочек языка, заданного СД на рис. 2, можно представить следующим образом: 1 ^ а2а ^ ab3ba ^ abcba. Такой способ преобразования позволяет получить «вырожденную» СД, в которой каждая компонента имеет один вход. Преобразования, описанные далее, позволят получить СД с многовходовыми компонентами и меньшим количеством компонент. Для СД точно так же, как для ДВ, определяются понятия множество выбора дуги и детерминированность. В дальнейшем будем рассматривать СД, полученные из детерминированных ДВ, следовательно, СД тоже будут детерминированными. 10 4 М a -и « ¥- 11 5 -И Ъ 12 б -W а 17 л -и « 13 1 ■М Ъ 14 8 18 15 9 М ъ -И * -И с Рис. 2. Синтаксическая диаграмма с многовходовыми компонентами 3. Отношение сильной эквивалентности Для определения отношения сильной эквивалентности на множестве узлов введём следующие обозначения: 1) (ui,t,uj) -указывает на то, что в СД существует путь длины два из узла U в узел Uj, дуга из узла и идёт в вершину с терминалом t, а из неё идёт дуга в узел Uj; 2) (ui, M, Uk, Uj) - указывает на то, что в СД существует путь длины два из узла и в узел Uj, дуга из узла U с множеством выбора M идёт в вершину с узлом Uk, а из неё идёт дуга в узел Uj. Пара узлов (wi,wi) принадлежит отношению Eесли выполнены следующие условия: 1) путь (Ui, t, Uj) существует тогда и только тогда, когда существует путь (wi, t, Uj) и (Ui,Uj) G E°, где t принадлежит множеству терминалов; 2) путь (Ui,M, Uk, Uj) существует тогда и только тогда, когда существует путь («i,M,U;k,Uj), (Uj,Uj) G E° и (Uk,U;k) G E°, где Uk и U;k принадлежат множеству начальных узлов; 3) Ui G U" тогда и только тогда, когда Ui G U". Из определения отношения E° следует, что цепочка а связывает узел Uj с заключительным узлом тогда и только тогда, когда цепочка а' связывает узел uj с заключительным узлом, где а и а' - цепочки одинаковой длины и i-й символ цепочки а либо равен i-му символу цепочки а' ^ = аj), либо пара начальных узлов ^^j) принадлежит отношению E°. Цепочки а и а' назовём сильно эквивалентными, а отношение E° - отношением сильной эквивалентности. На множествах цепочек введём следующие операции сравнения: 1) L1 С° L2 - истина, если для каждой цепочки множества L1 существует сильно эквивалентная цепочка из множества L2, иначе - ложь; 2) L1 =° L2 тогда и только тогда, когда L1 С° L2 и L2 С° L1. Операции =° и С° будем называть соответственно равенством и включением. Отношение E° можно теперь определить так: E° = {(uj,uj): L(uj) =° L(uj)}. Очевидно, что 1) если L1 = L2, то L1 =° L2; 2) если L1 С L2, то L1 С° L2; 3) L1 U L2 С° L3 тогда и только тогда, когда L1 С° L3 и L2 С° L3. Для множеств L1, L2, L3 и L4, таких, что L1 =° L3 и L2 =° L4, верно: 1) L1 U L2 =° L3 U L4; 2) L1L2 =° L3L4; 3) L1 =° L3. Рассмотрим две СД R = (T, U1, U'1, U''1, u0, G1, F^,, F^) и R = (T, U2, U'2, U''2, u2, G2, Fy, F2), такие, что (u0, u^) е E°. Докажем, что L(R1) = L(R2), т. е. эти СД определяют один и тот же язык. Пусть на первом шаге вывода в СД R1 получена промежуточная цепочка а, принадлежащая языку L(u0). Из L(u0) =° ) следует, что на первом шаге вывода в СД R2 можно получить промежуточную цепочку а', сильно эквивалентную цепочке а. Далее на каждом шаге вывода в СД R1 и R2 будем получать сильно эквивалентные цепочки вплоть до терминальной цепочки. Терминальные сильно эквивалентные цепочки равны. Пусть на первом шаге вывода в СД R2 получена промежуточная цепочка а, принадлежащая языку L(u0). Из L(u0) =° ) следует, что на первом шаге вывода в СД R1 можно получить промежуточную цепочку а', сильно эквивалентную цепочке а. Далее на каждом шаге вывода в СД R1 и R2 будем получать сильно эквивалентные цепочки вплоть до терминальной цепочки. Терминальные сильно эквивалентные цепочки равны. В любом случае терминальные цепочки, которые можно получить при выводе в одной СД, можно получить и в другой СД. 4. Преобразование, сохраняющее сильную эквивалентность Допустим, что над СД R1 = (T, U1, U'1, U''1, u,1,, G1, F^,, F^) выполнено преобразование и в результате получена СД R2 = (T, U2,U'2, U''2,u2,G2,Fy, F^), такая, что (u0,u^) е E°. В этом случае будем говорить, что над СД R1 выполнено преобразование, сохраняющее сильную эквивалентность. Результат преобразования - СД R2, которая эквивалентна СД R1. Рассмотрим преобразование СД, сохраняющее сильную эквивалентность. Пусть в СД R = (T,U,U/1,U//,u0 ,G1,FT, Fu ): U'1 = {u0,ub...u/ ,...,u„} - множество начальных узлов; (uj, uj) G Eузлы u и uj не являются начальными. Преобразование заключается в том, что все дуги, входящие в узел Uj, перенаправляются в узел uj. В результате преобразования получается СД R2 = (T, U, U/2, Uu0, G2, FT, F^). Докажем, что это преобразование сохраняет сильную эквивалентность. Из множества начальных узлов U/1 выбираем произвольно узел u/. Введём следующие обозначения: 1) L^u/, uj) -множество цепочек, связывающих начальный узел u/ с узлом u в исходной СД; 2) L1(uj,U//) -множество цепочек, связывающих узел u с заключительными узлами U" в СД R1; 3) L^u/,uj,U//) -множество цепочек, связывающих начальный узел u/ с заключительными узлами Uсоответствующих путям, проходящим через узел uj в СД R1; L1(u/,uj,U//) = L1(u/,u^L^ui, U") -множество L1(u/,uj,U//) равно конкатенации множеств L^u/, uj) и L1(uj, U"); 4) L1(u/, uj, U") -множество цепочек, связывающих начальный узел u/ с заключительными узлами Uсоответствующих путям, не проходящим через узел uj в СД R1; 5) L1(u/, U") -множество цепочек, связывающих начальный узел u/ с заключительными узлами U" в СД R1; L1(u/, U") = L1(u/,uj,U//) U L1(u/, u^, U") = = L1(u/,uj)L1(uj,U//) U L1(u/,uj, U"); 6) L2(u/, uj) -множество цепочек, связывающих начальный узел u/ с узлом uj в СД R2; L2(u/,uj) = L1(u/,uj) U L1(u/, uj); 7) L2(u/, uj, U") -множество цепочек, связывающих начальный узел u/ с заключительными узлами Uсоответствующих путям, проходящим через узел uj в СД R2; L2(u/, uj, U") = L2(u/,uj)L1(u/,U") = (L1(u/,uj) U L^u/^L^u/, U") = = L1(u/,uj)L1(uj,U//) U L1(u/,uj)L1(uj,U//); 8) L2(u/, U") -множество цепочек, связывающих начальный узел u/ с заключительными U" в СД R2; L2(u/,U") = L2(u/,uj,U") U L1(u/,uj, U") = = L1(u/,uj)L1(uj,U//) U L1(u/,uj)L1(uj,U//) U L^u/,uj, U"). Для доказательства того, что рассматриваемое преобразование сохраняет сильную эквивалентность, необходимо доказать, что L1(u/, U") =° L2(u/, U"), т. е. L1(u/, uj)L1(uj, U") U L1(u/,uj, U") =° =° L1(u/,uj)L1(uj,U//) U L1(u/,uj)L1(uj,U//) U L1(u/,uj, U"). В свою очередь, L1(u/, U") =° L2(u/, U"), если имеют место включения 1) L1(u/, U") С С °L2(u/,U") и 2) L2(u/,U") С °l/(u/,U"). 1. L1(u/ ,U") С° L2(u/,U"), если L1(u/,ui)L1(ui, U") С° L2(u/, U") и L1(u/,uj, U") С °L2(uf, U"). Истинность первого условия следует из того, что L1(u/,uj)L1(uj, U") С° L2(u/, U") по определению и L1(uj, U") =° L1(uj, U"), так как (u^uj) G E°. Истинность второго условия следует из того, что любая цепочка из множества L1(uf,ui, U") включена либо в L1(u/,ui)L1(ui, U"), либо в L1(u/,ui, Uw), т.е. она соответствует либо пути, проходящему через узел ui, либо пути, не проходящему через узел ui. 2. L2(u/,U//) С° Li(u/,U//), если Li(u/,ui)Li(ui,U//) С° Li(u/,U//), Li(u/, ui)Li(ui, U//) С° Li(u/, U//) и Li(u/,ui,U//) С° Li(u/,U//). Истинность первого условия следует из того, что любая цепочка из множества L1(u/,ui)L1(ui, U//) включена либо в L1 (u/,ui)L1 (ui,U//), либо в L1(u/,ui, U//), т.е. она соответствует либо пути, проходящему через узел ui, либо пути, не проходящему через узел ui. Истинность второго условия следует из того, что L1(u/, ui)L1(ui, U//) С L1(u/, U//) по определению и L1(ui, U//) =° L1(ui, U//), так как (ui,ui) G E°. Истинность третьего условия следует из того, что любая цепочка из множества L1(u/,ui,U//) включена либо в L1(u/,ui)L1(ui, U//), либо в L1(u/,ui,U//), т.е. она соответствует либо пути, проходящему через узел ui, либо пути, не проходящему через узел ui. Таким образом, L1(u/, U//) =° L2(u/, U//), следовательно, рассматриваемое преобразование сохраняет сильную эквивалентность. После выполнения преобразования в узел ui не будет входить ни одна дуга. Он станет недостижимым из начальных узлов, поэтому его нужно удалить вместе с выходящими дугами, вершинами (терминальными и нетерминальными), в которые входят эти дуги, и дугами, выходящими из удаляемых терминальных и нетерминальных вершин. В результате выполнения описанных действий может получиться СД с узлами, в которые не входят дуги. Исключение недостижимых узлов, дуг, терминальных и нетерминальных вершин необходимо повторять, пока это возможно. Если узел ui начальный или стартовый, то узел ui нужно сделать соответственно начальным или стартовым. Узел ui будет недостижимым, и его нужно удалить по описанным выше правилам. После этого некоторые нетерминальные вершины будут содержать несуществующий узел ui. В таких вершинах его нужно заменить на ui. Рассмотренное преобразование можно назвать «стягиванием» сильно эквивалентных узлов в один узел. Очевидно, что таким образом можно «стянуть» в один узел класс сильно эквивалентных узлов, что уменьшит размер СД. Если при этом «стягиваемые» узлы принадлежат различным компонентам, то происходит соединение компонент в одну, в которой начальными узлами будут начальные узлы соединяемых компонент. Таким образом появляются компоненты со многими входами. 5. Разбиение множества узлов на классы эквивалентности по отношению сильной эквивалентности Отношение сильной эквивалентности определяет разбиение множества узлов СД на классы эквивалентности. Применим метод последовательного разбиения. Сначала разобьём узлы СД на подмножества так, чтобы заключительные узлы попали в одно подмножество, а все остальные - в другое. Для СД на рис. 2 это будут подмножества Q1 = {1, 2, 3, 4, 5,6, 7, 8, 9,10,11,12,13,14,15} и Q2 = {16,17,18}, которые образуют разбиение R = {Q1, Q2}. Узлы, принадлежащие различным подмножествам, явно неэквивалентны (для них нарушено третье условие сильной эквивалентности); два узла из одного подмножества могут быть неэквивалентными, так как при разбиении мы не учитывали первое и второе условия принадлежности пары узлов отношению сильной эквивалентности. Для учёта этих условий построим таблицу T, в которой столбцы соответствуют узлам СД, а строки - терминалам. Клетку таблицы в строке t и столбце u будем обозначать T[t,u]. Пути (uj,t, Uj) соответствует клетка T[t, Uj]. Если Uj Е Qr, то в клетку T[t,Uj] запишем r. Пути (uj,M,Uk,Uj) соответствуют клетки T[t, Uj], такие, что t Е M. Если Uj Е Qr и uk Е Qs, то в клетку T[t,Uj] запишем (r, s). Если узлы u и uj принадлежат одному подмножеству и T[t,uj] = T[t,uj], то это говорит о том, что пара узлов uj и uj не принадлежит отношению сильной эквивалентности и узлы uj и uj нужно включить в разные подмножества нового разбиения R'. Анализируя таблицу T, формируем новое разбиение R'. Подмножество Qk разбиения R' формируется из элементов некоторого подмножества Qk разбиения R: Qk является максимальным по мощности подмножеством множества Qk, таким, что для каждой пары узлов uj и uj, принадлежащих подмножеству Qk, для всех строк t таблицы верно, что T[t,Uj] = T[t,uj]. Если R' = R, то полагаем R = R', заново строим таблицу T по описанным правилам и формируем новое разбиение. Если R' = R, то R' - множество классов эквивалентности. Первая таблица T для СД на рис. 2 представлена в табл. 1. Таблица 1 Терминалы Qi Q2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 b 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 c 2 2 1 1 1 1 1 1 1 1 1 1 1 1 По табл.1 видно, что подмножество Qi разбивается на подмножества {1}, {2, 3}, {4, 5,6, 7, 8, 9}, {10,12,14}, {11,13,15}, а подмножество Q2 не разбивается. В результате получаем разбиение {{1}, {2, 3}, {4, 5, 6, 7, 8,9}, {10,12,14}, {11,13,15}, {16,17,18}}. По нему строим новую таблицу T (табл. 2). Таблица 2 Терминалы Qi Q2 Q 3 Q4 Q5 Q6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a 3 3 3 4 5 4 5 4 5 6 6 6 2 2 2 2 2 2 b 3 3 3 4 5 4 5 4 5 6 6 6 2 2 2 2 2 2 c 6 6 4 5 4 5 4 5 2 2 2 2 2 2 По табл. 2 видно, что подмножество Q3 = {4, 5, 6, 7, 8, 9} разбивается на подмножества {4, 6, 8} и {5, 7, 9}, а остальные подмножества не разбиваются. В результате получаем разбиение {{1}, {2, 3}, {4,6, 8}, {5, 7,9}, {10,12,14}, {11,13,15}, {16,17,18}}. По нему строим табл. 3. Таблица 3 Терминалы Qi Q2 Q3 Q4 Q5 Qe Q7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a 3 3 3 5 5 5 6 6 6 7 7 7 2 2 2 2 2 2 b 4 4 4 5 5 5 6 6 6 7 7 7 2 2 2 2 2 2 c 7 7 5 5 5 6 6 6 2 2 2 2 2 2 В табл. 3 нет различных столбцов, соответствующих узлам, принадлежащим одному подмножеству. Поэтому полученное разбиение является разбиением на классы эквивалентности. 6. Минимизация синтаксической диаграммы с многовходовыми компонентами на основе отношения сильной эквивалентности Используя отношение сильной эквивалентности на множестве узлов СД Ri, можно построить СД R2, эквивалентную R1, которая будет иметь не больше узлов и компонент, чем R1, а компоненты R2 могут иметь большее количество входов, чем компоненты R1. Сокращение количества узлов достигается за счёт «стягивания» всех узлов, принадлежащих одному классу сильной эквивалентности, в один узел. Для преобразования СД R1 в СД R2 удобно R1 представить в виде таблицы и преобразовать её в таблицу R2 (СД R2 будем называть сокращённой). Столбцы таблицы соответствуют узлам СД, а строки - терминалам и начальным узлам, которые встречаются в нетерминальных вершинах. Пути (u^^u^) соответствует клетка T[x, ui], в которой записан узел uj. Начальные узлы отметим стрелкой, стартовый узел - жирной стрелкой, а заключительные - символом «1». Таблица СД (рис.2) представлена в табл. 4. Таблица 4 Таблица синтаксической диаграммы с многовходовыми компонентами Терминалы и начальные 1 1 1 1 1 1 узлы 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a 4 6 8 16 17 18 b 5 7 9 16 17 18 c 17 18 2 10 12 3 11 13 14 15 Отношение сильной эквивалентности определяет разбиение множества узлов на классы {{1}, {2, 3}, {4, 6,8}, {5, 7, 9}, {10,12,14}, {11,13,15}, {16,17,18}}. Возьмём по одному узлу из каждого класса и получим множество узлов {1, 2, 4, 5,10,11,16} сокращённой СД. В таблице СД (табл. 4) оставим только те столбцы, которые соответствуют узлам сокращённой СД. Если строка таблицы отмечена узлом, не принадлежащим множеству узлов сокращённой СД, то отметим её сильно эквивалентным ему узлом сокращённой СД. Строки, отмеченные одинаковыми узлами, объединим в одну. Если в клетке полученной таблицы встретится узел, который не принадлежит множеству узлов сокращённой СД, то его нужно заменить на сильно эквивалентный ему узел сокращённой СД. Если узел сокращённой СД сильно эквивалентен начальному (стартовому) узлу исходной СД, то нужно сделать его начальным (стартовым). Таблица сокращённой СД, эквивалентной СД на рис. 2, приведена в табл. 5, её графическое представление изображено на рис. 3. Эта СД содержит значительно меньше узлов, чем исходная (рис. 2), и одну компоненту с двумя входами. Таблица 5 Таблица сокращённой СД Терминалы и начальные 1 1 1 узлы 1 2 4 5 10 11 16 a 4 4 16 b 5 5 16 c 16 2 10 11 Заключение Предложенный метод минимизации позволяет преобразовать диаграмму Вирта в более компактную синтаксическую диаграмму с многовходовыми компонентами. Такая диаграмма может быть использована для построения эффективных по памяти программ-распознавателей линейной сложности.

Ключевые слова

формальный язык, синтаксическая диаграмма, отношение эквивалентности, минимизация, formal language, syntax diagram, equivalence relation, minimization

Авторы

ФИООрганизацияДополнительноE-mail
Рязанов Юрий ДмитриевичБелгородский государственный технологический университет им. В. Г. Шуховадоцентrazanov.yd@bstu.ru
Всего: 1

Ссылки

Jensen K. and Wirth N. Pascal User Manual and Report. N.Y.: Springer Verlag, 1975. 167p.
Jensen K. and Wirth N. Pascal User Manual and Report. Berlin, Heidelberg: Springer Verlag, 1974. 170 p.
Легалов А.И., Швец Д. А., Легалов И. А. Формальные языки и трансляторы. Красноярск: Сибирский федеральный университет, 2007. 213 с.
Карпов Ю. Г. Теория и технология программирования. Основы построения трансляторов. СПб.: БХВ-Петербург, 2005. 272с.
Овердлов С. З. Методы трансляции. Вологда: ВоГУ, 2016. 235 с.
Овердлов С. З. Конструирование компиляторов. Saarbruken: Lap Lambert, 2015. 571с.
Мартыненко Б. К. Синтаксические диаграммы Н. Вирта и граф-схемы в Syntax-технологии // Компьютерные инструменты в образовании. 2014. №2. С. 3-19.
Рязанов Ю. Д., Севальнева М. Н. Анализ синтаксических диаграмм и синтез программ-распознавателей линейной сложности // Научные ведомости БелГУ. Сер. История. Политология. Экономика. Информатика. 2013. №8. С. 128-136.
Поляков В. М., Рязанов Ю. Д. Алгоритм построения нерекурсивных программ-распознавателей линейной сложности по детерминированным синтаксическим диаграммам // Вестник БГТУ им. В. Г. Шухова. 2013. №6. С. 194-199.
 Минимизация синтаксических диаграмм с многовходовыми компонентами | ПДМ. 2018. № 41. DOI: 10.17223/20710410/41/9

Минимизация синтаксических диаграмм с многовходовыми компонентами | ПДМ. 2018. № 41. DOI: 10.17223/20710410/41/9