- •4.Восходящие методы обработки языков
- •41. Неформальное описание восходящего анализа
- •4.2.1.Определение lr(к)-грамматики
- •4.2.2. Алгоритм разбора для lr(k)-грамматики
- •4.2.3.Алгоритм построения управляющей таблицы для lr(0)-грамматики без -правил
- •4.2.4.Алгоритм построения управляющей таблицы для slr(1)-грамматики без -правил
- •4.2.5.Включение -правилв lr(0)-иSlr (1)-грамматики
4.2.1.Определение lr(к)-грамматики
S
u A w
v Рис. 4.4






Рассмотрим
наиболее широкий класс КС-грамматик,
для которых можно построить
детерминированный восходящий анализатор.
Такие грамматики получили название
LR(k)-грамматик
(входная цепочка читается слева
(Left)
направо, выходом анализатора является
правый (Right)
разбор, k
– число
символов входной цепочки, на которое
можно "заглянуть" вперед для
выделения основы).
Наиболее
наглядно
LR(k)-грамматику
можно
определить в терминах деревьев вывода.
Грамматика
G
= < T, N, S, R > является
LR(k)-грамматикой,
если просмотрев только часть кроны
дерева вывода в этой грамматике,
расположенную слева от данной
внутренней вершины, часть кроны,
выведенную
из нее, и
следующие k
символов входной цепочки, можно
установить
правило вывода, которое было применено
к этой вершине при порождении входной
цепочки. Например, рассмотрев цепочку
uv
и первые
k
символов цепочки
w
(рис.
4.4), можно
определить, какое правило было
применено к вершине А.
В определении LR(k)-грамматики используется множество ПЕРВk(), состоящее из префиксов длины k терминальных цепочек, выводимых из . Если из выводятся терминальные цепочки, длина которых меньше k, то эти цепочки также включаются в множество ПЕРВk(). Формально
ПЕРВk() = { x l * xw и x = k или
l * x и x < k }.
Очевидно, что определение множества ПЕРВ(), приведенное при определении LL(k)-грамматики, полностью согласуется с данным определением для k = 1.
Введем еще одно понятие, которое понадобится для определения LR(к)-грамматики.
Определение. Пополненной грамматикой G’, полученной из КС-грамматики G = < T, N, S, R >, называется грамматика
G’ = < T, N {S’}, S’ R { S’ S } >.
Если правила грамматики G’занумерованы числами 1, 2, …, p, то будем считать, что S’ S – нулевое правило грамматики G’, а нумерация остальных правил та же, что и в грамматике G. Начальное правило S’ S вводится для того, чтобы свертка, в которой используется нулевое правило, можно было интерпретировать как признак того, что входная цепочка допустима. Дадим теперь точное определение LR(k)-грамматики.
Определение.
Пусть G = < T, N, S, R > – КС-грамматика и G’= < T, N’, S’, R’> –полученная из нее пополненная грамматика. G называется LR(k)-грамматикой для k0, если из условий:
S’ r* Aw r w ,
S’ r* Bx r y ,
ПЕРВk(w) = ПЕРВk(y)
следует, что Ay = Bx.
Это определение говорит о том, что если w и y – правовыводимые цепочки пополненной грамматики G’, у которых ПЕРВk(w) = ПЕРВk(y) и A –
последнее правило, использованное в правом выводе цепочки w, то правило A должно использоваться также в правом разборе при свертке y к Ay.
Поскольку A независимо от w, то из определения LR (k)-грамматики следует, что в множестве ПЕРВk(w) содержится информация, достаточная для определения основы.
