Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
182
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

7.5.1 Алгоритм lr-анализа

Схематически LR-анализатор представлен на рис. 36. Он состоит из входного потока, выхода, стека, управляющей программы и таблицы синтаксического анализа, состоящей из двух частей (действие (action) и переход (goto)). Управляющая программа для всех LR-анализаторов одна и та же; изменяются только таблицы синтаксического анализа. Программа синтаксического анализа считывает символы из входного буфера по одному и использует стек для хранения строк вида s0X1s1X2s2Xmsm (sm находится на вершине стека). Каждый символ X, является символом грамматики, а каждый si — символом состоянием. Каждый символ состояния обобщает информацию, содержащуюся в стеке ниже его. Комбинация символа состояния на вершине стека и текущего входного символа используется в качестве индекса таблицы синтаксического анализа и определяет дальнейшее действие — перенос или свертку. При реализации грамматические символы нe обязаны появляться в стеке, однако для облегчения понимания принципов работы LR-анализатора их лучше рассматривать.

Таблица синтаксического анализа состоит из двух частей — функции действий синтаксического анализа action и функции переходов goto. Управляющая программа LR-анализатора функционирует следующим образом. Она определяет sm, текущее состояние на вершине стека, и ai текущий входной символ. Затем программа обращается к асtion[sm, аi], ячейке таблицы действий синтаксического анализа, определяемой состоянием sm и символом аi, которая может иметь одно из четырех значений:

1) перенос s, где s — состояние;

2) свертка в соответствии с продукцией А →β;

3) допуск;

4) ошибка.

Рис. 36. Модель LR-анализатора

Функция goto получает в качестве аргументов состояние и символ грамматики и воз­вращает новое состояние. Функция goto таблицы синтаксического ана­лиза, построенная на основе грамматики G с использованием LR- метода, представляет собой функцию переходов детерминированного конеч­ного автомата. Начальным состоянием этого ДКА является состояние, изначально размещаемое на вершине стека LR-анализатора.

Конфигурация LR-анализатора представляет собой пару, первый компонент кото­рой — содержимое стека, а второй — непросмотренная часть входного потока: (s0Xls)X2s2Xmsm,aiai+1 an$). Эта конфигурация представляет правосентенциальную форму Х1Х2Xm aiai+1…an, по сути, тем же способом, что и ПС-анализатор; новым яв­ляется только наличие в стеке состояний.

Следующий шаг синтаксического анализатора определяется текущим входным символом а, и состоянием на вершине стека sm в соответствии со значением ячейки таблицы action[sm, аi]. Конфигурации, получаемые после каждого из четырех типов действий, следующие.

1. Если action[sm, аi] = "перенос s", синтаксический анализатор выполняет перенос, пе­реходя в конфигурацию (s0Xls1X2s2Xmsmais,aiai+1 an$). Синтаксический анализа­тор переносит в стек текущий входной символ аi, и очередное состояние s, опреде­ляемое значением action[sm, аi]; текущим входным символом становится ai+1.

2. Если action[sm, аi] = "свертка А → β”, то синтаксический анализатор выполняет свертку, переходя в конфигурацию (s0Xls1X2s2Xm-rsm-rAs,aiai+1 an$), где s = goto[sm-r,A], а r — длина β, правой части продукции. Здесь синтаксический ана­лизатор вначале снимает со стека 2r - символов (r символов состояний и r символов грамматики), выводя на вершину стека состояние sm-r. Затем он вносит в стек А (левую часть продукции) и s, запись из ячейки

goto[sm-r, А]. Текущий входной символ при этом не изменяется. Последовательность снимаемых со стека символов грамматики Xm-r+1 … Хт всегда соответствует правой части продукции свертки.

3. Если action[sm, ai] = "допуск", синтаксический анализ завершает свою работу.

4. Если action[sm, ai] = "ошибка", синтаксический анализатор обнаружил ошибку и вызывает подпрограмму восстановления после нее.

Все LR-анализаторы ведут себя одинаково; единственная разница между ними заключается в таблицах action и goto.