Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
автоматы.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
38.81 Кб
Скачать

11. Исключение тупиковых правил из грамматики.

Правило A->φBψ называется внешним тупиком, если не существует правила B->β (из нетерм. B нет выхода). Правило B-> β назыв. внутренним тупиком, если B!=S и не существует правила A-> φBψ (B не может появиться ни в одной цепочке - недостижимое состояние).

Циклический тупик, это группа правил вида A0->φ1A1ψ1..., где для любого Ai не существует правил вида B-> φAiψ (циклический тупик внутреннего типа), либо для любого Ai не существует правил вида Ai->α (циклический тупик внешнего типа).

Th. Для любой грамматики существует эквивалентная ей грамматика без тупиков. Д-во очевидно: правила, включающие тупики, при порождении терминальных цепочек не могут использоваться. Для устранения внешних тупиков, сформируем множество нетерминалов Xi, из которых терминальная цепочка получается не более чем за i шагов. Продолжим формирование новых Xi до тех пор, пока Zi = Xi \ Xi-1 не пусто. Исключив не включенные в множества Z нетерминалы из грамматики, получим эквивалентную грамматику без тупиков внешнего типа. Для устранения тупиков внутреннего типа, повторим процедуру с другого конца - положим Yi множеством символов (терм. и нетерм.), которые могут появиться на i-ом шаге вывода. Определим нетерминалы, появляющиеся на i-ом шаге. Не включенные нетерминалы удалим из грамматики - получим эквивалентную без внутренних тупиков.

12. Обобщенные кс-грамматики и приведение их к удлиняющей форме.

КС-грамматика называется обобщенной, если она содержит аннулирующие правила (ε-правила), то есть правила вида A->ε, ε - пустая цепочка. Для любой обобщенной КС-грамматики существует эквивалентная неукорачивающая КС-грамматика.

Th. Каждая КС-грамматика приводима к виду не более чем с одним аннулирующим правилом S->ε, которого можно и не быть. Доказательство конструктивно - построение неукорачивающей грамматики. Определим множество аннулирующих нетерминалов - нетерм. Zi из которых можно получить пустую цепочку ровно за i шагов. Если в этом множестве окажется S, то заменим во всех правилах исходной грамматики S на S' и добавим правило S-> ε|S'. Все остальные правила вида A-> ε можно удалить, удалив так же нетерминал A из остальных правил грамматики.

Th. Для любой КС-грамматики существует эквивалентная ей грамматика без цепных правил. Пусть имеется правило A->B, A!=S. Тогда все правила вида C->αAβ заменим на правила вида C->αBβ, а правила A->B удалим. Если A=S и для B существуют правила B-> ???, то заменим их на S-> ???, а S->B удалим.

13. Устранение левой рекурсии и левая факторизация.

Для любой КС-грамматики существует эквивалентная грамматика без левой рекурсии. Пусть нетерминал А имеет m леворекурсивных правил вида A->Aαi и n правил A->βj, которые не являются леворекурсивными. Заменим эти правила на A-> βj<список А>, <список А>->αi<список А>, <список А>->ε, где <список А> - новый нетерминал.

Если в грамматике имеется группа правил вида A->α β1|..| α βn, то цепочку α можно "вынести за скобку" и преобразовать данную группу правил к виду A-> αB; B-> β1|..| βn. Этот прием носит название левой факторизации

14. Общий вид цепочек А- и КС-языков.

Th. Пусть L - А-язык. Существует такая константа p, что если ψ L и | ψ|>=p, то цепочку ψ можно записать в виде αβγ, где 0<|β|<=p и α γ L, для всех i>=0.

Если L - конечный язык, то положим константу p не больше длины самой длинной цепочки языка L, тогда ни одна из цепочек языка не удовлетворяет условиям теоремы и она верна. В противном случае, пусть M = (Q, E, d, q0, F) - конечный автомат с n состояниями и L(M) = L. Пусть p=n. Если ψ L и | ψ|>=n, рассмотрим последовательность конфигураций, которую проходит автомат M, допуская цепочку ψ. Так как в такой последовательность по крайней мере n+1 конфигурация, то найдутся две конф. с одинаковыми состояниями. Поэтому, должна быть такая последовательность тактов, что (q0, αβγ) |-* (q1, βγ) |-k (q1, γ) |-* (q2, ε), для некоторого q1 и 0<k<=n. Отсюда 0<|β|<=n. Но тогда для любого i>0 автомат может проделать такую же последовательность тактов с α γ. Для случая i=0 все очевидно. Т.к. α γ L то и α γ L для всех i>=0.

Следствие 1. Язык, состоящий из цепочек не является автоматным языком.

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

Th. Для любой КС-грамматики, которая не допускает вывода вида A->+ αAγ, |α|>0, |γ|>0 можно построить эквивалентную А-грамматику. Любой язык, который при описании КС-грамматик не содержит самовставляемых нетерминалов, включает только одностороннюю рекурсию, при выводе наращивает цепочку в одну сторону - является автоматным языком.

Th. Для любого КС-языка L существует постоянная p такая, что если ψ L и | ψ|>=p, то ψ=αβγφλ, где β!=ε, φ!= ε и αβ^i γφ^i λ L для любого i.

Следствие 3 Язык L состоящий из цепочек не является КС-языком.

Следствие 4 Языки программирования в общем случае не являются КС-языками.

15. Операции над языками.

Объединение, пересечение, разность, дополнение.

Итерация языка L L* - 1) L^0 = {ε}; 2) L^n = LL^(n-1), n>=0; 3) L*=

Позитивная итерация - итерация без ε.

Подстановка вместо терминала a - терминал a заменяется на все возможные цепочки из подставляемого языка.

Обращение L^R - язык, содерж. все обращенные цепочки исходного языка.

