Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования и методы трансляции..pdf
Скачиваний:
28
Добавлен:
05.02.2023
Размер:
3.41 Mб
Скачать

157

Текущее состояние анализатора находится на вершине стека – это Sm.

Текущий символ входной цепочки – ai.

Рассмотрим, как меняется конфигурация анализатора при сдвиге и свертке:

1)Если в состоянии Sm для текущего символа входной цепочки ai таб-

лицей разбора T приписывается сдвиг в состояние Sk, т.е. T(Sm, ai) =

Sk, то на стек помещается новая пара (ai Sk), а во входной цепочке происходит переход к следующему символу:

(S0 X1 S1 X2 S2Xm Sm ai Sk, ai+1an).

То есть новым состоянием анализатора будет Sk, а текущим симво-

лом входной цепочки станет ai+1.

2)Если в состоянии Sm для текущего символа входной цепочки ai таб-

лицей приписывается свертка по правилу Pk, т.е. T(Sm, ai) = Rk, то: 2.1) Со стека снимается r пар символов, где r – количество элемен-

тов в правой части правила Pk = (A α) P. При этом на вершине сте-

ка остается состояние Sm–r:

(S0 X1 S1 X2 S2Xm–r Sm–r, aiai+1an), r = |α|.

2.2) На стек помещается пара (A Sj), где A – левая часть правила Pk, а

Sj = T(Sm–r, A):

(S0 X1 S1 X2 S2Xm–r Sm–r A Sj, aiai+1an).

Входная цепочка при этом остается без изменений. Новым состоя-

нием анализатора становится Sj.

5.3 LR(1)-ТАБЛИЦА РАЗБОРА

Выше мы рассмотрели технологию разбора «снизу вверх». Однако в некоторых ситуациях нужно решать, следует ли выполнять конкретное при-

ведение, когда правая часть правила появляется в вершине стека, или выпол-

158

нять сдвиг. Механизмом, который регулирует вопрос принятия правильного решения, является таблица разбора.

Имеется несколько, незначительно отличающихся, вариантов построе-

ния таблицы разбора. В том варианте, который рассматривается в пособии,

на грамматику накладывается дополнительное ограничение – стартовый сим-

вол не должен иметь альтернатив порождающего правила. Чтобы это гаран-

тировать, в грамматику вводится новый искусственный стартовый символ S

и новое искусственное стартовое правило SS. Таким образом, получаем модифицированную грамматику:

G′ = (N′, Σ, P′, S′), где N′ = N{S′}, P′ = {SS}P.

Таблица T для грамматики G′ = (N′, Σ, P′, S′) представляет собой матри-

цу (табл. 5.1). Ее столбцы можно условно разделить на две секции. Одна из них (секция действий, англ. action) состоит из столбцов для каждого терми-

нала грамматики a1, a2, …, an Σ и маркера конца цепочки « ». Вторая (сек-

ция переходов, англ. goto) состоит из столбцов для нетерминалов грамматики

A1, A2, …, Am N. В принципе, это разделение не является обязательным.

Строки таблицы соответствуют каждому состоянию S0, S1, …, в котором мо-

жет находиться анализатор. Каждое состояние соответствует той позиции в порождающем правиле, которой достиг анализатор. Заранее количество со-

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

Таблица 5.1 – Общий вид LR(1)-таблицы

 

X

 

 

Action

 

 

 

Goto

 

 

 

 

 

 

 

 

 

 

 

 

I

 

a1

a2

an

 

A1

A2

 

Am

 

 

 

 

 

 

 

 

 

 

 

 

 

S0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

159

Драйвер анализатора использует два стека – стек символов и стек со-

стояний, хотя, как было показано выше, символы и состояния можно хра-

нить в одном стеке, чередуя их. Секция действий таблицы разбора включает элементы четырех типов:

1)Элементы сдвига T(Sm, ai) = Sk. Это означает, что в стек символов помещается символ ai, а в стек состояний – состояние Sk. Либо, если стек один, в него помещается пара (ai Sk).

2)Элемент приведения T(Sm, ai) = Rk. Это означает, что необходимо выполнить свертку с помощью Pk – правила с номером k из грамма-

тики (т.е. предварительно все правила должны быть пронумерова-

ны). Если в правой части правила Pk находится r символов, то уда-

ляется r элементов из стека символов и r элементов из стека состоя-

ний (либо r пар элементов из общего стека). Затем на стек символов помещается нетерминал A из левой части правила Pk, а на стек со-

стояний – состояние Sj, определенное по описанным выше прави-

лам.

3)Элемент ошибок T(Sm, ai) = ERROR. Эти элементы являются пробе-

лами в таблице и соответствуют синтаксическим ошибкам.

4)Элемент остановки T(Sm, ai) = HALT. Означает успешное заверше-

ние разбора.

Секция переходов используется лишь для определения нового состоя-

ния Sj при свертке.

Заметим, что состояния Si – это элементы множества состояний I. Ал-

горитм построения I, который будет рассмотрен далее, таков, что лишь начальное состояние S0 всегда будет получено первым, а порядок расположе-

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

160

ствует лишь одна таблица разбора, а для LR-грамматики таблицы могут раз-

личаться. Но этот факт на конечный результат разбора влияния не оказывает.

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Например, рассмотрим грамматику:

VARS real IDLIST ;

IDLIST IDLIST , ID IDLIST ID

ID a-z

Модифицированная грамматика (с новым стартовым символом VARS′ и

новым стартовым правилом) будет иметь следующий вид:

(0)VARSVARS

(1)VARS real IDLIST ;

(2)IDLIST IDLIST , ID

(3)IDLIST ID

(4)ID a-z

Атаблица разбора может иметь вид табл. 5.2.

Таблица 5.2 – Пример таблицы разбора

I

real

a-z

,

;

 

VARS

IDLIST

ID

 

 

 

 

 

 

 

 

 

S0

S2

 

 

 

 

S1

 

 

 

 

 

 

 

 

 

 

 

S1

 

 

 

 

HALT

 

 

 

 

 

 

 

 

 

 

 

 

S2

 

S5

 

 

 

 

S3

S4

 

 

 

 

 

 

 

 

 

S3

 

 

S7

S6

 

 

 

 

 

 

 

 

 

 

 

 

 

S4

 

 

R3

R3

 

 

 

 

 

 

 

 

 

 

 

 

 

S5

 

 

R4

R4

 

 

 

 

 

 

 

 

 

 

 

 

 

S6

 

 

 

 

R1

 

 

 

 

 

 

 

 

 

 

 

 

S7

 

S5

 

 

 

 

 

S8