- •1. Теория формальных языков как раздел математической лингвистики.
- •2. Понятие грамматики языка. Обозначения.
- •3. Классификация грамматик по Хомскому.
- •11. Исключение тупиковых правил из грамматики.
- •12. Обобщенные кс-грамматики и приведение их к удлиняющей форме.
- •26. Генерирование компанд по полиЗу
- •27. Алгоритм Замельсона и Бауэра перевода выражений в полиз
- •28. Атрибутные грамматики
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) УПЛ и БП переводят сканирование на символ с номером, переданном им в операнде.
