- •Цели лексического анализа:
- •Основные функции лексического анализатора:
- •Общие принципы построения лексических анализаторов
- •Конечные автоматы
- •Преобразования нка
- •Задачи синтаксич анализа:
- •Роль синтаксического анализатора
- •Контекстно-свободные грамматики
- •Стековая реализация пс-анализа
- •Грамматики предшествования
- •Алгоритм синтаксического анализа простого предшествования
- •Алгоритм синтаксического анализа приоритета операторов
- •Нерекурсивный предиктивный анализ
- •Множества first и follow
- •Внутреннее представление программы
- •Способы внутреннего представления программ.
- •Триады – многоадресный код с неявно именуемым результатом.
- •Алгоритм преобразования дерева вывода в дерево операций:
- •Ассемблерный код и машинные команды
- •Синтаксически управляемые определения
- •Вид синтаксически управляемого определения
- •Восходящее выполнение s-атрибутных определений
- •Синтезируемые атрибуты в стеке синтаксического анализатора
- •Наследование атрибутов в стеке синтаксического анализатора
- •Замена наследуемых атрибутов синтезируемыми
Стековая реализация пс-анализа
Существует две проблемы при синтаксическом анализе методом ПС-анализа. Первая заключается в обнаружении подстроки для свертки в правосентенциальной форме, вторая — в определении, какая именно продукция должна быть выбрана, если имеет несколько продукций с соответствующей подстрокой в правой части. Достаточно удобный путь реализации ПС-анализатора состоит в использовании стека для хранения символов грамматики и входного буфера для хранения анализируемой строки. В качестве маркера дна стека используется $, и этот же символ является маркером правого конца входной строки. Изначально стек пуст, а входной буфер содержит строку w$.
Стек $ Вход w$
Синтаксический анализатор работает путем переноса нуля или нескольких символов в стек до тех пор, пока на вершине стека не окажется основа β. Затем он свертывает β левой части соответствующей продукции. Синтаксический анализатор повторяет этот цикл, пока не будет обнаружена ошибка или он не придет в конфигурацию, когда в стеке находится только стартовый символ, а входной буфер пуст:
Стек $S Вход $
Попав в эту конфигурацию, синтаксический анализатор прекращает работу и сообщает об успешном разборе входной строки.
Основными операциями синтаксического анализатора являются перенос и свертка, но на самом деле ПС-анализатор может выполнять четыре действия: (1) перенос, (2) свертка, (3) допуск, (4) ошибка.
При переносе очередной входной символ переносится на вершину стека.
При свертке синтаксический анализатор распознает правый конец основы на вершине стека, после чего он должен найти левый конец основы и принять решение о том, каким нетерминалом заменить основу.
При допуске синтаксический анализатор сообщает об успешном разборе входной строки.
При ошибке синтаксический анализатор обнаруживает ошибку во входном потоке и вызывает программу восстановления после ошибок.
Грамматики предшествования
Принцип организации распознавателя входных цепочек языка, заданного грамматикой предшествования, основан на том, что для каждой упорядоченной пары символов в грамматике устанавливается некоторое отношение, называемое отношением приоритетов. В процессе разбора входной строки расширенный МП-автомат сравнивает текущий символ входной цепочки с одним из символов, находящихся на вершине стека автомата. В процессе сравнения проверяется, какое из возможных отношений приоритетов существует между этими двумя символами. В зависимости от найденного отношения, выполняется либо перенос, либо свертка. При отсутствии отношения приоритетов между символами алгоритм сигнализирует об ошибке.
Пусть имеется КС-грамматика и на некотором шаге вывода получена сентенциальная форма вида ξ* ξi ξj ξ*. Символы ξi ξj стоят рядом в сентенциальной форме. Соседство этих символов характеризуется одним из отношений специального вида – отношений предшествования.
1) Между символами ξi и ξj существует отношение ξi ξj, если в грамматике есть правило вида A–>α ξi ξj β, где α , β принадлежат алфавиту V*.
2) Между символами ξi и ξj существует отношение ξi <• ξj, если в грамматике есть правило вида A–>α ξi В β и вывод вида В=*> ξj γ, где α , β, γ принадлежат алфавиту V*.
3) Между символами ξi и ξj существует отношение ξi •> ξj, если в грамматике есть правило вида A–>α ВС β и выводы вида В=*> γ1 ξj и С=*> ξj γ2 или правило вывода вида A–>α В ξj β и вывод В=*> γ ξi , где α , β, γ1, γ2 , γ принадлежат алфавиту V*.
Тип отношения предшествования показывает, что, если
ξi ξj, то оба символа принадлежат одной основе.
ξi <• ξj, то ξj – самый левый символ некоторой основы.
ξi •> ξj, то ξi – самый правый символ некоторой основы.
КС-грамматика является грамматикой простого предшествования, если она однозначна, не содержит ε-продукций и для любой пары ее символов (терминальных и нетерминальных) выполняется не более одного отношения предшествования.
Грамматики, у которых нет продукций, правые части которых представляют собой или имеют два соседних нетерминала называются операторными.