Лекция 2
3. Кс-грамматики и синтаксический анализ сверху вниз
Если возможно написать детерминированный анализатор, осуществляющий разбор сверху вниз, то такой анализатор принято называть LL(1)-грамматикой.
3.1. Определения
Определение. Обозначения в написании LL(1)-грамматики означают:
L – строки разбираются слева направо;
L – используются самые левые выводы;
1 – варианты порождающего правила выбираются с помощью одного предварительного просмотра символа.
Т.е. грамматику называют LL(1)-грамматикой, если для каждого нетерминала, появляющегося в левой части более одного порождающего правила, множество направляющих символов, соответствующих правым частям альтернативных порождающих правил, – непересекающиеся.
Пример. Рассмотрим грамматикуG = ({E, E´, T, T´, F}, {id, +, *, (, )}, P, E), гдеP =
(1) E T E´
(2) E´ + T E´
(3) E´ e
(4) T F T´
(5) T´ * F T´
(6) T´ e
(7) F ( E )
(8) F id
|
Нетерминал |
Входной символ | |||||
|
id |
+ |
* |
( |
) |
$ | |
|
E |
(1) |
|
|
(1) |
|
|
|
E´ |
|
(2) |
|
|
(3) |
(3) |
|
T |
(4) |
|
|
(4) |
|
|
|
T´ |
|
(6) |
(5) |
|
(6) |
(6) |
|
F |
(8) |
|
|
(7) |
|
|
Символом $обозначается конец цепочки.
Пусть G = (N, Σ, P, S)– КС-грамматика. Обозначим вершину магазин какM (M N Σ {$})текущий символ входной цепочки – какIN (IN Σ {$}), а элемент таблицы разбора – какLT(A, a), гдеA N, a Σ. Тогда правила разбора будут следующими:
1) Положить в магазин S $
2) Если M N, то
2.1) Если LT(M, IN) = A α, то
2.1.1) убрать из магазина A
2.1.2) положить в Mправую часть правилаα
2.1.3) Вывести правило A α
2.2) Иначе – ошибка
3) Иначе если M Σ, то
3.1) Если M = IN = a, то
3.1.1) убрать aизM
3.1.2) убрать aизIN
3.2) Иначе – ошибка
4) Иначе
4.1) Если M = IN = $, то конец разбора
4.2) Иначе переход на шаг 2
Разбор:
Входная цепочка: id + id*id$
|
Магазин |
Вход |
Выход |
|
E $ |
id + id*id$ |
E T E´ |
|
T E´ $ |
id + id*id$ |
T F T´ |
|
F T´ E´ $ |
id + id*id$ |
F id |
|
id T´ E´ $ |
id + id*id$ |
|
|
T´ E´ $ |
+ id*id$ |
T´ e |
|
E´ $ |
+ id*id$ |
E´ + T E´ |
|
+ T E´ $ |
+ id*id$ |
|
|
T E´ $ |
id*id$ |
T F T´ |
|
F T´ E´ $ |
id*id$ |
F id |
|
id T´ E´ $ |
id*id$ |
|
|
T´ E´ $ |
*id$ |
T´ * F T´ |
|
* F T´ E´ $ |
*id$ |
|
|
F T´ E´ $ |
id$ |
F id |
|
id T´ E´ $ |
id$ |
|
|
T´ E´ $ |
$ |
T´ e |
|
E´ $ |
$ |
E´ e |
|
$ |
$ |
|
Определение. Множество терминальныхсимволов-предшественниковопределяется следующим образом:
a S(α) α + aβ,
где
α, β– строки терминалов и/илинетерминалов, α, β (N Σ)*;
S(α)– множество символов-предшественниковα, S(α) Σ {e}.
Это множество символов, с которых могут начинаться строки, выводимые изα.
Пример:
P Ac
P Bd
A a
A Aa
B b
B bB
Здесь символы aиb– символы-предшественники дляP.
Определение. Множество терминальныхсимволов-последователейопределяется следующим образом:
a F(A) αAβ + αaγ,
где
A–нетерминал,A N;
α, β, γ– строки терминалов и/илинетерминалов, α, β, γ (N Σ)*;
F(A)– множество символов-последователейA, F(A) Σ {$}.
Это множество символов, которые могут следовать за A.
В предыдущем примере aиc– символы-последователи дляA(т.е. появляются непосредственно справа отAпри выводе)
Определение. ЕслиA–нетерминал, то егонаправляющими символами(T) будут символы-предшественникиAи все символы, следующие заA, еслиAможет генерировать пустую строку.
В общем случае, для заданной цепочки αинетерминалаA (Aα)имеем
T(A, α) = {a | (a S(α) a ≠ e) (α * e и a F(A))}.
Пример:
T AB
A PQ
A BC
P pP
P e
Q qQ
Q e
B bB
B d
C cC
C f
Эта грамматика дает S(PQ) = {p, q}, S(BC) = {b, d}, поэтому T(A, PQ) = {p, q, b, d} и T(A, BC) = {b, d}.
Из определения LL(1)-грамматики следует, что эти грамматики можно разбирать детерминированносверху вниз.
