- •Лекция 11
- •Лексический анализатор.
- •Атрибуты лексем
- •Использование грамматик для лексического анализа
- •Регулярные выражения
- •Построение лексического анализатора по регулярному выражению
- •Структура Lex-программы
- •Способы записи регулярных выражений в Lex-программе
- •Лекция 12
- •Синтаксический анализ
- •Нисходящий разбор.
- •Нисходящий анализ.
- •Ll(1) - грамматики
- •Лекция 13
- •Восходящий разбор.
- •Восходящий синтаксический анализ.
- •Лекция 14
- •Видозависимый (семантический) анализ
- •Организация таблиц символов
- •Оптимизация кода
- •Генерация кода
- •Генераторы генераторов кода
- •Лекция 16
- •Промежуточные формы представления программ
- •Польская запись
- •Алгоритм вычисления выражений в обратной польской записи
- •Алгоритм э.Дейкстры перевода выражения в полиз (метод стека с приоритетами):
- •Тетрады (четверки).
- •Триады.
- •Перевод в полиз условных опереторов, операторов присваивания, операторов циклов.
- •Лекция 17
- •Формальные методы описания перевода.
Лекция 13
Восходящий синтаксический анализ. Создание таблицы синтаксического анализа. Особенности LR-анализа.
Восходящий разбор.
Правый разбор цепочки ω в КС-грамматике – это последовательность правил, с помощью которых можно свернуть цепочку ω к начальному символу грамматики S, то есть он представляет собой последовательное определение основ и их удалений (свёртки).
Пример:
Есть КС-грамматика G с правилами
(3)
(4)
Цепочка: ω = ((a)(((b)a(a))(b)))
Сделаем левый разбор цепочки:
Выделим основу: ((a)(((b)a(a))(b))) по (4) правилу КС-грамматики;
Заменяем: (A(((b)a(a))(b))) по (2) правилу КС-грамматики;
(A((Sa(a))(b))) по (4) правилу КС-грамматики;
(A((SaA)(b))) по (3) правилу КС-грамматики;
(A(A(b))) по (2) правилу КС-грамматики;
(A(AS)) по (1) правилу КС-грамматики;
(AS) по (1) правилу КС-грамматики;
S по (1) правилу КС-грамматики.
Определим восходящий анализатор:
Пусть G – некоторая КС-грамматика. Назовём правым анализатором расширенный недетерминированный МП-преобразователь:
δ определяется следующим образом:
если – это правило изP с номером i, то ;
;
Правый анализатор работает следующим образом:
переносит входные символы в магазин, используя функцию , построенную по правилу (2) определения;
когда наверху магазина появляется основа, анализатор может свернуть её, используя функцию , построенную по правилу (1) определения, и выдать номер правила грамматики, использованного при свёртке;
анализатор продолжает переносить в магазин входные символы до тех пор, пока в его верхней части не появится новая основа, которая свёртывается, после чего на выход подаётся номер соответствующего правила грамматики;
преобразователь действует так до тех пор, пока в магазине не останется начальный символ грамматики с маркером дна магазина. В этом случае, используя правило (3) определения, анализатор может перейти в заключительную конфигурацию с опустошением магазина.
Восходящий синтаксический анализ.
Основной метод восходящего синтаксического анализа – перенос-свертка (ПС-анализ). Самый широкий класс грамматик, для которых успешно применяется ПС-анализаторы – это LR-грамматики. Достаточно удобный ПС-анализатора состоит в использовании стека для хранения символов грамматики и входного буфера для хранения анализируемой строки. Изначально стек пуст. Входной буфер содержит строку w. СА работает путем переноса нулей или нескольких символов в стек, до тех пор пока на вершине стека не окажется основа β, затем он свертывает β к левой части соответствующей продукции. Повторяет этот цикл пока не будет обнаружена ошибка или он не придет в конфигурацию, когда в стеке находится только стартовый символ, а буфер пуст, тогда сообщает об успешном разборе.
Пример:
Имеется цепочка: id1+id2*id3
E→E+E
E→E*E
E→(E)
E→id
СТЕК |
ВХОД |
ДЕЙСТВИЕ |
⊥ |
id1+id2*id3 |
перенос |
⊥id1 |
+id2*id3 |
свертка E→id |
⊥E |
+id2*id3 |
перенос |
⊥E+ |
id2*id3 |
перенос |
⊥E+id2 |
*id3 |
свертка E→id |
⊥E+E |
*id3 |
перенос |
........... |
.......... |
........... |
⊥E |
⊥ |
Допуск |
Существуют КС-грамматики, для которых ПС-анализ не применим, т.к. можно достичь , в которой нельзя определить какая из возможных сверток должна применяться, поэтому данный метод используется для LR-грамматик, в которых данная ситуация не врзникает.
LR(k)-анализатор
L – сканирование входного потока слева направо
R – построение обращенных правых разборов, т.е. от листа в корень
k – число входных символов, которые могут быть просмотрены для принятия решения о способе проведения разбора. Если k=1 опущено, то считается, что k=1.
Алгоритм разбора для LR(0)-грамматики
Алфавит представляет собой множество специальных символов, соответствующие грамматическим вхождениям или их множествам.
Грамматическое вхождение – это символы полного словаря грамматики, снабженные двумя индексами (1 – правило грамматики, в правую часть которого входит данный символ; 2 – номер позиции в этой правой части).
Управляющая программа LR-анализатора функционирует так: она определяет Sm – текущее состояние на вершине стека (магазина) и ai – текущий входной символ, затем обращается к функции action(Sm., ai) ячейки таблицы управления, которя может иметь одно из 4 значений:
Перенос S (перенос Si-значение пренос в i состояние);
Свертка в соответствие с продукцией;
Допуск (acc)ж
Ошибка (в таблице пустая клетка).
Кроме функции action в таблице используется функция go to – она получает в качестве аргумента состояние и символ грамматики и возвращает новое состояние, т.е. она представляет собой функцию переходов детерминированного конечного автомата, распознающего активные префиксы грамматики G.
Следующий шаг определяет текущий входной символ ai и состояние Sm в соответствии с их значениями в таблице.
Пример:
Имеется грамматика:
E→E+T
E→T
T→T*P
T→P
P→(E)
P→id