Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SPO.docx
Скачиваний:
105
Добавлен:
02.06.2015
Размер:
1.94 Mб
Скачать

20) Таблица свёрток и диаграмма состояний

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

Это можно сделать в виде таблицы, строки которой помечены нетерминальными символами грамматики, столбцы - терминальными. Значение каждого элемента таблицы - это нетерминальный символ, к которому можно свернуть пару "нетерминал-терминал", которыми помечены соответствующие строка и столбец.

Например, для грамматики G = ({a, b, #}, {S, A, B, C}, P, S), такая таблица будет выглядеть следующим образом:

P: S  C#

    C  Ab | Ba

    A  a | Ca

    B  b | Cb

Знак "-" ставится в том случае, если для пары "терминал-нетерминал" свертки нет.

 

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

(1) строят вершины графа, помеченные нетерминалами грамматики (для каждого нетерминала - одну вершину), и еще одну вершину, помеченную символом, отличным от нетерминальных, - H. Эти вершины будем называть состояниями. H - начальное состояние.

(2) соединяем эти состояния дугами по следующим правилам:

a) для каждого правила грамматики вида W  t соединяем дугой состояния H и W (от H к W) и помечаем дугу символом t;

б) для каждого правила W  Vt соединяем дугой состояния V и W (от V к W) и помечаем дугу символом t.

Диаграмма состояний для грамматики G (см. пример выше):

Тогда для диаграммы состояний применим следующий алгоритм разбора:

(1) объявляем текущим состояние H;

(2) затем многократно (до тех пор, пока не считаем признак конца цепочки) выполняем следующие шаги: считываем очередной символ исходной цепочки и переходим из текущего состояния в другое состояние по дуге, помеченной этим символом. Состояние, в которое мы при этом попадаем, становится текущим.

 

При работе этого алгоритма возможны следующие ситуации (аналогичные ситуациям, которые возникают при разборе непосредственно по регулярной грамматике):

(1) прочитана вся цепочка; на каждом шаге находилась единственная дуга, помеченная очередным символом анализируемой цепочки; в результате последнего перехода оказались в состоянии S. Это означает, что исходная цепочка принадлежит L(G).

(2) прочитана вся цепочка; на каждом шаге находилась единственная "нужная" дуга; в результате последнего шага оказались в состоянии, отличном от S. Это означает, что исходная цепочка не принадлежит L(G).

(3) на некотором шаге не нашлось дуги, выходящей из текущего состояния и помеченной очередным анализируемым символом. Это означает, что исходная цепочка не принадлежит L(G).

(4) на некотором шаге работы алгоритма оказалось, что есть несколько дуг, выходящих из текущего состояния, помеченных очередным анализируемым символом, но ведущих в разные состояния. Это говорит о недетерминированности разбора. Анализ этой ситуации будет приведен далее.

21) Метод восходящего разбора

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

оператор, процедура. Последовательность понятий и их допустимое использование в правилах определяет синтаксически правильные структуры, образующие программы. Одной из наиболее простых и широко используемых форм записи грамматик является нормальная форма Бэкуса-Наура (БНФ). Метаязык,

предложенный Бэкусом и Науром, впервые использ-ся для описания синтаксиса реального языка программирования Алгол 60. Наряду с обозначениями метасимволов, в нем использовались содержательные

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

- символ "::=" отделяет левую часть правила от правой (символ "::=" можно

читать как “является по определению”, иногда вместо "::=" используется символ

"®");

- нетерминалы обозначаются произвольной символьной строкой,

заключенной в угловые скобки "<" и ">" (нетерминалы являются именами

конструкций, определенными внутри грамматики);

- терминалы - это символы, используемые в описываемом языке;

- каждое правило определяет порождение нескольких альтернативных

цепочек, отделяемых друг от друга символом вертикальной черты "|".

Метод восходящего разбора заключается в том, что исходную цепочку пытаются “свернуть” к начальному символу S; на каждом шаге ищут подцепочку, которая совпадает с правой частью какого-либо правила вывода; если такая подцепочка находится, то она заменяется нетерминалом из левой части этого правила.

При восходящем разборе построение дерева начинается с терминальных

листьев путем подстановки правил, применимых к входной цепочке в

произвольном порядке. На следующем шаге новые узлы полученных

поддеревьев используются как листья во вновь применяемых правилах.

Процесс построения дерева разбора завершается, когда все символы входной

цепочки будут являться листьями дерева, корнем которого окажется

начальный нетерминал. Если в результате полного перебора всех возможных

правил невозможно построить требуемое дерево разбора, то рассматриваемая

входная цепочка не принадлежит данному языку.

При использовании восходящего метода на множестве терминальных и

нетерминальных символов необходимо ввести три отношения, называемые

«отношения предшествования» и обозначаемые как

Отношенияне похожи на обычные арифметические отношения

<, >, =. Отношениене является отношением эквивалентности, а отношения

и не обязательно транзитивны, т. е. для отношения предшествования не

выполняются некоторые правила, привычные для отношения арифметического

порядка. Например,

Отношения предшествования удобно занести в матрицу, в которой

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

Отношениеозначает, что обе лексемы имеют одинаковый уровень

предшествования и должны рассматриваться грамматическим процессором в

качестве одной конструкции языка. Если для пар отношения предшествования

не существует, это означает, что они не могут находиться рядом ни в одном

грамматически правильном предложении. Если подобная комбинация лексем

встретится в процессе грамматического разбора, то она должна

рассматриваться как синтаксическая ошибка.

Существуют алгоритмы автоматического построения матриц

предшествования на основе формального описания грамматики (рис 2.6).

Применение метода операторного предшествования возможно в случае,

когда отношения предшествования заданы однозначно.

Например, не должно быть одновременно отношений

и Это требование выполняется для используемой грамматики,

однако некоторые из отношений грамматики Паскаля не являются

однозначными и метод оперативного предшествования к ним не применим.

На рис. 2.7 изображен пошаговый процесс грамматического разбора

предложения присваивания в строке 14

Процесс сканирования слева направо продолжается на каждом шаге

грамматического разбора лишь до тех пор, пока не определится очередной

фрагмент предложения для грамматического распознавания, т. е. первый

фрагмент, ограниченный отношениями . Как только подобный

фрагмент выделен, он интерпретируется как некоторый очередной

нетерминальный символ в соответствии с каким-либо правилом грамматики.

Этот процесс продолжается до тех пор, пока предложение не будет

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

дерева грамматического разбора строится, начиная с оконечных узлов

вверх, в сторону корня дерева. Отсюда и возник термин «восходящий разбор».

Для метода операторного предшествования имена нетерминальных

символов несущественны. Таким образом, вся информация о грамматике и

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

предшествования

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]