
- •Цели лексического анализа:
- •Основные функции лексического анализатора:
- •Общие принципы построения лексических анализаторов
- •Конечные автоматы
- •Преобразования нка
- •Задачи синтаксич анализа:
- •Роль синтаксического анализатора
- •Контекстно-свободные грамматики
- •Стековая реализация пс-анализа
- •Грамматики предшествования
- •Алгоритм синтаксического анализа простого предшествования
- •Алгоритм синтаксического анализа приоритета операторов
- •Нерекурсивный предиктивный анализ
- •Множества first и follow
- •Внутреннее представление программы
- •Способы внутреннего представления программ.
- •Триады – многоадресный код с неявно именуемым результатом.
- •Алгоритм преобразования дерева вывода в дерево операций:
- •Ассемблерный код и машинные команды
- •Синтаксически управляемые определения
- •Вид синтаксически управляемого определения
- •Восходящее выполнение s-атрибутных определений
- •Синтезируемые атрибуты в стеке синтаксического анализатора
- •Наследование атрибутов в стеке синтаксического анализатора
- •Замена наследуемых атрибутов синтезируемыми
Контекстно-свободные грамматики
Многие языки программирования по своей природе имеют рекурсивную структуру, которая может определяться контекстно-свободными грамматиками. Например, условная инструкция, определяется следующим правилом.
Если S1 и S2 являются инструкциями, а E — выражением, то
if E then S1 else S2 (5.1)
является инструкцией
Этот тип условных инструкций не может быть определен с использованием регулярных выражений. Используя для обозначения класса инструкций синтаксическую переменную stmt, а для класса выражений — ехрr, можно выразить (5.1) с помощью продукции грамматики
stmt —> if expr then stmt else stmt (5.2)
Определение контекстно-свободной грамматики включает в себя понятия терминалов, нетерминалов, стартового символа и продукций.
Терминалы представляют собой базовые символы, из которых формируются строки. В (5.2) каждое из ключевых слов if, then, else является терминалом.
Нетерминалы представляют собой синтаксические переменные, которые обозначают множества строк. В (5.2) stmt и ехрr являются нетерминалами. Нетерминалы определяют множества строк, которые помогают в определении языка, порождаемого грамматикой. Кроме того, они налагают на язык иерархическую структуру, облегчающую синтаксический анализ и трансляцию.
Один из нетерминалов грамматики считается стартовым символом, и множество строк, которые он обозначает, является языком, определяемым грамматикой.
Продукции грамматики определяют способ, которым терминалы и нетерминалы могут объединяться для создания строк. Каждая продукция состоит из нетерминала, за которым следует стрелка (или символ : : = , если грамматика записана в форме Бэкуса–Наура), и строка нетерминалов и терминалов.
Общий вид правил A, где AN, V+.
Грамматика, которая дает более одного дерева разбора для некоторого предложения, называется неоднозначной.
Неоднозначная грамматика — это та, которая для одного и того же предложения дает не менее двух левых или правых порождений. Для большинства типов синтаксических анализаторов грамматика должна быть однозначной, поскольку, если это не так, нельзя определить дерево разбора для предложения единственным образом.
Для устранения неоднозначности грамматика может быть переписана.
Устранение левой рекурсии
Грамматика является леворекурсивной, если в ней имеется нетерминал А, такой, что существует порождение А => Аα для некоторой строки α. Методы нисходящего разбора не в состоянии работать с леворекурсивными грамматиками, поэтому требуется преобразование грамматики, которое устранило бы из нее левую рекурсию.
Левая факторизация
Левая факторизация представляет собой преобразование грамматики в пригодную для предиктивного анализа. Основная идея левой факторизации заключается в том, что когда не ясно, какая из двух альтернативных продукций должна использоваться для нетерминала А, A-продукции можно переписать так, чтобы отложить принятие решения до тех пор, пока из входного потока не будет прочитано достаточно символов для правильного выбора.
В общем случае, если А αβ1, | αβ2 представляют собой две A-продукции и входной поток начинается с непустой строки, порождаемой α, то нельзя сказать какая продукция будет использоваться первая или вторая продукция. Однако можно отложить решение, расширив А до αА'. В этом случае, после того как рассмотрен входной поток, выводимый из α, работаем с А', расширяя его до β1 или β2. Таким образом, будучи левофакторизованными, исходные продукции становятся
А αА'
А' β1| β2
Цель преобразования грамматик: упрощение правил грамматики и облегчение создания распознавателя. При создании компиляторов вторая цель наиболее важная, поэтому иногда упрощением грамматик пренебрегают.
Грамматики, к которым применены преобразования в определенном порядке, называется приведенными.
Последовательность правил преобразований грамматик должна быть следующей:
удаление всех бесполезных символов; (Нетерминальный символ грамматики является бесполезным, если он не играет никакой роли в построении правильных цепочек языка)
удаление всех недостижимых символов; (Нетерминальный символ грамматики является недостижимым, если он никогда не появляется в выводимых цепочках)
удаление λ-продукций; (Грамматика является λ-свободной, если множество продукций не содержит λ -продукций, или есть ровно одно λ -правило S–> λ и S не встречается в правых частях остальных продукций)
удаление цепных правил (Грамматика является грамматикой без циклов, если в ней нет выводов вида А=*>А).
Одним из способов описания алгоритма распознавания языка является задание его в виде некоторого распознающего устройства. Для КС-языков такими устройствами являются магазинные автоматы (автоматы с магазинной памятью, МП-автоматы).
Формальное определение и содержательное описание функционирования МП-автомата.
Недетерминированным МП-автоматом называется семерка вида:
М = <А, Q, Г, δ, q0, Z0, F>,
где А — конечное множество входных символов (входной алфавит);
Q — конечное множество внутренних состояний (алфавит состояний);
Г — конечное множество магазинных символов;
q0∈ Q — начальное состояние автомата;
F⊆Q — множество заключительных состояний;
δ — отображение QxAxГ в множество подмножеств QxГ*,
т.е. отображение вида δ : QxAxГ → (QxГ*).
Схема МП-автомата показана на рис. 26. Автомат имеет конечное множество состояний, конечное множество входных символов и неограниченную ленту, называемую лентой магазинной памяти или магазинной памятью. «Дно» магазина (самый нижний символ) отмечается специальным символом, называемым маркером дна (например, символом #). Магазинная память определяется свойством «первым пришел — последним ушел». При записи символа в магазин, его содержимое сдвигается на одну ячейку «вниз», а на освободившееся место записывается требуемый символ.
Рис. 26 Схема автомата с магазинной памятью
Для чтения доступен только самый верхний символ магазина. Этот символ после чтения может либо остаться в магазине, либо быть удален из него, т.е. «вытолкнут» из магазина. За один такт работы МП-автомата из магазина можно удалять не более одного символа.
Каждый шаг работы МП-автомата задается множеством правил перехода автомата из одних состояний в другие. Переходы в общем случае определяются:
состоянием МП-автомата;
верхним символом магазина;
текущим входным символом.
Множество правил перехода называется управляющим устройством. В зависимости от получаемой информации, управляющее устройство реализует один такт работы МП-автомата, который включает в себя три операции:
1) операции над магазином:
втолкнуть в магазин определенный символ;
вытолкнуть верхний символ из магазина;
оставить содержимое магазина без изменений;
2) операции над состоянием:
перейти в заданное новое состояние S;
остаться в прежнем состоянии;
3) операции над входом:
перейти к следующему входному символу и сделать его текущим;
оставить данный входной символ текущим, т.е. держать его до следующего шага.
МП-автомат называется МП-распознавателем, если у него два выхода ДОПУСТИТЬ и ОТВЕРГНУТЬ.
Работа МП-автомата при распознавании конкретной цепочки описывается обычно в виде последовательности конфигураций МП-автомата. Конфигурация МП-автомата содержит (содержимое стека; состояние; необработанная часть входной цепочки).
Различают детерминированные и недетерминированные МП-автоматы. Если среди команд МП-автомата нет двух, у которых совпадают левые части и не совпадают части, стоящие справа от стрелки, то МП-автомат называют детерминированным. В противном случае, т.е. когда для заданного состояния и текущих входном и магазинном символах, возможны переходы автомата в различные состояния, его называют недетерминированным.
Связь между КС-языками и недетерминированными автоматами выражается теоремами, которые показывают, что класс языков, допускаемых магазинными автоматами при пустом магазине, есть в точности класс КС-языков.
Теорема: Пусть L(G) — КС-язык, порождаемый грамматикой G = <N, T, P, S> в нормальной форме Грейбах ( правила вывода которой имеют вид A->bα ). Тогда существует недетерминированный нисходящий МП-автомат М, допускающий все слова языка L(G). Автомат М = <А, Q, Г, δ, q0, Z0, F> строится следующим образом:
1)А = Т; 2)Q={q,}; 3)T = N; 4)q0=qq; 5)Z0 = S; F = ∅; 6) δ: (q , а, В)–> (qp γ) , когда подстановка В →aγ принадлежит множеству правил Р грамматики G, здесь В ∈ N, а ∈ Т, γ ∈ {N U T} * [5].
68. Общие алгоритмы синтаксического анализа: методы восходящего синтаксического анализа, табличные методы синтаксического анализа, формальное определение алгоритма разбора типа "перенос-свертка", грамматики простого и операторного предшествования, понятие отношений «<∙ , ∙>, ∙ = » между символами грамматики, особенности построения таблиц разбора, сравнительный анализ класса грамматик предшествования с другими классами грамматик.
Основной метод восходящего синтаксического анализа - синтаксический анализ типа "перенос/свертка" или сокращенно ПС-анализ. В процессе ПС-анализа дерево разбора для входной строки строится начиная с листа (снизу) и работая по направлению к корню дерева (вверх). При восх.синт.анализе моделируется правый вывод в обратном порядке, т.е. правила грамм-ки применяются справа налево и с ними выполн-ся 2 действия: перенос и свертка.
Перенос – операция, кот. выталкивает в стек некот.сивол, сооотв-ий текущ.входнм символу и сдвигает вх.строку на 1 символ.
Свертка – для некот. Правила P с r-символами в правой части (Pi->….) – операция выбирается, когда r – верхних символов стека представляет правую часть правила Pi. В рез-те операции r-верхних символов снимается со стека, а в стек помещается символ Pi из левой части продукции.
Основа строки — это подстрока, которая совпадает с правой частью продукции и свертка которой в левую часть продукции представляет собой один шаг обращенного правого порождения.
Основа правосентенциальной формы γ является продукцией A → β и позицией строки β в γ, такими, что β может быть заменена нетерминалом А для получения предыдущей правосентенциальной формы в правом порождении γ.