Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Теория_формальных_грамматик.docx
Скачиваний:
79
Добавлен:
16.03.2015
Размер:
81.14 Кб
Скачать

Тема 4: свойства контекстно-свободных и автоматных языков.

    1. Теорема об общем виде цепочек КС-языков и слов из него.

    2. Определение операций над языками.

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

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

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

    6. Выводы для практики.

    7. Неоднозначность контекстно-свободных грамматик.

    1. Теорема об общем виде цепочек КС-языков (теорема о разрастании).

Для любого КС-языка Lсуществует такое натуральное числоp>0 что для любой цепочки, принадлежащей языкуL, длина которой большеp, существует хотя бы один вариант разбиения этой цепочки на 5 частей такой что выполняется условие теоремы.

Доказательство: в качестве pрассмотрим максимальную длину цепочки, полученную бесповторным деревом вывода. Каждый нетерминал используется 1 раз.

Sαβ22µ € L, в общем виде:αβiiµ € L

αAµ

βφ

y

Следствие 1: Для любого автоматного языкаLсуществует такое натуральное числоp, что для любой цепочки ψ €L, |ψ|>pсуществует хотя бы один вариант разбиения этой цепочки на три части такой что выполняется условие теоремы.

С учётом особенностей автоматных грамматик, положив часть цепочек ψ и µ, равные пустым цепочкам (см. теорему о КС-языках), получим доказательство следствия.

Следствие 2: язык цепочек видаxnynzw,n=(1,∞) нет ни одного варианта, удовлетворяющего условию теоремы.

При p=3, ψ =xxyyzz

x(1) = α,x(2) =β,y(1) =j,yz=φ,z= µ

или x(1) = α,x(2) =β,yy=j,z(1) =φ,z(2) = µ

xxxyyzyzz/€L

Максимальное число, которе можно получить из повторного дерева вывода: p=2.

xnyn,n>1ψxxyy

x(1) = α,xy=β,y(2) =j

или x(1) = α,x(2) =β,yy=j

xxyxyy/€L

Следствие 3: любой конечный язык является автоматным.

Доказательство: если в качестве самой длинной цепочки взять L, то ни одна из цепочек языка не удовлетворяет условию теорему, а значит теорема верна.

Следствие 4: язык арфметических выражений не является автоматным языком.

Доказательство аналогично предыдущему. Парное количество чего-то и вложенность циклов – это контекстно-свободный язык.

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

Например, каждая процедура имеет одинаковое число параметров в каждом месте где она упоминается.

Язык, требующий описания идентификаторов, длина которых может быть произвольной до их использования, также не является контекстно-свободным.

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

    1. Определение операций над языками.

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

Операции, допустимые над множествами:

  1. Объединение: L=L1⋃L2= { α | α €L1vα €L2}

  2. Пересечение: L=L1⋂L2= { α | α €L1л α €L2}

  3. Разность: L=L1\L2= { α | α €L1л α /€L2}

  4. Дополнение: L=L1–L2= { α | α €L1vα €L2}

  5. Конкатенация: L1®L2= { α =βj|β€L1,j€L2}

  6. Итерация: L* = {φ* |φ€L}

  7. Обращение: LR = {φR|φ€L}L= {abc,bm,aca}

  8. Подстановка: L1aL2 – подстановка в первый язык вместо терминального символа «a» любой цепочки второго языка:

    1. L1 = {cab, al}

    2. L2 = {a, b}

    3. LL21a = {cab, cbb, al, bl}

Задания к контрольной:

  1. Составление автоматных грамматик.

  2. Составление контекстно-свободных грамматик.

  3. Программа-анализатор.

  4. Конечные автоматы.

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

Класс называется замкнутым относительно некоторых операций, если в результате выполнения операций не происходит выхода за рамки класса.

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

Последние две операции рассматривать не будем. Все остальные рассматриваются на графе.

  1. Операция объединения.

a

S1

S

S2

A2

C2

F2

D2

B2

b

A1

C1

D1

B1

F1

F

В операции объединения выполняется индексация нетерминалов обеих грамматик, добавляются вершины SиF. дуги, идущие изS1иS2дублируются и направляются из вершиныS. Аналогично дублируются дуги, идущие вF­1иF2и направляются вF.F­1иF2удаляются вместе с входящими в них дугами.S1иS2можно удалить, если отсутствуют петли и возвраты в эти вершины.

  1. Операция конкатенации: после индексации нетерминалов обеих грамматик выполняется слияние вершин в вершину F1иS2.

    S1

    A1

    C1

    F1

    D1

    B1

    S2

    A2

    C2

    F2

    D2

    B2

