Алгоритмы построения синтаксических анализаторов
Автоматы с магазинной памятью. Синтаксические анализаторы КС-языков. Синтаксический анализ сверху вниз. Распо-
знаватели с возвратом. Алгоритм с подбором альтернатив. Построение МП-автомата с возвратом по заданной КС-
грамматике. Синтаксический анализ снизу вверх. Алгоритм “перенос-свертка”. Построение расширенного МП-автомата.
Построение автомата по НФ Грейбах. Распознаватели без возвратов. Алгоритм по методу рекурсивного спуска. Построе-
ние автомата для разбора S-грамматики
Язык называется контестно-свободным, если он определяется грамматикой G(N,T,P,S), в которой правила имеют вид A→β,
где A∈N, β∈V
*
. Распознавателями КС языков являются автоматы с магазинной (стековой) памятью. МП-автомат опреде-
ляется следующим образом: R(Q,A,Z,δ, q
0
, z
0
, F), где Q – множество состояний автомата, A – алфавит входных символов, Z –
специальный конечный алфавит магазинных символов автомата, A⊆Z, δ - функция переходов автомата, отображающая мно-
жество Qx(A∪{λ})xZ на конечное множество подмножеств P(QxZ
*
), q
0
∈Q – начальное состояние автомата, z
0
∈Z – началь-
ный символ магазина , F⊆Q – множество конечных состояний.
В отличие от обычного КА МП-автомат имеет стек, в который можно помещать специальные магазинные символы, обычно
это терминальные и нетерминальные символы грамматики языка. Переходы между состояниями зависят не только от вход-
ного символа, но и от символа на вершине стека. В итоге конфигурация автомата определяется тремя параметрами: состоя-
нием автомата, цепочкой еще не прочитанных символов, содержимым стека (q,α,ω). Один такт работы автомата описывается
в виде (q,aα, zω)⇒(q’,α,γω), где (q’,γ)∈δ(q,a,z), q,q’∈Q, a∈A∪{λ}, α∈A
*
, z∈Z∪{λ}, γ,ω∈Z
*
. При выполнении такта в стеке
заменяется символ, соответствующий условию перехода, на цепочку, соответствующую правилу перехода. Первый символ
этой цепочки становится новой вершиной стека. Допускаются переходы, при которых входной символ игнорируется, остава-
ясь на следующий такт. Такие переходы (такты) называются λ-переходами. Далее, автомат может и не извлекать символ из
стека (γ=z).
Начальная конфигурация определяется как (q
0
, α, z
0
), α∈A
*
, а множество конечных конфигураций как (q,λ,ω) q∈F, ω∈Z
*
.
МПА допускает (принимает) цепочку символов, если получив ее на вход и находясь в начальной конфигурации, он может
перейти в одну из конечных конфигураций – когда автомат находится в одном из конечных состояний, а стек содержит оп-
ределенную цепочку. Язык, определяемый МПА – множество всех цепочек, которые допускает автомат. Два МПА R1 и R2
эквивалентны, если они определяют один и тот же язык L(R1)=L(R2). МПА допускает цепочку с опустошением магазина,
если по окончании разбора автомат находится в одном из конечных состояний, а магазин пуст (конфигурация (q,λ,λ)). Для
любого МПА всегда можно построить эквивалентный ему МПА, допускающий цепочки с опустошением стека. Расширен-
ный МПА в отличие от обычного, может заменять не один символ на вершине стека, а цепочку символов на вершине стека.
Функция переходов для него отображает множество Qx(A∪{λ})xZ
*
. Для любого расширенного МПА всегда можно постро-
ить эквивалентный ему обычный. Для произвольной КС-грамматики всегда можно построить МПА, задающий тот же язык.
Для произвольного МПА всегда можно построить КС-грамматику, задающую тот же язык.
МПА называется детерминированным, если из каждой его конфигурации возможно не более одного перехода в другую
конфигурацию. Формально для ДМПА функция переходов δ может иметь один из трех видов:
1. δ(q,a,z) содержит 1 элемент: δ(q,a,z)={(q’,γ)}, γ∈Z
*
, δ(q,λ,z)=∅;
2. δ(q,a,z)=∅, δ(q,λ,z) содержит 1 элемент δ(q,λ,z)={(q’,γ)}, γ∈Z
*
;
3. δ(q,a,z)=∅, δ(q,λ,z)=∅;
Класс ДМПА и соответствующих им языков значительно уже, чем весь класс МПА и КС-языков. В отличие от КА, для кото-
рого всегда можно построить эквивалентный ему ДКА, не для каждого МПА можно построить эквивалентный ему ДМПА.
ДМПА определяют очень важный подкласс КС-языков – детерминированные КС-языки. Все языки, принадлежащие к это-
му подклассу, могут быть построены с помощью однозначных КС-грамматик. Однако не всякий язык, задаваемый однознач-
ной КС-грамматикой, является детерминированным. Большинство практически используемых распознавателей, относятся к
классу детерминированных КС-языков.
Все распознаватели для КС-языков можно разделить на 2 большие группы – нисходящие и восходящие. Нисходящие про-
сматривают входную цепочку символов слева направо и порождают левосторонний вывод. Дерево вывода таким распозна-
вателем строится от корня к листьям (сверху вниз). Восходящие также просматривают входную цепочку слева направо, но
порождают правосторонний вывод. Дерево вывода при этом строится от листьев к корню (снизу вверх). Для моделирования
этих групп распознавателей используются 2 алгоритма: для нисходящих алгоритм с подбором альтернатив, для восходящих
– алгоритм “сдвиг-свертка”. Для ЯП в большинстве случаев легче построить правосторонний восходящий распознаватель.
Однако на основе левостороннего (нисходящего) синтаксического анализатора легче организовать процесс порождения це-
почек результирующего языка, проще в этом случае и обнаружение и локализация ошибок в исходном тексте. На практике
используются оба варианта. Конкретный выбор зависит от реализации конкретного компилятора и сложности грамматики
входного языка.
Нисходящий синтаксический анализ. В основе лежит левосторонний разбор. При анализе сверх вниз вывод заданной
входной цепочки строят исходя из аксиомы, называемой целью. Анализируются первые символы цепочки и принимается
решение, какое правило должно быть применено, после чего выполняется попытка распознать элементы правой части пра-
вила, определяя их как подцели. И так до тех пор, пока очередные подцели не приведут к сравнению символов цепочки с
терминалами, что и позволит сделать вывод о принадлежности цепочки языку. Отличительная особенность алгоритмов нис-
ходящего разбора в том, что текущая цель (подцель) используется как вспомогательная информация для принятия решения.
В общем случае при нисходящем анализе возникают следующие проблемы:
1. Наличие леворекурсивных правил. Пусть цель – А, и первое же правило для А имеет вид А→Аγ. Раз так, то будет уста-
новлена подцель А. Она опять потребует подцели А и т.д. Для нисходящего разбора леворекурсивные правила должны быть
исключены из грамматики.
2. Пусть при нисходящем анализе необходимо заменить самый левый нетерминал, определяемый правилом вида: