Пусть дана КС-грамматика G = (N; T; P; S). Рассмотрим разбор сверху-вниз (предсказывающий разбор) для грамматики G.
Главная задача предсказывающего разбора - определение правила вывода, которое нужно применить к нетерминалу. Процесс предсказывающего разбора с точки зрения построения дерева разбора проиллюстрирован на рис. 4.1
Фрагменты недостроенного дерева соответствуют сентенциальным формам. Вначале дерево состоит только из одной вершины, соответствующей аксиоме S. В этот момент по первому символу входной цепочки предсказывающий анализатор должен определить правило S
X1X2 ... ; которое должно быть применено к S. Затем необходимо определить правило, которое должно быть применено к X1, и т.д., до тех пор, пока в процессе такого построения сентенциальной формы, соответствующей левому выводу, не будет применено правило Y a ... : Этот процесс затем применяется для следующего самого левого нетерминального символа сентенциальной формы.На рис. 4.2 условно показана структура предсказывающего анализатора, который определяет
очередное правило с помощью таблицы. Такую таблицу можно построить и непосредственно по грамматике. Таблично-управляемый предсказывающий анализатор имеет входную ленту, управляющее устройство (программу), таблицу анализа, магазин (стек) и выходную ленту. Входная лента содержит анализируемую строку, заканчивающуюся символом $ - маркером конца строки. Выходная лента содержит последовательность примененных правил вывода.
Таблица анализа - это двумерный массив M[A; a], где A - нетерминал, и a - терминал или символ $. Значением M[A; a] может быть некоторое правило грамматики или элемент "ошибка".
Магазин может содержать последовательность символов грамматики с $ на дне. В начальный момент магазин содержит только начальный символ грамматики на верхушке и $ на дне.
Анализатор работает следующим образом. Вначале анализатор находится в конфигурации, в которой магазин содержит S$, на входной ленте w$ (w - анализируемая цепочка), выходная лента пуста.
На каждом такте анализатор рассматривает X - символ на верхушке магазина и a - текущий входной символ. Эти два символа определяют действия анализатора. Имеются следующие возможности.
Нетерминал | Входной символ | |||||
id | + | * | ( | ) | $ | |
E | ETE' | ETE' | ||||
E' | E'+TE' | E'e | E'e | |||
T | TFT' | TFT' | ||||
T' | T'e | T'*FT' | T'e | T'e | ||
F | Fid | F(E) |
Магазин | Вход | Выход |
E$ | id + id * id$ | |
TE'$ | id + id * id$ | E TE' |
FT'E'$ | id + id * id$ | T FT' |
id T'E'$ | id + id * id$ | F id |
T'E'$ | +id * id$ | |
E'$ | +id * id$ | T' e |
+TE'$ | +id * id$ | E' +TE |
TE'$ | id * id$ | |
FT'E'$ | id * id$ | T FT' |
id T'E'$ | id * id$ | F id |
T'E'$ | *id$ | |
*F'T'E'$ | *id$ | T' *FT' |
FT'E'$ | id$ | |
id T'E'$ | id$ | F id |
T'E'$ | $ | |
E'$ | $ | T' e |
$ | $ | E' e |