S

A1

B1

C1

D1

F

Операция итерации: все дуги, идущие в F, дублируются и направляются вS.

Операция обращения: расщепляем SнаS’ иS’’ (если есть петли), получив вершину, в которую не будет ничего входить – будут только исходящие дуги. Стрелки ставим в обратном направлении.

S’

A1

B1

C1

D1

S

F

S

A1

B1

C1

D1

F

При наличии возвратов и петель для Sвыполняется операция расщепления исходной вершины на две.S’ дублирует дуги, исходящие изS’’. После этогоS’ становитсяF,FстановитсяSи меняется ориентация всех дуг на противоположные.

Операция обращения: берётся столько экземпляров автоматных грамматик, сколько символов, вместо которых происходит подстановка:

S1’’

A1

C1

F1

D1

B1

S0

S2’’

A2

C2

F2

D2

B2

S1

S2

F0

A0

C0

D0

B0

Грамматика, в которую выполняется подстановка, индексируется нулём. Каждый экземпляр, в который подставляется грамматика, индексируется от 1 до i, гдеi– число буквAвL1. Если подставляемая грамматика имеет циклы или возвраты в начальные вершины, для каждого экземпляра выполняется операция расщепления начальной вершины. После этого выполняется слияние вершиныSi’ с вершинами грамматикиG1, из которых исходят дуги, помеченныеA. АналогичноFiи вершины, в которые входят дуги, помеченныеA. После этого дуги, помеченныеAграмматикиG1, исключаются.

Операция пересечения выполняется не на графах, а на грамматике:

G1 = <VN1, VT1, S1, R = {A1  aB1}>

G2 = <VN2, VT2, S2, R = {A2  aB2}>

G1 ⋂ G2 = <VN1 ⋂ VN2, VT1 ⋂ VT2, S1 ⋂ S2, R1 ⋂ R2 = {A1  aB1 ⋂ A2  aB2}>

G1: S1  aB1 и B1  cF1 | αF1

G2: S2  aK2 | cK2 и K2  cF2

G1 ⋂ G2: <S1S2>  a<B1K2> и <B1S2>  c<F1K2> - тупик, можно убрать и <B1K2>  c<F1F2>.

12 октября 2013 г.

Практика №3.

Задание 1: Опишите словами множество состояний автоматов:

\

A

B

C

0

B

B

C

1

A

C

C

0

0

1



\

A

B

C

0

B

C

C

1

C

B

C

0

1

0



\

A

B

C

D

0

B

D

C

D

1

C

B

D

D

0

1

1

0

\

A

B

C

D

0

B

D

C

D

1

A

C

D

D

0

0

1

0




Автоматы детерминированные, так как в каждом состоянии только один символ.

Решение…

Для 1 таблицы:

n0n1 – произвольное число нулей и единиц, которых может не быть.

m=(0, ∞).

n=(0, ∞).

Для 2 таблицы:

01n– произвольное число нулей и единиц, которых может не быть.

n=(0, ∞).

Для 3 таблицы:

01n– произвольное число нулей и единиц, которых может не быть.

10m

m=(0, ∞).

n=(0, ∞).

Для 4 таблицы:

1n010m

m=(0, ∞).

n=(0, ∞).

Рассмотрим недетерминированные автоматы:

\

A

B

C

0

A,B

C

1

B,C

0

0

1



\

A

B

C

0

B

1

C,A

0

0

1



\

A

B

C

D

0

B

C,D

B

1

B

0

0

0

1




Для 1 таблицы:

n1m0k– произвольное число нулей и единиц, которых может не быть.

m=(1, ∞).

n=(1, ∞).

k=(0, ∞).

Для 2 таблицы:

0 n1n– произвольное число нулей и единиц, которых может не быть.

n=(1, ∞).

Для 3 таблицы:

Из нуля можем попасть в B(0), изB– вCиD(00), оттуда – вB(0 или 00).

0(1n(00)m)k0

n=(0, ∞).

m=(0, 1).

k=(1, ∞).