16. Операции над КС-языками

Th. КС-языки замкнуты относительно операций объединения, конкатенации, итерации, подстановки и обращения. Не замкнуты относительно операций пересечения, дополнения, разности. Доказательство конструктивно.

17. Операции над А-языками.

Автоматные языки замкнуты относительно объединения, конкатенации, итерации, обращения, подстановки, пересечения, дополнения и разности. Доказательство конструктивно.

18. Операции над контекстными языками.

К-языки, как и КС-языки, замкнуты относительно операций объединения, конкатенации, итерации, обращения, подстановки и не замкнуты относительно операций пересечения, дополнения и разности. Выполняется преобразование полутерминалов. Каждый из терминальных символов исходных грамматик заменяется на нетерминал, помеченный соотв. терминальным символом: a замен. на Aa и добав. правило Aa->a. После этого осуществляется индексация нетерминалов исходных грамматик, что приводит к тому, что терминальные символы в разных грамматиках помечаются разными индексами и могут быть получены только в самом конце вывода цепочки, в результате этого контекст исходных грамматик не может привести к выводу цепочек, не принадлежащих результирующему языку.

19. Неоднозначность КС-грамматик и языков.

КС-грамматика неоднозначна, если сущ. цепочка, имеющая два или более различных деревьев вывода. Проблема определения однозначности алгоритмически неразрешима, зато можно указать вид правил, приводящих к неоднозначности.

A->AA|α - разрешается заменой двухсторонней рекурсии на одностороннюю.

A->A αA; A-> αA|Aβ; ... Все перечисленное так или иначе связанно с двухсторонней рекурсией, средства борьбы с неоднозначностью: замена на одностороннюю рекурсию и факторизация.

20. Методы анализа КС-языков. Грамматики предшествования.

Делятся на две группы: нисходящие (анализ сверху вниз) и восходящие (анализ снизу вверх) - что соответствует построению синтаксических деревьев вывода. Нисходящие - от корня дерева вниз, основаны на переборе всех возможных вариантов дерева. Восходящие - начинают разбор с листьев дерева, пытаясь построить дерево разбора от листьев к корню.

Отношения предшествования: равенство, меньше (раньше), больше (позже).

Равенство - если символы находятся рядом в одном правиле вывода. S1<S2 если S1 уже выведено, а S2 - будет стоять рядом с S1 при применении некоторого правила на следующем шаге. S1>S2 если S2 выведено, а S1 будет стоять рядом с S2 на следующем шаге вывода. Основа для свертки - символы, находящиеся между < и >.

Грамматики предшествования - узкий класс КС-грамматик, в которых 1) между любыми символами существует не более одного отношения предшествования, 2) не существует правил с одинаковыми правыми частями.

21. Грамматики предшествования Вирта

ОП опр. между любыми символами, как терм. так и нетерм.

1) Строится для любого нетерм. символа множество левых и правых символов. 2) Определяется ОП между символами 3) Последовательно выделяются основы для свертки. 4) Включается семантика в алгоритм свертки.

L(u) = {S|u->Sq || u->Aq && S L(A)}; R(u)={S| u->qS || u->qA && S R(A)}; Для любых стоящих рядом в правых частях символах справедливо: S1 = S2, S1<L(S2), R(S1)>S2,L(S2)

Возможны две ошибки: 1) между символами не сущ. ОП 2) выделена основа для свертки, а подход. правила нет.

22. Грамматика предшествования Флойда

ОП опр. только между терм. символами и не допускаются в правилах вывода двух рядом стоящих нетерминалов.

L(U) = {S|U->Sq || U->U1Sq || U->U1q && S L(U1)}; R(U)={S| U->qS || U->qS U1 || U->qU1 && S R(U1)};

S1 = S2 <=> ; S1>S2 <=> ; S1<S2 <=>

23. Функции предшествования/

Метод графов построения функции предшествования. В соответствии с таблицей предшествования граф строится след. образом: для каждого символа (ОП в таблице) определяются две вершины f(S1) и g(S2), при чем если S1 =S2, то две вершины объед. в одну. S1<S2 => ребро из g(S2) в f(S1), S1>S2 => ребро из f(S1) в g(S2). После построения графа:

1) Все вершины, для которых нет потомков, помечаются индексом 1 и удаляются из рассмотрения вместе с входящими в них дугами. 2)Вершины, у которых все потомки помечены, помечаются значениями на единицу больше, чем макс. индекс потомков, после этого удаляются из рассмотрения. 3) Выполняется пункт 2 пока все вершины не окажутся помеченными, при этом индекс вершины считается значением функции предшествования.

Метод инкриментов: 1) все значения f и g приравниваются единице 2) ФП изменяются в большую сторону след. образом:

S1<S2 => g(S2) = f(S1) +1; S1>S2 => f(S1) = g(S2) +1; S1 = S2 => f и g уравниваются с большим. Алгоритм завершается, когда на очередном шаге значения функций не изменяются.

24. Польская инверсная запись

Впервые применен польским математиком Я. Лукашевичем. Операторы располагаются непосредственно за операндами, над которыми они выполняются в порядке выполнения. УПЛ - условный переход по лжи, БП - безусловный переход.

25. Интерпретация ПОЛИЗа.

С помощью стека арифметическое выражение в полизе может быть вычислено за один просмотр слева направо. 1) Если сканируемый символ идентификатор или константа, то соответствующее им значение заносится в стек и переход к след. символу. 2) Если сканируемый символ унарный оператор, то он применяется к верхнему операнду в стеке, который затем заменяется на результат 3) Если сканируется бинарный оператор, то он применяется к двум верхним операндам в стеке, и затем они заменяются на результат. Исключение - оператор присваивания. 4) УПЛ и БП переводят сканирование на символ с номером, переданном им в операнде.