.: [предыдущая | оглавление | следующая] :.

16.4 Алгоритм лексикографического упорядочения

Лексикографическое упорядочение позволяет упорядочить некоторое множество слов в алфавитном порядке. В данном случае необходимо сравнивать поддеревья, в узлах которых записаны некоторые слова (множество нетерминальных и терминальных слов). Поддеревья сравниваются следующим образом: производится одновременно левосторонний обход первого и второго поддеревьев и сравниваются слова, записанные в текущих узлах. Если слова равны, то производится переход к рассмотрению следующих узлов. Если неравны, то обход прекращается и определяется отношение > или < для двух сравниваемых поддеревьев. Алгоритм лексикографического упорядочения выражения состоит из двух составляющих:
       1)алгоритм упорядочения мультипликативных составляющих (упорядочиваются все сыновья узлов <T>. Назовем его TSort);
       2)алгоритм упорядочения аддитивных составляющих (упорядочиваются все сыновья узлов <E>. Назовем его DSort).
       Алгоритм упорядочения DSort первоначально упорядочивает узлы <D> рассматриваемого узла <Т> по операции. Все узлы <D> со знаком умножения переводит влево, а с делением вправо. И далее производит попарное сравнение поддеревьев <D> и перестановку, если <D1> > <D2> сначала для умножения, а потом для деления. Например, b/e * a/c будет преобразовано в b * a/e/c, а затем в a * b/c/e.
       Алгоритм упорядочения TSort аналогичен алгоритму Dsort, только вместо умножения ставится плюс, вместо деления - минус и рассматриваются поддеревья узлов <T>.
        Тогда работу всего алгоритма упорядочения можно рассмотреть на следующем примере: пусть имеется два выражения: c * b + a и a + c * b, тогда после работы алгоритма DSort получим b * c+a и a+b * c , а после работы алгоритма TSort получим a + b * c и a + b * c. Процесс преобразования синтаксических деревьев показан на рис.15.2

рис.15.2 Пример преобразования синтаксического дерева при сортировке узлов
       Свойства алгоритма сортировки основаны на использовании ASCII-кода. Если в качестве алфавита для сравнения строк символов выбрана ASCII-таблица, то после применения алгоритма сортировки:

              1)константы становятся перед неизвестными;
              2)выражения в скобках становятся перед константами;
              3)все неизвестные упорядочиваются в алфавитном порядке (в соответствии с латинским алфавитом).

.: [предыдущая | оглавление | следующая] :.