Задание 2: Построить конечный автомат с входным алфавитом (0,1), который допускает следующее множество цепочек:

  1. Все возможные цепочки, включая пустую.

  2. Все цепочки кроме пустой.

  3. Ни одной входной цепочки (автомат будет работать и ничего не распознавать).

  4. Одну входную цепочку: 1,0,1.

  5. Две входные цепочки: 0,1 и 0,1,0,0.

  6. Входные цепочки, начинающиеся с 0 и заканчивающиеся на 1.

  7. Все цепочки, состоящие из нулей и не содержащие единиц.

  8. Все цепочки, содержащие в точности 1,1,1. Нулей может быть сколько угодно.

  9. Все цепочки, в которых перед и после каждой единицы стоит 0.

1.

\

A

0

A

1

A

1

2. Aне допускает обрыв цепочки.

\

A

B

0

B

B

1

B

B

0

1

3. Распознаёт пустую цепочку.

\

A

0

1

0

4.

\

A

B

C

D

0

C

1

B

D

0

0

0

1

5.

\

A

B

C

D

E

0

B

D

E

1

C

0

0

1

0

1

7.

\

A

B

C

0

B

B

1

B,C

0

0

1

8.

\

A

B

C

D

0

A

B

C

D

1

B

C

D

0

0

0

1

9.

\

A

B

C

D

0

A,B

D

A

1

C

1

0

0

1

Задание 3:Построить детерминированный автомат, эквивалентный следующему недетерминированному.

\

1

2

3

a

2,3

1

b

2

1

3

0

0

1

В 1 столбец вставляется новое состояние, включающее все начальные состояния НДА (если на пересечении строк и столбцов имеется несколько состояний и у которого несколько начальных состояний).

\

{1}

{2,3}

{2}

{1,3}

{1,2,3}

a

{2,3}

{1}

{1,2,3}

{1,2,3}

b

{2}

{1,3}

{1}

{2,3}

{1,2,3}

0

1

0

1

1

0 - без обрыва цепочки, 1 - допускает обрыв цепочки.

Если в имени новых состояний хотя бы одно состояние допускало обрыв цепочки, то всё состояние допускает обрыв.

Заменяем:

{1} – 1, {2,3} – 2, {2} – 3, {1,3} – 4, {1,2,3} – 5

Самостоятельно привести недетерминированные в детерминированные.

______________________________

Несколько слов по построению анализатора:

if<условие>then<оператор 1> [ELSE<оператор 2>];

<условие> ::= {<идентификатор>|<константа>} <оператор отношения <,>,= и т.п.> {<идентификатор>|<константа>}

<оператор 1> ::= <идентификатор>:= {<идентификатор>|<константа>} <арифметическая операция> {<идентификатор>|<константа>}

Граф:

0 if0условие0then0оператор 10;0else0оператор 20;(F).

Борьба с пробелами:

0 _1 состояние_1 состояние (пока есть пробелы)условие…

0 идентификатор или константа0оператор отношения0идентификатор или константа⊥

26 октября 2013 г.

Практика №3.

SaA|aB|bB|bD

AaB|aS|bD

BcS|cB|bD|bF’

DdD|dB|bB|bA|aF’|cF’

F’  ⊥F

<S>  a<AB>|b<BD>

<A>  a<BS>|b<D>

<B>  c<BS>|b<DF’>

<D>  d<BD>|b<AB>|a<F’>|c<F’>

<F’>  ⊥<F>

<AB>  a<BS>|b<DF’>|c<BS>

<BD>  c<BSF’>|b<DF’AB>|d<BD>|a<F’>

<BS>  a<AB>|b<BDF’>|c<BS>

<DF’>  a<AB>|b<BDF’>|c<BS>

<DF’>  d<BD>|b<AB>|b<F’>|c<F’>|⊥<F>

<BSF’>  a<AB>|b<BDF’>|c<BS>|⊥<F>

<DF’AB>  a<BSF’>|b<DF’AB>|d<BD>|c<BSF’>|⊥<F>

<BDF’>  c<BSF’>|b<DF’AB>|d<BD>|a<F’>|c<F’>|⊥<F>

<S> = S, <AB> = A, <BD> = B; <BS> = C; <DF> = D; <BSF’> = E; <DF’AB> = G; <BDF’> = H; <F’> = F’; <F> = F.

S  aA|bB

A  aC|bD|cC

