Сейчас мы рассмотрим еще один метод синтаксического
Два отличия
16.1.1.
Доказать, что если слово, состоящее из терминалов,
выводимо, то оно имеет
Нам будет удобно смотреть на
Next ) в конец слова $$S$$, удалив его из $$A$$ (это действие называют Отметим, что
Говорят, что
16.1.2.
Доказать, что для любого слова $$A$$ (из терминалов)
успешно завершающийся
Решение. При сдвиге слово $$SA$$ не меняется, при
Поскольку в ходе
Задача построения правого вывода для данного слова
сводится, таким образом, к правильному выбору очередного шага
Пусть фиксирована
Пусть $${K}\to{U}$$ - одно из правил K - U - слово из терминалов и нетерминалов). Определим множество слов (из терминалов и нетерминалов), называемое U в K в ходе
некоторого успешно завершающегося
16.1.3. Переформулировать это определение на языке правых выводов.
Решение. Рассмотрим все правые выводы вида$$\langle{\text {начальный нетерминал}}\rangle
\leadsto{XKA} \to {XUA},$$
где A - слово из терминалов, X - слово из терминалов
и нетерминалов. Все возникающие при этом слова XU и образуют левый контекст правила $${K}\to{U}$$. Чтобы убедиться в этом, следует вспомнить, что мы предполагаем, что из любого XUA может быть продолжен до правого вывода какого-то слова из терминалов.
16.1.4.
Все слова из $${ЛевКонт}({K}\to{U})$$ кончаются,
очевидно, на U. Доказать, что если у всех них этот
конец U отбросить, то полученное множество слов не
зависит от того, какое из правил для K
выбрано. (Это множество обозначается $${Лев}({K})$$.)
Решение. Из предыдущей задачи ясно, что $${Лев}({K})$$ - это все, что может появиться в правых выводах левее самого правого K.
16.1.5.
Доказать, что в предыдущей фразе можно отбросить слова "
самого правого": $${Лев}({K})$$ - это все то, что может появляться в правых выводах левее любого вхождения K.
Решение. Продолжив построение правого вывода, все нетерминалы справа от K можно заменить на терминалы (а слева от K при этом ничего не изменится).
16.1.6.
Построить грамматику, содержащую для каждого K исходной K исходной
Решение. Пусть P - начальный P ;
если слово X может появиться слева от K, то X может появиться слева от L, XLt может
появиться слева от M, XLtM - слева от N.
16.1.7. Почему в предыдущей задаче важно, что мы рассматриваем только правые выводы?
Ответ. В противном случае следовало бы учитывать преобразования, происходящие внутри слова, стоящего слева от K.
16.1.8.
Для данной
(Замечание для знатоков. Существование такого алгоритма -
и даже конечного
Решение. Будем называть K, L, M, N - нетерминалы, t - терминал)
порождает пять ситуаций$${K}\to\_\,{L}\,{t}\,{M}\,{N} \quad\
{K}\to{L}\,\_\,{t}\,{M}\,{N} \quad\
{K}\to{L}\,{t}\,\_\,{M}\,{N} \quad\
{K}\to{L}\,{t}\,{M}\,\_\,{N} \quad\
{K}\to{L}\,{t}\,{M}\,{N}\,\_$$
(позиция указывается знаком подчеркивания).
Будем говорить, что слово S S кончается на U, то есть $${S}={T}{U}$$ при некотором T, и, кроме того, T принадлежит $${Лев}({K})$$. (Смысл этого определения примерно таков: в S подготовлена часть U для будущей UV в K.) В этих терминах $${ЛевКонт}({K}\to{X})$$ - это множество всех слов,
согласованных с ситуацией $${K}\to{X}\,\_\$$,,
а $${Лев}({K})$$ - это множество всех слов, согласованных с ситуацией $${K}\to\_\,{X}$$ (где $${K}\to\,{X}$$ - любое правило для K ).
S
S, и оно
оканчивается на U ;S не затрагивается, а справа от него
появляется V ;UV сворачивается в K ;16.1.9. Доказать эквивалентность этих определений.
Указание.
Если $${S} ={TU}$$ и T принадлежит $${Лев}({K})$$, то можно получить в T, потом U, потом V, потом свернуть UV в K и затем успешно завершить процесс. (Мы используем несколько раз тот факт, что из любого
Наша цель - построение алгоритма, распознающего
принадлежность произвольного слова к $${Лев}({K})$$.
Рассмотрим функцию, сопоставляющую с каждым словом S
(из терминалов и нетерминалов) множество всех согласованных
с ним ситуаций. Это множество назовем S }. Будем обозначать его $${Сост}({S})$$. Достаточно показать, что функция $${Сост}({S})$$ индуктивна, то есть что значение $${Сост}({SJ})$$, где J - терминал или J. (Мы видели
ранее, как принадлежность к $${Лев}({K})$$ выражается в терминах этой функции.) Значение $${Сост}({SJ})$$ вычисляется по таким правилам:
(1) Если слово S согласовано с ситуацией K->U_V, причем слово V начинается на букву J, то есть V=JW, то SJ согласовано с ситуацией K->UJ_W.
Это правило полностью определяет все ситуации с непустой
левой половиной (то есть не начинающиеся с подчеркивания),
согласованные с SJ. Осталось определить, для каких
нетерминалов K слово SJ принадлежит $${Лев}({K})$$. Это делается по двум правилам:
(2) Если ситуация L->U_V согласована с SJ (согласно правилу (1)), а V начинается на K, то SJ принадлежит Лев(K).
(3) Если SJ входит в Лев(L) для некоторого L, причем L->V - правило V начинается на K, то SJ принадлежит Лев(K).
Заметим, что правило (3) можно рассматривать как аналог
правила (2): в указанных в (3) предположениях ситуация $${L}\to\_{V}$$ согласована с SJ, а V начинается на K.
Корректность этих правил в общем-то очевидна, если
хорошенько подумать. Единственное, что требует некоторых
пояснений - это то, почему с помощью правил (2) и (3)
обнаружатся $$\textsl{все}$$ терминалы K, для которых SJ принадлежит $${Лев}({K})$$. Попытаемся это объяснить. Рассмотрим правый вывод, в котором SJ стоит слева от K.
Откуда мог взяться в нем K? Если правило, которое его породило, породило также и конец слова SJ, то
принадлежность SJ к $${Лев}({K})$$ будет обнаружена по правилу (2). Если же K было первой буквой слова, порожденного каким-то другим нетерминалом L, то - благодаря правилу (3) - достаточно установить принадлежность SJ к $${Лев}({L})$$. Осталось применить те же рассуждения к L и так далее.
В терминах K может участвовать в нескольких
SJ (они соответствуют применению
правила (3)), но затем он обязан подвергнуться свертке,
затрагивающей SJ (что соответствует применению правила
(2)).
Осталось выяснить, какие ситуации согласованы с пустым
словом, то есть для каких нетерминалов K пустое слово
принадлежит $${Лев}({K})$$. Это определяется по следующим правилам:
K таков и K -> V - правило V начинается с L, то и L
таков.16.1.10.
Проделать описанный анализ для
Решение. Множества Сост(S) для различных S приведены в таблице (см. ниже).
| Слово S | Сост (S) |
|---|---|
| пустое | E->_E+T E->_T T->_T*F T->_F F->_x F->_(E) |
E |
E->E_+T |
T |
E->T_ T->T_*F |
F |
T->F_ |
x |
F->x_ |
( |
F->(_E) E->_E+T E->_T T->_T*F T->_F F->_x F->_(E) |
E+ |
E->E+_T T->_T*F T->_F F->_x F->_(E) |
T* |
T->T*_F F->_x F->_(E) |
(E |
F->(E_) E->E_+T |
(T |
=T |
(F |
=F |
(x |
=x |
(( |
=( |
E+T |
E->E+T_ T->T_*F |
E+F |
=F |
E+x |
=x |
E+( |
=( |
T*F |
T->T*F |
T*x |
=x |
T*( |
=( |
(E) |
F->(E)_ |
(E+ |
=E+ |
E+T* |
=T* |
Знак
Правило определения $${Сост}({SJ})$$, если известны $${Сост}({S})$$ и J (здесь S - слово из терминалов и нетерминалов, J - терминал или
надо найти Сост(S) в правой колонке, взять
соответствующее ему слово T в левой колонке, приписать к нему J
и взять множество, стоящее напротив слова TJ
(если слово TJ в таблице отсутствует, то Сост(SJ)
пусто).
Напомним, что наша основная цель - это поиск вывода
заданного слова, или, другими словами, поиск успешного
(1) В успешном K->U при содержимом S тогда и только
тогда, когда S принадлежит ЛевКонт(K->U)
или, другими словами, когда слово S согласовано
с ситуацией K->U_.
Аналогичное утверждение про сдвиг гласит:
(2) В успешном S
возможен сдвиг с S согласовано с некоторой ситуацией K->U_aV.
16.2.1. Доказать это.
Указание.
Пусть произошел сдвиг и к S добавилась буква a.
Рассмотрите первую
Рассмотрим некоторую грамматику и произвольное слово S из терминалов и нетерминалов. Если множество $${Сост}({S})$$ содержит ситуацию, в которой справа от подчеркивания стоит терминал, то говорят, что для
слова S возможен сдвиг. Если в $${Сост}({S})$$ есть ситуация, в которой справа от подчеркивания ничего нет, то
говорят, что для слова S возможна S возникает S возникает
S.
16.2.2.
Является ли приведенная выше
Решение. Нет, не является. Для слов T и E+T имеются конфликты типа сдвиг/
16.2.3.
Являются ли
Решение. Являются, см. таблицы ниже (
| Слово S | Сост (S) |
|---|---|
| пустое | T->_0 T->_T1 T->_TT2 T->_TTT3 |
0 |
T->0_ |
T |
T->T_1 T->T_T2 T->T_TT3 T->_0 T->_T1 T->_TT2 T->_TT3 |
T1 |
T->T1_ |
TT |
T->TT_2 T->TT_T3 T->T_1 T->T_T2 T->T_TT3 T->_0 T->_T1 T->_TT2 T->_TTT3 |
TT2 |
T->TT2_ |
TTT |
T->TTT_3 T->TT_2 T->TT_T3 T->T_1 T->T_T2 T->T_TT3 T->_0 T->_T1 T->)TT2 T->_TTT3 |
TT0 |
=0 |
TTT3 |
T->TTT3_ |
TTT2 |
=TT2 |
TTTT |
=TTT |
TTT0 |
=0 |
| Слово S | Сост (S) |
|---|---|
| пустое | T->_0 T->_1T T->_1TT T->_3TTT |
0 |
T->0_ |
1 |
T->1_T T->_0 T->_1T T->_2TT T->_3TTT |
2 |
T->2_TT T->_0 T->_1T T->_2TT T->_3TTT |
3 |
T->3_TTT T->_0 T->_1T T->_2TT T->_3TTT |
1T |
T->1T_ |
10 |
=0 |
11 |
=1 |
12 |
=2 |
13 |
=3 |
2T |
T->2T_T T->_0 T->_1T T->_2TT T->_3TTT |
20 |
=0 |
21 |
=1 |
22 |
=2 |
23 |
=3 |
3T |
T->3T_TT T->_0 T->_1T T->_2TT T->_3TTT |
30 |
=0 |
31 |
=1 |
32 |
=2 |
33 |
=3 |
2TT |
T->2TT_ |
2T0 |
=0 |
2T1 |
=1 |
2T2 |
=2 |
2T3 |
=3 |
3TT |
T->3TT_T T->_0 T->_1T T->_2TT T->_3TTT |
3T0 |
=0 |
3T1 |
=1 |
3T2 |
=2 |
3T3 |
=3 |
3TTT |
T->3TTT_ |
3TTT0 |
=0 |
3TTT1 |
=1 |
3TTT2 |
=2 |
3TTT3 |
=3 |
Эта задача показывает, что
16.2.4.
Пусть дана
Решение. Пусть дано произвольное слово. Будем строить S. Нам надо решить, делать сдвиг или S возможен либо только сдвиг, либо только
16.2.5.
Что произойдет, если анализируемое слово не имеет
вывода в данной
Ответ. Либо на некотором шаге не будет возможен ни сдвиг, ни
Замечания. 1. При реализации этого алгоритма нет необходимости каждый раз заново вычислять множество $${Сост}({S})$$ для текущего значения S. Эти множества
можно также хранить в T текущего слова S ).
2. На самом деле само слово S можно не хранить -
достаточно хранить множества ситуаций $${Сост}({T})$$ для всех
его начал T (включая само S ).
В алгоритме проверки выводимости в Next ). Глядя на состояние, можно сказать, при каких
значениях Next возможен сдвиг (это те терминалы,
которые в ситуациях этого состояния стоят непосредственно
за подчеркиванием). Сложнее воспользоваться информацией
о символе Next для решения вопроса о том, возможна ли
Напомним, что для любого K мы определяли
(см. пункт 15.3.)
множество $${Послед}({K})$$ тех терминалов, которые могут
стоять непосредственно за $${K}$$ в выводимом (из начального
, если K может стоять в конце
выводимого слова.
16.3.1.
Доказать, что если в данный момент S равен K, причем процесс этот может
в дальнейшем успешно завершиться, то Next принадлежит $${Послед}({K})$$.
Решение. Этот факт является непосредственным следствием
определения (вспомним соответствие между правыми выводами и
Рассмотрим некоторую грамматику, произвольное слово S
из терминалов и нетерминалов и терминал x. Если
множество $${Сост}({S})$$ содержит ситуацию, в которой справа от подчеркивания стоит терминал x, то говорят, что для пары $$\langle{S},{x}\rangle$$ возможен сдвиг. Если в $${Сост}({S})$$ есть
ситуация $${K}\to{U}\_\$$,, причем x принадлежит $${Послед}({K})$$, то говорят, что для пары $$\langle{S},{x}\rangle$$
16.3.2.
Пусть дана
Решение. Аналогично случаю Next ).
16.3.3.
Проверить, является ли приведенная выше в задаче 16.1.10. E, T и F )
Решение. Да, является, так как оба конфликта, мешающие ей
быть T, и для слова E+T сдвиг возможен только при $${Next}={*}$$, а символ * не принадлежит ни $${Послед}({E}) = \{{EOI},{+},{)}\}$$, ни $${Послед}({T}) = \{{EOI},{+},{*},{)}\}$$,
и поэтому при $${Next}={*}$$
Описанный выше S и отдельно - возможна ли Next. Между тем эти проверки не являются
независимыми: обе могут дать положительный ответ, но тем не
менее S и очередном символе Next
невозможна. В
Next при свертке).
Пусть $${K}\to{U}$$ - одно из правил t - некоторый терминал или
(который мы домысливаем в конце входного слова). Определим
множество $${ЛевКонт}({K}\to{U},{t})$$
как множество всех слов, которые являются содержимым U в K в ходе
успешного
Если отбросить у всех слов из $${ЛевКонт}({K}\to{U})$$
их конец U, то получится множество всех слов, которые
могут появиться в правых выводах перед нетерминалом K,
за которым стоит символ t. Это множество (не зависящее
от того, какое из правил $${K}\to{U}$$ для
K выбрано) мы будем обозначать $${Лев}({K},{t})$$.
16.4.1. Написать грамматику для порождения множеств $${Лев}({K},{t})$$.
Решение. Ее нетерминалами будут символы $$\langle{ЛевK}\:{t}\rangle$$ для каждого
K и для каждого терминала t (а также
для $${t}={EOI}$$ ). Ее правила таковы. Пусть P -
начальный L, M, N - нетерминалы, u - терминал) в новую грамматику мы добавим правила$$\langle{ЛевL}\:{u}\rangle \to
\langle{ЛевK}\:{x}\rangle$$
(для всех терминалов x );$$\langle{ЛевM}\:{s}\rangle \to
\langle{ЛевK}\:{y}\rangle\,{L}\,{u}$$
(для всех s, которые могут начинать слова, выводимые
из N, и для всех y, а также для всех пар $${s} =
{y}$$, если из N выводимо пустое слово);$$\langle{ЛевN}\:{s}\rangle \to
\langle{ЛевK}\:{s}\rangle\,{L}\,{u}\,{M}$$
(для всех терминалов s ).
16.4.2. Как меняется определение ситуации?
Решение. Ситуацией называется пара$$[ \text{ситуация в старом смысле}, \text{терминал или {EOI}} ]$$
16.4.3. Как изменится определение согласованности?
Решение. Слово S из терминалов и нетерминалов
согласовано с ситуацией $$[{K}\to{U}\_{V},\,{t}]$$ (здесь t - терминал или ), если S кончается на U,
то есть $${S}={TU}$$, и, кроме того, T принадлежит $${Лев}({K},{t})$$.
16.4.4.
Каковы правила для индуктивного вычисления множества $${Сост}({S})$$ ситуаций, согласованных с данным словом S?
Ответ.
(1) Если слово S согласовано с ситуацией [K->U_V,t], причем слово V начинается
на букву J, то есть V=JW, то слово SJ
согласовано с ситуацией [K->UJ_W,t].
Это правило полностью определяет все ситуации с непустой
левой половиной (то есть не начинающиеся с подчеркивания),
согласованные с SJ. Осталось определить, для каких
нетерминалов K и терминалов t слово SJ принадлежит $${Лев}({K},{t})$$. Это делается по двум правилам:
(2) Если ситуация [L->U\_V,t] согласована с SJ (согласно
Правилу (1)), а V начинается на K, то SJ
принадлежит Лев(K,s) для всех терминалов s,
которые могут начинать слова, выводимые из слова V\K (слово V без первой буквы K ), а также
для s=t, если из V\K выводится
пустое слово.
(3) Если SJ входит
в Лев(L,t) для некоторых L и t, причем L->V - правило V начинается на
K, то SJ принадлежит Лев(K,s)
для всех терминалов s, которые могут начинать слова, выводимые из V\K, а также для s=t,
если из V\K выводится пустое слово.
16.4.5.
Дать определения
Решение. Пусть дана некоторая S - произвольное слово из терминалов и нетерминалов. Если множество $${Сост}({S})$$ содержит ситуацию, в которой справа от подчеркивания стоит терминал t, то говорят, что для пары $$\langle {S},{t}\rangle$$ возможен сдвиг. (Это определение не изменилось по сравнению с
Если в $${Сост}({S})$$ есть ситуация, в которой справа от подчеркивания ничего нет, а вторым членом пары является терминал t, то говорят, что для пары $$\langle
{S},{t}\rangle$$
16.4.6.
Построить алгоритм проверки выводимости слова в
Решение. Как и раньше, на каждом шаге
Полезно (в частности, для
16.4.7. Сформулировать и доказать соответствующее утверждение.
Ответ. Пусть фиксирована некоторая S из терминалов и нетерминалов является t (или для $${t}={EOI}$$ ). То же самое
другими словами: $${Лев}({K})$$ есть объединение $${Лев}({K},{t})$$ по всем t. В последней форме это
совсем ясно.
Замечание. Таким образом, функция $${Сост}({S})$$ в
Теперь мы можем дать определение S - слово из нетерминалов и терминалов, t - некоторый терминал (или ). Будем говорить, что для пары $$\langle{S},{t}\rangle$$
16.4.8.
Доказать, что всякая
Указание. Это - простое следствие определений.
16.4.9. Построить алгоритм проверки выводимости
в
Указание.
Достаточно хранить в
16.4.10.
Привести пример
16.4.11.
Привести пример
Применение этих методов на практике имеет свои хитрости и тонкости, которых мы не касались. (Например, таблицы следует
хранить по возможности экономно.) Часто оказывается также, что
для некоторого входного языка наиболее естественная
Большое количество полезной и хорошо изложенной информации о теории и практике
Сейчас мы рассмотрим еще один метод синтаксического
Два отличия
16.1.1.
Доказать, что если слово, состоящее из терминалов,
выводимо, то оно имеет
Нам будет удобно смотреть на
Next ) в конец слова $$S$$, удалив его из $$A$$ (это действие называют Отметим, что
Говорят, что
16.1.2.
Доказать, что для любого слова $$A$$ (из терминалов)
успешно завершающийся
Решение. При сдвиге слово $$SA$$ не меняется, при
Поскольку в ходе
Задача построения правого вывода для данного слова
сводится, таким образом, к правильному выбору очередного шага
Пусть фиксирована
Пусть $${K}\to{U}$$ - одно из правил K - U - слово из терминалов и нетерминалов). Определим множество слов (из терминалов и нетерминалов), называемое U в K в ходе
некоторого успешно завершающегося
16.1.3. Переформулировать это определение на языке правых выводов.
Решение. Рассмотрим все правые выводы вида$$\langle{\text {начальный нетерминал}}\rangle
\leadsto{XKA} \to {XUA},$$
где A - слово из терминалов, X - слово из терминалов
и нетерминалов. Все возникающие при этом слова XU и образуют левый контекст правила $${K}\to{U}$$. Чтобы убедиться в этом, следует вспомнить, что мы предполагаем, что из любого XUA может быть продолжен до правого вывода какого-то слова из терминалов.
16.1.4.
Все слова из $${ЛевКонт}({K}\to{U})$$ кончаются,
очевидно, на U. Доказать, что если у всех них этот
конец U отбросить, то полученное множество слов не
зависит от того, какое из правил для K
выбрано. (Это множество обозначается $${Лев}({K})$$.)
Решение. Из предыдущей задачи ясно, что $${Лев}({K})$$ - это все, что может появиться в правых выводах левее самого правого K.
16.1.5.
Доказать, что в предыдущей фразе можно отбросить слова "
самого правого": $${Лев}({K})$$ - это все то, что может появляться в правых выводах левее любого вхождения K.
Решение. Продолжив построение правого вывода, все нетерминалы справа от K можно заменить на терминалы (а слева от K при этом ничего не изменится).
16.1.6.
Построить грамматику, содержащую для каждого K исходной K исходной
Решение. Пусть P - начальный P ;
если слово X может появиться слева от K, то X может появиться слева от L, XLt может
появиться слева от M, XLtM - слева от N.
16.1.7. Почему в предыдущей задаче важно, что мы рассматриваем только правые выводы?
Ответ. В противном случае следовало бы учитывать преобразования, происходящие внутри слова, стоящего слева от K.
16.1.8.
Для данной
(Замечание для знатоков. Существование такого алгоритма -
и даже конечного
Решение. Будем называть K, L, M, N - нетерминалы, t - терминал)
порождает пять ситуаций$${K}\to\_\,{L}\,{t}\,{M}\,{N} \quad\
{K}\to{L}\,\_\,{t}\,{M}\,{N} \quad\
{K}\to{L}\,{t}\,\_\,{M}\,{N} \quad\
{K}\to{L}\,{t}\,{M}\,\_\,{N} \quad\
{K}\to{L}\,{t}\,{M}\,{N}\,\_$$
(позиция указывается знаком подчеркивания).
Будем говорить, что слово S S кончается на U, то есть $${S}={T}{U}$$ при некотором T, и, кроме того, T принадлежит $${Лев}({K})$$. (Смысл этого определения примерно таков: в S подготовлена часть U для будущей UV в K.) В этих терминах $${ЛевКонт}({K}\to{X})$$ - это множество всех слов,
согласованных с ситуацией $${K}\to{X}\,\_\$$,,
а $${Лев}({K})$$ - это множество всех слов, согласованных с ситуацией $${K}\to\_\,{X}$$ (где $${K}\to\,{X}$$ - любое правило для K ).
S
S, и оно
оканчивается на U ;S не затрагивается, а справа от него
появляется V ;UV сворачивается в K ;16.1.9. Доказать эквивалентность этих определений.
Указание.
Если $${S} ={TU}$$ и T принадлежит $${Лев}({K})$$, то можно получить в T, потом U, потом V, потом свернуть UV в K и затем успешно завершить процесс. (Мы используем несколько раз тот факт, что из любого
Наша цель - построение алгоритма, распознающего
принадлежность произвольного слова к $${Лев}({K})$$.
Рассмотрим функцию, сопоставляющую с каждым словом S
(из терминалов и нетерминалов) множество всех согласованных
с ним ситуаций. Это множество назовем S }. Будем обозначать его $${Сост}({S})$$. Достаточно показать, что функция $${Сост}({S})$$ индуктивна, то есть что значение $${Сост}({SJ})$$, где J - терминал или J. (Мы видели
ранее, как принадлежность к $${Лев}({K})$$ выражается в терминах этой функции.) Значение $${Сост}({SJ})$$ вычисляется по таким правилам:
(1) Если слово S согласовано с ситуацией K->U_V, причем слово V начинается на букву J, то есть V=JW, то SJ согласовано с ситуацией K->UJ_W.
Это правило полностью определяет все ситуации с непустой
левой половиной (то есть не начинающиеся с подчеркивания),
согласованные с SJ. Осталось определить, для каких
нетерминалов K слово SJ принадлежит $${Лев}({K})$$. Это делается по двум правилам:
(2) Если ситуация L->U_V согласована с SJ (согласно правилу (1)), а V начинается на K, то SJ принадлежит Лев(K).
(3) Если SJ входит в Лев(L) для некоторого L, причем L->V - правило V начинается на K, то SJ принадлежит Лев(K).
Заметим, что правило (3) можно рассматривать как аналог
правила (2): в указанных в (3) предположениях ситуация $${L}\to\_{V}$$ согласована с SJ, а V начинается на K.
Корректность этих правил в общем-то очевидна, если
хорошенько подумать. Единственное, что требует некоторых
пояснений - это то, почему с помощью правил (2) и (3)
обнаружатся $$\textsl{все}$$ терминалы K, для которых SJ принадлежит $${Лев}({K})$$. Попытаемся это объяснить. Рассмотрим правый вывод, в котором SJ стоит слева от K.
Откуда мог взяться в нем K? Если правило, которое его породило, породило также и конец слова SJ, то
принадлежность SJ к $${Лев}({K})$$ будет обнаружена по правилу (2). Если же K было первой буквой слова, порожденного каким-то другим нетерминалом L, то - благодаря правилу (3) - достаточно установить принадлежность SJ к $${Лев}({L})$$. Осталось применить те же рассуждения к L и так далее.
В терминах K может участвовать в нескольких
SJ (они соответствуют применению
правила (3)), но затем он обязан подвергнуться свертке,
затрагивающей SJ (что соответствует применению правила
(2)).
Осталось выяснить, какие ситуации согласованы с пустым
словом, то есть для каких нетерминалов K пустое слово
принадлежит $${Лев}({K})$$. Это определяется по следующим правилам:
K таков и K -> V - правило V начинается с L, то и L
таков.16.1.10.
Проделать описанный анализ для
Решение. Множества Сост(S) для различных S приведены в таблице (см. ниже).
| Слово S | Сост (S) |
|---|---|
| пустое | E->_E+T E->_T T->_T*F T->_F F->_x F->_(E) |
E |
E->E_+T |
T |
E->T_ T->T_*F |
F |
T->F_ |
x |
F->x_ |
( |
F->(_E) E->_E+T E->_T T->_T*F T->_F F->_x F->_(E) |
E+ |
E->E+_T T->_T*F T->_F F->_x F->_(E) |
T* |
T->T*_F F->_x F->_(E) |
(E |
F->(E_) E->E_+T |
(T |
=T |
(F |
=F |
(x |
=x |
(( |
=( |
E+T |
E->E+T_ T->T_*F |
E+F |
=F |
E+x |
=x |
E+( |
=( |
T*F |
T->T*F |
T*x |
=x |
T*( |
=( |
(E) |
F->(E)_ |
(E+ |
=E+ |
E+T* |
=T* |
Знак
Правило определения $${Сост}({SJ})$$, если известны $${Сост}({S})$$ и J (здесь S - слово из терминалов и нетерминалов, J - терминал или
надо найти Сост(S) в правой колонке, взять
соответствующее ему слово T в левой колонке, приписать к нему J
и взять множество, стоящее напротив слова TJ
(если слово TJ в таблице отсутствует, то Сост(SJ)
пусто).
Напомним, что наша основная цель - это поиск вывода
заданного слова, или, другими словами, поиск успешного
(1) В успешном K->U при содержимом S тогда и только
тогда, когда S принадлежит ЛевКонт(K->U)
или, другими словами, когда слово S согласовано
с ситуацией K->U_.
Аналогичное утверждение про сдвиг гласит:
(2) В успешном S
возможен сдвиг с S согласовано с некоторой ситуацией K->U_aV.
16.2.1. Доказать это.
Указание.
Пусть произошел сдвиг и к S добавилась буква a.
Рассмотрите первую
Рассмотрим некоторую грамматику и произвольное слово S из терминалов и нетерминалов. Если множество $${Сост}({S})$$ содержит ситуацию, в которой справа от подчеркивания стоит терминал, то говорят, что для
слова S возможен сдвиг. Если в $${Сост}({S})$$ есть ситуация, в которой справа от подчеркивания ничего нет, то
говорят, что для слова S возможна S возникает S возникает
S.
16.2.2.
Является ли приведенная выше
Решение. Нет, не является. Для слов T и E+T имеются конфликты типа сдвиг/
16.2.3.
Являются ли
Решение. Являются, см. таблицы ниже (
| Слово S | Сост (S) |
|---|---|
| пустое | T->_0 T->_T1 T->_TT2 T->_TTT3 |
0 |
T->0_ |
T |
T->T_1 T->T_T2 T->T_TT3 T->_0 T->_T1 T->_TT2 T->_TT3 |
T1 |
T->T1_ |
TT |
T->TT_2 T->TT_T3 T->T_1 T->T_T2 T->T_TT3 T->_0 T->_T1 T->_TT2 T->_TTT3 |
TT2 |
T->TT2_ |
TTT |
T->TTT_3 T->TT_2 T->TT_T3 T->T_1 T->T_T2 T->T_TT3 T->_0 T->_T1 T->)TT2 T->_TTT3 |
TT0 |
=0 |
TTT3 |
T->TTT3_ |
TTT2 |
=TT2 |
TTTT |
=TTT |
TTT0 |
=0 |
| Слово S | Сост (S) |
|---|---|
| пустое | T->_0 T->_1T T->_1TT T->_3TTT |
0 |
T->0_ |
1 |
T->1_T T->_0 T->_1T T->_2TT T->_3TTT |
2 |
T->2_TT T->_0 T->_1T T->_2TT T->_3TTT |
3 |
T->3_TTT T->_0 T->_1T T->_2TT T->_3TTT |
1T |
T->1T_ |
10 |
=0 |
11 |
=1 |
12 |
=2 |
13 |
=3 |
2T |
T->2T_T T->_0 T->_1T T->_2TT T->_3TTT |
20 |
=0 |
21 |
=1 |
22 |
=2 |
23 |
=3 |
3T |
T->3T_TT T->_0 T->_1T T->_2TT T->_3TTT |
30 |
=0 |
31 |
=1 |
32 |
=2 |
33 |
=3 |
2TT |
T->2TT_ |
2T0 |
=0 |
2T1 |
=1 |
2T2 |
=2 |
2T3 |
=3 |
3TT |
T->3TT_T T->_0 T->_1T T->_2TT T->_3TTT |
3T0 |
=0 |
3T1 |
=1 |
3T2 |
=2 |
3T3 |
=3 |
3TTT |
T->3TTT_ |
3TTT0 |
=0 |
3TTT1 |
=1 |
3TTT2 |
=2 |
3TTT3 |
=3 |
Эта задача показывает, что
16.2.4.
Пусть дана
Решение. Пусть дано произвольное слово. Будем строить S. Нам надо решить, делать сдвиг или S возможен либо только сдвиг, либо только
16.2.5.
Что произойдет, если анализируемое слово не имеет
вывода в данной
Ответ. Либо на некотором шаге не будет возможен ни сдвиг, ни
Замечания. 1. При реализации этого алгоритма нет необходимости каждый раз заново вычислять множество $${Сост}({S})$$ для текущего значения S. Эти множества
можно также хранить в T текущего слова S ).
2. На самом деле само слово S можно не хранить -
достаточно хранить множества ситуаций $${Сост}({T})$$ для всех
его начал T (включая само S ).
В алгоритме проверки выводимости в Next ). Глядя на состояние, можно сказать, при каких
значениях Next возможен сдвиг (это те терминалы,
которые в ситуациях этого состояния стоят непосредственно
за подчеркиванием). Сложнее воспользоваться информацией
о символе Next для решения вопроса о том, возможна ли
Напомним, что для любого K мы определяли
(см. пункт 15.3.)
множество $${Послед}({K})$$ тех терминалов, которые могут
стоять непосредственно за $${K}$$ в выводимом (из начального
, если K может стоять в конце
выводимого слова.
16.3.1.
Доказать, что если в данный момент S равен K, причем процесс этот может
в дальнейшем успешно завершиться, то Next принадлежит $${Послед}({K})$$.
Решение. Этот факт является непосредственным следствием
определения (вспомним соответствие между правыми выводами и
Рассмотрим некоторую грамматику, произвольное слово S
из терминалов и нетерминалов и терминал x. Если
множество $${Сост}({S})$$ содержит ситуацию, в которой справа от подчеркивания стоит терминал x, то говорят, что для пары $$\langle{S},{x}\rangle$$ возможен сдвиг. Если в $${Сост}({S})$$ есть
ситуация $${K}\to{U}\_\$$,, причем x принадлежит $${Послед}({K})$$, то говорят, что для пары $$\langle{S},{x}\rangle$$
16.3.2.
Пусть дана
Решение. Аналогично случаю Next ).
16.3.3.
Проверить, является ли приведенная выше в задаче 16.1.10. E, T и F )
Решение. Да, является, так как оба конфликта, мешающие ей
быть T, и для слова E+T сдвиг возможен только при $${Next}={*}$$, а символ * не принадлежит ни $${Послед}({E}) = \{{EOI},{+},{)}\}$$, ни $${Послед}({T}) = \{{EOI},{+},{*},{)}\}$$,
и поэтому при $${Next}={*}$$
Описанный выше S и отдельно - возможна ли Next. Между тем эти проверки не являются
независимыми: обе могут дать положительный ответ, но тем не
менее S и очередном символе Next
невозможна. В
Next при свертке).
Пусть $${K}\to{U}$$ - одно из правил t - некоторый терминал или
(который мы домысливаем в конце входного слова). Определим
множество $${ЛевКонт}({K}\to{U},{t})$$
как множество всех слов, которые являются содержимым U в K в ходе
успешного
Если отбросить у всех слов из $${ЛевКонт}({K}\to{U})$$
их конец U, то получится множество всех слов, которые
могут появиться в правых выводах перед нетерминалом K,
за которым стоит символ t. Это множество (не зависящее
от того, какое из правил $${K}\to{U}$$ для
K выбрано) мы будем обозначать $${Лев}({K},{t})$$.
16.4.1. Написать грамматику для порождения множеств $${Лев}({K},{t})$$.
Решение. Ее нетерминалами будут символы $$\langle{ЛевK}\:{t}\rangle$$ для каждого
K и для каждого терминала t (а также
для $${t}={EOI}$$ ). Ее правила таковы. Пусть P -
начальный L, M, N - нетерминалы, u - терминал) в новую грамматику мы добавим правила$$\langle{ЛевL}\:{u}\rangle \to
\langle{ЛевK}\:{x}\rangle$$
(для всех терминалов x );$$\langle{ЛевM}\:{s}\rangle \to
\langle{ЛевK}\:{y}\rangle\,{L}\,{u}$$
(для всех s, которые могут начинать слова, выводимые
из N, и для всех y, а также для всех пар $${s} =
{y}$$, если из N выводимо пустое слово);$$\langle{ЛевN}\:{s}\rangle \to
\langle{ЛевK}\:{s}\rangle\,{L}\,{u}\,{M}$$
(для всех терминалов s ).
16.4.2. Как меняется определение ситуации?
Решение. Ситуацией называется пара$$[ \text{ситуация в старом смысле}, \text{терминал или {EOI}} ]$$
16.4.3. Как изменится определение согласованности?
Решение. Слово S из терминалов и нетерминалов
согласовано с ситуацией $$[{K}\to{U}\_{V},\,{t}]$$ (здесь t - терминал или ), если S кончается на U,
то есть $${S}={TU}$$, и, кроме того, T принадлежит $${Лев}({K},{t})$$.
16.4.4.
Каковы правила для индуктивного вычисления множества $${Сост}({S})$$ ситуаций, согласованных с данным словом S?
Ответ.
(1) Если слово S согласовано с ситуацией [K->U_V,t], причем слово V начинается
на букву J, то есть V=JW, то слово SJ
согласовано с ситуацией [K->UJ_W,t].
Это правило полностью определяет все ситуации с непустой
левой половиной (то есть не начинающиеся с подчеркивания),
согласованные с SJ. Осталось определить, для каких
нетерминалов K и терминалов t слово SJ принадлежит $${Лев}({K},{t})$$. Это делается по двум правилам:
(2) Если ситуация [L->U\_V,t] согласована с SJ (согласно
Правилу (1)), а V начинается на K, то SJ
принадлежит Лев(K,s) для всех терминалов s,
которые могут начинать слова, выводимые из слова V\K (слово V без первой буквы K ), а также
для s=t, если из V\K выводится
пустое слово.
(3) Если SJ входит
в Лев(L,t) для некоторых L и t, причем L->V - правило V начинается на
K, то SJ принадлежит Лев(K,s)
для всех терминалов s, которые могут начинать слова, выводимые из V\K, а также для s=t,
если из V\K выводится пустое слово.
16.4.5.
Дать определения
Решение. Пусть дана некоторая S - произвольное слово из терминалов и нетерминалов. Если множество $${Сост}({S})$$ содержит ситуацию, в которой справа от подчеркивания стоит терминал t, то говорят, что для пары $$\langle {S},{t}\rangle$$ возможен сдвиг. (Это определение не изменилось по сравнению с
Если в $${Сост}({S})$$ есть ситуация, в которой справа от подчеркивания ничего нет, а вторым членом пары является терминал t, то говорят, что для пары $$\langle
{S},{t}\rangle$$
16.4.6.
Построить алгоритм проверки выводимости слова в
Решение. Как и раньше, на каждом шаге
Полезно (в частности, для
16.4.7. Сформулировать и доказать соответствующее утверждение.
Ответ. Пусть фиксирована некоторая S из терминалов и нетерминалов является t (или для $${t}={EOI}$$ ). То же самое
другими словами: $${Лев}({K})$$ есть объединение $${Лев}({K},{t})$$ по всем t. В последней форме это
совсем ясно.
Замечание. Таким образом, функция $${Сост}({S})$$ в
Теперь мы можем дать определение S - слово из нетерминалов и терминалов, t - некоторый терминал (или ). Будем говорить, что для пары $$\langle{S},{t}\rangle$$
16.4.8.
Доказать, что всякая
Указание. Это - простое следствие определений.
16.4.9. Построить алгоритм проверки выводимости
в
Указание.
Достаточно хранить в
16.4.10.
Привести пример
16.4.11.
Привести пример
Применение этих методов на практике имеет свои хитрости и тонкости, которых мы не касались. (Например, таблицы следует
хранить по возможности экономно.) Часто оказывается также, что
для некоторого входного языка наиболее естественная
Большое количество полезной и хорошо изложенной информации о теории и практике
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.