Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебные пособия / ТЯПиМТ / новая курсовая работа.doc
Скачиваний:
63
Добавлен:
02.04.2015
Размер:
501.25 Кб
Скачать

Lr(1)-реализация алгоритма «сдвиг-приведение»

В заголовки строк управляющей таблицы LR(1)-автомата выносятся индексы его внутренних состояний, а в заголовки строк – все терминальные и нетерминальные символы грамматики, а также маркер конца входной строки. Записи стека содержат два поля: поле символа и поле внутреннего состояния. Содержание поля состояния верхней записи стека определяет текущее внутреннее состояние автомата и, следовательно, координату строки управляющей таблицы, из которой должна быть выбрана очередная команда. Перед началом работы распознавателя в стек следует поместить запись, содержащую индекс начального состояния в поле состояния. Команда типа «сдвиг» должна указывать, в какое внутреннее состояние переходит автомат одновременно с чтением символа из входной ленты. В результате выполнения этой команды курсор входной ленты перемещается на один символ влево, а стек пополняется записью с прочитанным из ленты символом в поле символа и индексом внутреннего состояния, указанного в команде, в поле состояния. Команда типа «приведение» должна указывать правило грамматики, например, в виде его номера, по которому следует выполнить приведение. В результате выполнения этой команды из стека удаляются записи, соответствующие правой части правила, по которому делается приведение, и подготавливается имитация установки курсора входной ленты на нетерминальный символ левой части этого правила. По команде «допуск» разбор считается успешно завершенным. По команде «ошибка» разбор также прекращается, но входная строка объявляется синтаксически неверной.

Для вышеприведенного фрагмента грамматики с правилами i) – iii)управляющая таблицаLR(1)-автомата может быть такой.

<описания>

<список имен>

вещественное

,

идентификатор

маркер конца

1

допуск

сдвиг2

2

сдвиг3

сдвиг6

3

сдвиг4

приведение i

4

сдвиг5

5

приведение ii

приведение ii

6

приведение iii

приведение iii

Таблица построена в предположении, что нетерминал <описания> является начальным символом фрагмента грамматики (его аксиомой). Числами 1 – 6 в таблице обозначены внутренние состояния автомата, при этом состояние 1 является начальным. Соответственно, в командах типа «сдвиг» этими числами указываются внутренние состояния, в которые должен переходить автомат, выполняя такие команды. Команды типа «приведение» снабжены номерами правил, по которым следует выполнять приведение. Пустые клетки таблицы считаются содержащими команду «ошибка».

Разбор строки вещественное а,вс использованием приведенной таблицы получится несколько более длинным, чем на рисунке 2, поскольку в этом случае попадание нетерминального символа в стек оказывается возможным только при выполнении команды типа «сдвиг». Процесс разбора удлинится на некоторое количество таких операций имитации чтения из входной ленты нетерминального символа и занесением его в стек.

сдвиг2

сдвиг6

приведение iii

а,6

вещественное,2

вещественное,2

,1

,1

,1

сдвиг3

сдвиг4

,,4

сдвиг5

<список имен>,3

<список имен>,3

вещественное,2

вещественное,2

вещественное,2

,1

,1

,1

в,5

приведение ii

сдвиг3

,,4

<список имен>,3

<список имен>,3

вещественное,2

вещественное,2

вещественное,2

,1

,1

,1

приведение i

допуск

,1

Рис.4. Последовательность состояний стека при LR(1)-разборе

В записях стека на рис.4 содержание полей символа и внутреннего состояния указаны через запятую. Символом обозначена пустая строка. Так запись,1 означает, что поле символа пусто, а в поле внутреннего состояния находится индекс 1.

Для того, чтобы построить управляющую таблицу для LR(1)-автомата, нужно определить множество его внутренних состояний. Внутренние состояния автомата ставятся в соответствие позициям правых частей правилLR(1)-грамматики в результате так называемой разметки этих правил.

В простейшем случае разметка выполняется следующим образом.

1. Индексы внутренних состояний следует поместить между соседними символами, перед первым символом (в начальную позицию) и после последнего символа (в конечную позицию) правой части каждого правила.

2. В начальные позиции всех правых частей правил для аксиомы следует поместить индекс начального состояния автомата.

3. Если в процессе разметки индекс какого-либо состояния оказался перед нетерминальным символом, его следует распространить на начальные позиции всех правых частей правил для этого нетерминального символа.

4. Если в процессе разметки в двух или более правилах слева от одного и того же символа оказался один и тот же индекс внутреннего состояния, то в этих правилах и справа от этого символа следует поместить одинаковые индексы.

Рассмотренная в этом разделе LR(1)-таблица была построена на основе такой разметки правил грамматики:

  1. <описания>::= 1 вещественное 2 <список имен>3

  2. <список имен>::= 2 <список имен>3 ,4 идентификатор 5

  3. <список имен>::=2 идентификатор 6

Для разметки понадобилось шесть различных индексов. Следовательно, у автомата должно быть шесть внутренних состояний.

Заполнение таблицы с использованием разметки выполняется по следующим правилам.

  1. Команда «сдвиг k» помещается в клетку таблицы с координатами (j,символ), если позиция слева от символа отмечена индексомk, а позиция справа от символа - индексомj.

  2. Команда «приведение m» помещается в клетку таблицы с координатами (n,символ), если конечная позиция правой частиm-го правила грамматики отмечена индексомn, а символ является символом-следователем для нетерминала левой частиm-го правила грамматики, т.е. может следовать за этим нетерминалом в какой-либо сентенциальной форме. (Сентенциальной формой называются аксиома и все строки нетерминальных и терминальных символов, которые из нее выводятся).

  3. Команда «допуск» помещается в клетку таблицы с координатами (l,аксиома), гдеl– индекс начального внутреннего состояния автомата.

  4. После заполнения таблицы по правилам 1 – 3 в клетки, оставшиеся пустыми, помещается команда «ошибка».

В результате применения этих правил к размеченному фрагменту грамматики и получается вышеприведенная управляющая таблица LR(1)-автомата.

Соседние файлы в папке ТЯПиМТ