B  cE|bG|dB|aF’

C  aA|bH|cC

D  dB|bA|aF’|cF’|⊥F

E  aA|bH|cC|⊥F

G  aE|bG|dB|cE|⊥F

H  cE|bG|dB|aF’|cF’|⊥F

Задача №2: устранить и исключить тупики из следующих правил…

S  aBcD|kLMp

B  cLpDq|pDc|f

D  fDr|f

F  a|b

L  fM

M  Lk|pMLc

K  rF

Шаг 1.

X0 = VT

X1 = {B,D,F}

X2 = {B,D,F,S,K}

X3= {B,D,F,S,K}

L,M– циклический тупик внешнего типа, поскольку изLмы никуда не попадаем кромеLиMи также изM– только вLиM.

Шаг 2:

DfDr|f

Fa|b

KrF

Y0= {S} – множество нетерминаловS.

Y1= {S,B,D} – множество нетерминалов, в которые можно попасть не более чем за 1 шаг изS.

Y2= {S,B,D}

K,F– тупики внутреннего типа.

Задача №3.

SAB|BC|kL

BBS|AL

CQS|dC

MxN|yM|zS|h

A aA|bL|c

L  cB|f

Q  qQ|aC

N  xC|a|bM

Шаг 1.

x0 = {VT}

x1= {M,A,L,N} – вMесть терминалh.

x2 = {M,A,L,N,S,B}

x3 = {M,A,L,N,S,B}

Q,C– циклический тупик внешнего цикла.

Шаг 2.

S  AB|BC|kL

B  BS|AL

A aA|bL|c

y0 = {S}

y1 = {S,A,B,L}

y2= {S,A,B,L}

M,N– циклический тупик внутреннего типа.

Задача №4: устранить аннулирующее правило из следующих грамматик:

S  aCDe|Kp

C  dSa|ε

D  dD|DD|a|fK|ε

K a|b

Шаг 1.

x0 = ε;

x1 = {C,D}

x2 = {C,D}

S x2  ε L

S  aCDe|aDe|aCe|ae|Kp

C  dSa

D  dD|d|DD|D|a|fK

Ka|b

Задача №5: устранить аннулирующее правило из следующих грамматик:

S  aSbS|bSaS|ε

Шаг 1.

x0 = ε

x1 = {S}

S € x1

ε € α

S  S1

S1  aS1BS1|bS1aS1|abS1|aS1b|ab|baS1|bS1a|ba

Задача №6: устранить аннулирующее правило из следующих грамматик:

S  ABC

B  CC|a

A  BB|ε

C  AA|b

Шаг 1.

x0 = ε

x1 = {A}

x2 = {A,C}

x3 = {A,C,B}

x4 = {A,C,B,S}

Шаг 2.

Делается замена и добавляется правило SS1.

S1  ABC|AC|AB|BC|A|B|C

B  CC|a|C

A  BB|B

C  AA|b|A

Задача №7: устранить цепные правила из грамматики.

S  S+T|T

T  T*F|F

F  (S)|a

Шаг 1.

S  S+T|T*F|(S)|a – ответ.

TT*F|(S)|a– подставляем вместоF: (S)|a

F(S)|a

Задача №8: найти приведённую грамматику, эквивалентную следующей…

S  A|B

B  D|E

A  C|D

C  S|a|ε

DS|b

ES|c|ε

Приведённой является грамматика, в которой нет тупиковых, обобщённых и цепных правил.

Шаг 1.

x0=VT

x1= {C,D,E} – там, где есть терминальные символы.

x2 = {C,D,E,B,A}

x3 = {C,D,E,B,A,S}

Нет тупиков внешнего типа. Изо всех правил можно перейти в другое.

Шаг 2.

y0= {S}

y1= {A,B} – куда попадаем изSне более чем за 1 шаг.

y2= {S,A,B,C,D,E}

Нет тупиков внутреннего типа аналогично.

Шаг 3.

x0

x1= {C,E}

x2 = {C,E,A,B}

x3 = {C,E,A,B,S}

x4 = {C,E,A,B,S,D}

S € x4  ε € L.

S  a|b|c| ε.

9 ноября 2013 г.

Практика №4.

Задание №1: устранить левую рекурсию.

S  AB

A  Aa|Ab|d|c

B  qK|rB|Bf|Bg

K  aS|b

