НИСХОДЯЩИЙ РАЗБОР
МЕТОДЫ СИНТАКСИЧЕСКОГО АНАЛИЗА
Будем считать, что цепочка w Î L(G) для некоторой КС-грамматики G проанализирована или разобрана, если известно ее дерево вывода в данной грамматике.
Обычно компилятор выполняет синтаксический анализ путем моделирования МП-автомата, анализирующего входные цепочки.
Пусть заданы КС-грамматика G=(N, T, P, S), правила которой пронумерованы целыми числами 1, 2, …, р и цепочка a Î (N È Т). Тогда:
- левым разбором цепочки a называется последовательность правил, примененных при ее левом выводе из S;
- правым разбором цепочки a называется последовательность правил, примененных при ее левом выводе из S;
Рассмотрим выполнение синтаксического анализа КС-грамматик при условии, что анализируемая цепочка рассматривается слева справа (левый анализ).
Стратегия левого нисходящего разбора предполагает заполнять дерево разбора, начиная с корня, и двигаться слева направо, направляясь к кроне.
Известно, что для любой грамматики G можно построить недетерминированный МП-преобразователь, который может быть основой синтаксического анализатора.
Пусть G=(N, T, P, S) - КС-грамматика, в которой правила пронумерованы числами от 1 до р.
Левым анализатором Ml называется недетерминированный МП-преобразователь ({q}, T, NÈ Т, {1, 2, …, p}, d, q, S, {q}), где d определяется следующим образом:
1) Если A®a - правило из Р с номером i, то (q, a, i) Î d(q, e, A)
2) d (q, a, a) ={(q, e, e)} для всех a Î T
Пример.Построим левый анализатор для грамматики G:
(1) E®E+T
(2) E®T
(3) T®T*P
(4) T®P
(5) P®I
(6) P®(E)
Ml = ({q}, {i, +, *, (, )}, {i, +, *, (, ), E, T, P}, {1, 2, 3, 4, 5, 6}, d, q, E, {q})
Определим функцию d:
1. По правилу (2) определения d (q, a, a) ={(q, e, e)} для всех a Î T
2. Для правила грамматики E®E+T по правилу (1) определения в функцию d(q, e, E) необходимо включить элемент (q, E+T, 1)
3. Повторив аналогичные действия для всех правил грамматики, получим:
1) d(q, e, E)={(q, E+T, 1), (q, T, 2)} |
2) d(q, e, T)={(q, T*P, 3), (q, P, 4)} |
3) d(q, e, P)={(q, (E), 6), (q, I, 5)} |
4) d(q, a, a)={(q, e, e)} для всех a Î{i, +, *, (, )} |
Для входной цепочки i + i * i МП-анализатор Ml среди других может выполнить следующую последовательность тактов:
(q, i + i * i, E, e ) ├
(q, i + i * i, E+T, 1 ) ├
(q, i + i * i, T+T, 12 ) ├
(q, i + i * i, P+T, 124 ) ├
(q, i + i * i, i+T, 1245 ) ├
(q, + i * i, +T, 1245 ) ├
(q, i * i, T, 1245 ) ├
(q, i * i, T*P, 12453 ) ├
(q, i * i, P*P, 124534 ) ├
(q, i * i, i*P, 1245345 ) ├
(q, * i, *P, 1245345 ) ├
(q, i, P, 1245345 ) ├
(q, i, i, 12453455 ) ├
(q, e, e, 1245345 )
По определению построенный анализатор является недетерминированным. Чтобы воспользоваться таким анализатором на практике, необходимо преобразовать его в детерминированный.
Нисходящий анализ налагает ограничение на КС-грамматику: она не должна содержать правил с левой рекурсией.