Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
32
Добавлен:
02.05.2014
Размер:
189.44 Кб
Скачать

Распознавание цепочек кс-языков

Класс КС-языков допускает распознавание с помощью недетерминированного конечного автомата со стековой (или магазинной) памятью - МП-автомата. Контекстно-зависимые языки - последний класс языков, которые можно эффективно распознавать с помощью ЭВМ. Они допускаются двусторонними недетерминированными линейно ограниченными автоматами. Для цепочек языка без ограничений, в общем случае, требуется универсальный вычислитель (машина Тьюринга, машина с неограниченным числом регистров и т.п.). Контекстно-зависимые языки и языки без ограничений при создании структур языков программирования не используются.

МП-автомат в отличие от обычного КА имеет стек (магазин), в который можно помещать специальные "магазинные" символы (обычно это терминальные и нетерминальные символы грамматики языка). Переход из одного состояния в другое зависит не только от входного символа, но и от одного или нескольких верхних символов стека. Таким образом, конфигурация автомата определяется тремя параметрами: состоянием автомата, текущим символом входной цепочки (положением указателя в цепочке) и содержимым стека.

При выполнении перехода из стека удаляются верхние символы, соответствующие условию перехода, и добавляется цепочка, соответствующая правилу перехода. Первый символ цепочки становится верхушкой стека. Допускаются переходы, при которых входной символ игнорируется (и, тем самым, он будет входным символом при следующем переходе). Эти переходы называются l-переходами. МП-автомат называется недетерминированным, если при одной и той же его конфигурации возможен более чем один переход. Если при окончании цепочки автомат находится в одном из заданных конечных состояний, а стек пуст, цепочка считается принятой (после окончания цепочки могут быть сделаныl-переходы). Иначе цепочка символов не принимается.

По КС-грамматике G(VT,VN,P,S),V=VTÈVNможно построить недетерминированный МП-автомат, который допускает цепочки языка этой грамматики. Он имеет только одно состояние и следующий набор переходов:

  • l(A)¸(a) - для каждого правила грамматики A®aÎP, гдеAÎVN,aÎV*;

  • а(а)¸() - для каждого терминала аÎVT;

Здесь в круглых скобках показано содержимое верхушки стека. Перед скобками стоит очередной символ входной цепочки или символ lдляl-перехода, а символ¸разделяет состояния автомата до и после выполнения перехода (показывает такт работы автомата). В начале работы автомата в стеке лежит символ SÎVN, в конце работы автомата стек должен быть пуст.

Можно построить и другой автомат, который также содержит одно состояние и имеет следующие переходы:

  • а()¸(а) - для каждого терминала аÎVT;

  • l(a)¸(A) - для каждого правила грамматики A®aÎP, гдеAÎVN,aÎV*;

В таком варианте в начале разбора стек автомата пуст. Тогда в конце разбора допустимой цепочки в стеке должен остаться символ SÎVN.

По недетерминированному МП-автомату всегда можно построить КС-грамматику. Таким образом, класс КС-языков и класс языков, допускаемых МП-автоматами, эквивалентны.

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

Два (недетерминированных) МП-автомата, построенных выше для произвольной КС-грамматики определяют два класса методов разбора КС-языков: сверху вниз и снизу вверх.

В первом случае (пример - рекурсивный спуск) при просмотре цепочки слева направо естественно будут получаться левые выводы. При детерминированном разборе проблема будет состоять в том, какое правило применить для раскрытия самого левого нетерминального символа.

Во втором случае детерминированный разбор удобно формализовать в терминах "сдвиг" (перенос символа из входной цепочки в магазин) и "свертка" (применение к вершине магазина какого-либо правила грамматики). При просмотре входной цепочки слева направо при этом будут получаться правые выводы. Проблема в этом случае состоит в выборе между сдвигом и сверткой и в выборе правила для свертки.