Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры_по тяпу готовые.doc
Скачиваний:
6
Добавлен:
01.04.2025
Размер:
952 Кб
Скачать
☆

6. Контекстно-свободные языки. Вывод. Дерево вывода.

КСЯ можно разбирать на части. Паскаль имеет вложенную структуру. If E then S1 (оператор) else S2 (оператор). Здесь можно выделить синтаксические категории (S1) – нетерминалы и ключевые слова – терминалы (имеют законченный вид). Для описания синтаксиса ЯП используется БНФ. В ней даются определения нетерминалов через терминалы и нетерминалы. Для оператора if:

<оператор>::= if <выражение> then <оператор> else <оператор>. Далее каждый оператор также можно раскрыть.

Для каждой грамматики можно определить правило непосредственного вывода: если определены последовательности символов  и  такие, что  V* и  V* (конечное множество грамматических символов), и если задана продукция А→Р, то из последовательности символов А можно получить .

Здесь → означает применение правила подстановки или непосредственного вывода.

Допустим, если есть последовательность аАВС, то используя грамматику, применив правило 5 только к В, получим:

аАВС→аАвВС

↑

5

Выводом называется последовательность постановок, она обозначается →*. Эта запись означает, что из  выводится  за 0 или более шагов. →+: из  выводится  за 1 или более шагов.

Каждая цепочка символов, встречающихся в выводе, называется промежуточной цепочкой. Если промежуточная цепочка выводима из начального символа, то она называется выводимой цепочкой (сентенциальной формой).

Вывод цепочки можно представить в виде дерева. Построение дерева начинаем с корня, и применяя продукции строим ветви.(каждой части правила будет соответствовать ветвь)

Вывод цепочки можно представить в виде дерева. Если на каждом шаге заменяется самый левый нетерминал, то вывод называется левосторонним, если самый правый, то правосторонний.

В общем случае грамматика может порождать несколько различных деревьев вывода для одной и тоже цепочки (неоднозначная). Однозначная - если каждой выводимой цепочке соответствует единственное дерево вывода.

8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.

Суть: начинаем разбор со стартового нетерминала и, применяя продукции, заменяем нетерминал ее левой части на последовательность символов ее правой части. Цель: получить в обрамлении листьев этого дерева исходную последовательность.

Процедура рекурсивного разбора сверху вниз состоит из следующих шагов:

- Для узла дерева, помеченного, как нетерминал А, выбирают одну из продукций вида A. После этого строим от А ветви, соответствующие .

- Если в процессе применения продукций получено обрамление, несоответствующее входной последовательности, то производится откат.

- Находим следующий узел, помеченный нетерминалом, для подстановки правила.

Очень важно уметь правильно выбрать продукцию.

Для этого существует разновидность грамматик, называемых LL(k)-грамматики, которые позволяют сделать выбор продукции на основе первых k символов входной последовательности.

Самый распространенный вид - LL(1)-грамматики, когда выбрать продукцию можно только на основе 1-го символа.

L – входная последовательность обрабатывается слева направо, L – используется левый вывод (заменяется самый левый нетерминал), 1 – количество знаков из входной последовательности, необходимых для выбора продукции.

Как сделать выбор среди двух продукций: A → α | β?

Находим м-во FIRST для каждой продукции. Если из последовательности α ⇒* x γ (x принадлежит FIRST(α) ) и FIRST(α) ⋂ FIRST(β) = ∅ то выбор продукции можно сделать по одному символу продукции.

Если ε принадлежит FIRST(α) ≡ α ⇒ ε

Для такого случая выбор продукций будет определятся исходя из того какие терминалы могут встречаться непосредственно за А в какой либо сентенциальной форме.

Грамматика относится к классу LL(1) если FIRST(α) ⋂ FIRST(β) = ∅ ,

а если α ⇒* ε то должно выполняться FIRST(β) ⋂ FOLLOW(A) = ∅ .