- •Трансляторы, компиляторы и интерпретаторы: определение, общая схема работы. Варианты взаимодействия блоков транслятора.
- •Варианты взаимодействия блоков транслятора
- •Многопроходная организация взаимодействия блоков транслятора
- •Однопроходная организация взаимодействия блоков транслятора
- •Комбинированные взаимодействия блоков транслятора
- •Лексический анализатор. Методы лексического анализа.
- •Методы лексического анализа
- •Организация непрямого лексического анализатора
- •Синтаксический разбор. Классификация методов синтаксического разбора.
- •Организация прямого лексического анализатора
- •Классификация методов синтаксического разбора
- •Методы разбора
- •Общие принципы нисходящего и восходящего методов разбора.
- •Су схемы перевода. Синтаксически-управляемые трансляции и генерация промежуточной программы.
- •6. Атрибутные схемы перевода (атрибутные трансляционные грамматики, атрибутные автоматы)
Классификация методов синтаксического разбора
Если попытаться формализовать задачу на уровне элементарного метаязыка, то она будет ставиться следующим образом. Дан язык L(G) с грамматикой G, в которой S - начальный нетерминал. Построить дерево разбора входной цепочки
a = a1a2a3...an.
Естественно, что существует огромное количество путей решения данной задачи, и целью разработчика распознавателя является выделение приемлемых вариантов его реализации. Для того, чтобы понять, что, и каким образом, влияет на принципы функционирования распознавателя, а следовательно, и на организацию разбора, рассмотрим некоторые возможные варианты. Общая классификация рассматриваемых вариантов построения распознавателя представлена на рис. 6.1.
На самом верхнем уровне выделяются:
методы разбора;
последовательность разбора;
использование просмотра вперед;
использование возвратов.
Методы разбора
Выделяются два основных метода синтаксического разбора:
нисходящий разбор;
восходящий разбор.
Кроме этого можно использовать комбинированный разбор, сочетающий особенности двух предыдущих.
Нисходящие и восходящие подходы широко используются в различных областях человеческой деятельности, особенно в тех из них, которые связаны с анализом и синтезом искусственных систем. В частности, можно отметить методы разработки программного обеспечения сверху вниз (нисходящий) и снизу вверх (восходящий).
Общие принципы нисходящего и восходящего методов разбора.
Выделяются два основных метода синтаксического разбора:
нисходящий разбор;
восходящий разбор.
Кроме этого можно использовать комбинированный разбор, сочетающий особенности двух предыдущих.
Нисходящие и восходящие подходы широко используются в различных областях человеческой деятельности, особенно в тех из них, которые связаны с анализом и синтезом искусственных систем. В частности, можно отметить методы разработки программного обеспечения сверху вниз (нисходящий) и снизу вверх (восходящий).
Нисходящий разбор заключается в построении дерева разбора, начиная от корневой вершины. Разбор заключается в заполнении промежутка между начальным нетерминалом и символами входной цепочки правилами, выводимыми из начального нетерминала. Подстановка основывается на том факторе, что корневая вершина является узлом, состоящим из листьев, являющихся цепочкой терминалов и нетерминалов одного из альтернативных правил, порождаемых начальным нетерминалом. Подставляемое правило в общем случае выбирается произвольно. Вместо новых нетерминальных вершин осуществляется подстановка выводимых из них правил. Процесс протекает до тех пор, пока не будут установлены все связи дерева, соединяющие корневую вершину и символы входной цепочки, или пока не будут перебраны все возможные комбинации правил. В последнем случае входная цепочка отвергается. Построение дерева разбора подтверждает принадлежность входной цепочки данному языку. При этом, в общем случае, для одной и той же входной цепочки может быть построено несколько деревьев разбора. Это говорит о том, что грамматика данного языка является недетерминированной.
Эти рассуждения иллюстрируются следующим примером. Пусть будет дана грамматика G:
G6 = ({S}, {a, +, *}, P, S),
Где P определяется как:
S a
S S + S
S S * S
Цепочки, порождаемые данной грамматикой можно интерпретировать как выражения, состоящие из операндов "a", а также операций "+" и "*". Недетерминированность грамматики позволяет порождать одну и ту же терминальную цепочки с использованием различных выводов. Например, выражение "a+a*a+a" можно получить следующими способами:
S S+S a+S a+S*S a+ a*S a+a*S+S a+a*a+S a+a*a+a
S S+S S+a S*S+a S*a+a S+S*a+a S+a*a+a a+a*a+a (6.1)
S S*S S+S*S S+S*S+S a+ S*S+S a+a*S+S a+a*S+a a+a*a+a
И так далее. В этом пример число вариантов одной и той же произвольной цепочки вывода настолько велико, что не имеет и смысла говорить о практическом применении данной грамматики. Но в данном случае она позволяет показать, каким образом могут порождаться различные деревья при нисходящем разборе. Пошаговое построение различных деревьев показано на рис. 6.2, 6.3, 6.4. Можно отметить, что процесс построения дерева совпадает с последовательностью шагов вывода входной цепочки.
При восходящем разборе дерево начинает строиться от терминальных листьев путем подстановки правил, применимых к входной цепочке, опять таки, в общем случае, в произвольном порядке. На следующем шаге новые узлы полученных поддеревьев используются как листья во вновь применяемых правилах. Процесс построения дерева разбора завершается, когда все символы входной цепочки будут являться листьями дерева, корнем которого окажется начальный нетерминал. Если, в результате полного перебора всех возможных правил, мы не сможем построить требуемое дерево разбора, то рассматриваемая входная цепочка не принадлежит данному языку.
Восходящий разбор также непосредственно связан с любым возможным выводом цепочки из начального нетерминала. Однако, эта связь, по сравнению с нисходящим разбором, реализуется с точностью до "наоборот". На рис. 6.5, 6.6, 6.7 приведены примеры построения деревьев разбора для грамматики G6 и процессов порождения цепочек, представленных выражениями (6.1). Из рисунков видно, что шаги порождения дерева соответствуют движению по представленным цепочкам вывода справа налево.
Комбинированный разбор может быть реализован тогда, когда процесс распознавания разбивается на два этапа. На одном из них осуществляется нисходящий, а на другом - восходящий разбор. Этапов может быть и больше, а порядок их применения - произвольным. Комбинированным можно считать разбор в любом трансляторе, если фазу лексического анализа принять за первый этап, а синтаксического - за второй. При этом лексический анализатор нельзя считать истинным распознавателем, так как осуществляется формирование только одного слоя ветвей в дереве разбора, расположенного над символами входной цепочки (рис. 6.8).
Прямой лексический анализатор будет являться восходящим распознавателем, который может сочетаться с нисходящим. Непрямой же лексический анализ можно рассматривать как нисходящий разбор некоторой подцепочки (осуществляются проверки версий). Поэтому комбинированный разбор будет при его совместном использовании с восходящим распознавателем. В синтаксическом же анализаторе комбинация различных видов разборов обычно не используются, так как в этом нет особого смысла.