S  AB

A  dA’|cA’

A’  aA’|bA’|ε

B  qKB’|rBB’

B’  fB’|gB’|ε

k  aS|b

Свойства языков.

Задание №2: доказать что язык автоматный.

{0n10n},n>= 1;

ψ=αβ¥,p= 3;

αβj¥ €α

ψ= 00100, 00 + 10 + 0

Размножаем: 00 (α) + 1010 (β2) + 0 (¥)

Или: 00 (α) + 11 (β2) + 00 (¥)

Значит не существует ни одного варианта, удовлетворяющего условию теоремы, и язык не автоматный.

Задание №3: {aibicj},i,j>= 1;j<=i; - доказать что цепочка не принадлежит КС-языку. Для КС-языка нужно разбить цепочку уже на 5 частей

Рассмотрим цепочку, у которой i=j:

αβ¥φµ:

ψ = aabbcc,a(α) +ab(β) +b(¥) +c(φ) +c(µ):

Размножаем: a + abab + b + cc + c L

ψ = aabbcc, a (α) + a (β) + b (¥) + b (φ) + cc (µ):

aa + bb + b + cc + c L

Задание №4: выполнить все допустимые операции над следующими автоматными грамматиками:

G1: S  aA|bB|c

A  aS|a

S  B

G2: S  aA

A  bA|bC

C  aA|cS|d

  1. Объединение

  2. Конкатенация

  3. Итерация для 1 грамматики

  4. Обращение для 2 грамматики

  5. Подстановка первой вместо второй

  6. Пересечение

  7. Первые пять выполняем как графы на страницах 21-25.

  8. Шестая операция: ищем общие нетерминалы между каждыми группами:

  9. <S1, S2>  a <A1, A2> - тупик // из S1 или S2 попадаем в A1 A2.

  10. <S1, A2>  b <B1, A2> | b <B1, C2>

  11. <S1, C2>  a <A1, A2> | c <F1, s2>

  12. <A1, S2>  a <S1, A2> | a <F1, C2>

  13. <A1, C2>  a <S1, A2> | a <F1, A2>

  14. <B1,A2>b<F1,A2> |b<F1,C2>

  15. Ответ: G1в объединении сG2дают пустое множество.

  16. Грамматики предшествования Вирта – к следующей

  17. Лекция №5.

  18. Контекстно-свободные языки замкнуты относительно операций объединения, конкатенации, итерации, обращения и подстановки, и не замкнуты относительно операций пересечения, дополнения и разности (автоматные языки замкнуты относительно всех операций).

  19. Имеются языки L1(G1) и L2(G2).

  20. G1 = (VT1, VN1, R1, S1)

  21. G2 = (VT2, VN2, R2, S2)

  1. Объединение: G1 v G2 = (VT1 v VT2, VN1 v VN2 v {S}, R1 v R2 v {S  S1|S2}, S)

  2. Конкатенация: G1 ® G2 = (VT1 v VT2, VN1 v VN2 v {S}, R1 v R2 v {S  S1S2}, S)

  3. Итерация: G1* = (VT1, VN1 v {S}, R1 v {S  S1S|S2}, S)

    1. S  SS1|S1

    2. S  SS|S

  4. Обращение: G1R= (VT1,VN1,R1R,S1), гдеR1R– правила с обращёнными правыми частями правил вывода.

  1. R1 A  α A  abCAm|ba

  2. R1R A  αR A  maCba|ab

  1. G1G2a = ((VT1\{a}) v VT2, VN1 v VN2, (R1 \ {A  αaβ}) v {A  αS2β}, S1)

  1. Если имеются L­1= {ajbjci}L1⋂L2= {aibici}не КС-язык

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

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

  4. 7 декабря 2013 г.

  5. Практика №7.

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

  7. Выполнить разбор правильной и неправильной цепочек:

  8. S  |A.B|

  9. A aA|a

  10. B  (B)|C

  11. C  0|…|0|0C|…|9C

  12. U L R

  13. S | |

  14. A a a

  15. B (, 0|…|9 ), 0|…|9

  16. C 0|…|9 0|…|9

  17. S1/S2 | . a ( ) 0|…|9

  18. | = <

  19. . = < <

  20. A > <

  21. ( < = <

  22. ) > >

  23. 0|…|9 > > <

  • - нетерминал, затем терминал