
- •Лекция 1 Введение
- •1. Предварительные сведения
- •1.1. Множества
- •1.2. Операции и отношения
- •1.2.1. Операции на множествах
- •1.2.2. Отношения на множествах
- •1.3. Множества цепочек
- •1.3.1. Цепочки
- •1.3.2. Операции над цепочками
- •1.4. Языки
- •1.4.1. Определения
- •1.4.2. Операции над языком
- •2. Теория языков программирования
- •2.1. Способы определения языков
- •2.2. Грамматики
- •2.3. Грамматики с ограничениями
- •2.4. Регулярные множества
- •2.4.1. Определения
- •2.4.2. Уравнения с регулярными коэффициентами
Какую работу нужно написать?
1.3.2. Операции над цепочками
Пусть x,y– цепочки.
Цепочка xyназывается сцепленной (конкатенацией). Например, еслиx = abиy = cd, тоxy = abcd. Для любой цепочкиxможно записать, чтоxе = еx = x.
Обращением цепочки x(xR) называется цепочкаx, записанная в обратном порядке:x = a1a2…an, xR = anan–1…a1, eR = e.
Пусть x,y,z– цепочки в некотором алфавитеΣ, тогда:
– x– префикс цепочкиxy;
– y– суффикс цепочкиxy;
– yназывается подцепочкой цепочкиxyz.
Префикс и суффикс цепочки являются ее подцепочками.
Если x≠y,x– префикс (суффикс) цепочкиy, тоx– собственный префикс (суффикс) цепочкиy.
Длина цепочки – это число символов в ней. Если x=a1a2…an, то длина цепочкиn. Длину цепочки обозначают |x|, например |abc|=3, |e|=0.
1.4. Языки
1.4.1. Определения
Языком в алфавите Σназывают множество цепочеквΣ.
Определение.Через Σ* обозначаетсямножество, содержащее все цепочки в алфавите, включаяe.
Пример. ПустьΣ– бинарный алфавит {0,1}, тогдаΣ*= {e, 0, 1, 00, 01, 10, 11, 000, …,}.
Каждый язык в алфавите Σявляется подмножествомΣ*. Множество всех цепочеквΣ, за исключениемe, обозначаютΣ+.
Определение. Если языкLтаков, что полная цепочка вLне является собственным подмножеством (суффиксом) никакой другой цепочки вL, тоLобладает префиксным (суффиксным) свойством.
1.4.2. Операции над языком
Так как языки являются множествами, то все операции над множествами применимы к ним. Операцию конкатенации можно применять к языкам так же, как и к цепочкам.
Определение. ПустьL1– язык вΣ1,L2– язык вΣ2. Тогда языкL1L2называется конкатенацией языковL1иL2– это язык {xy|xL1иyL2}. Итерация языкаLобозначаетсяL*и определяется следующим образом:
1) L0= {e};
2) Ln = LLn–1дляn1;
3)
Позитивная итерация языка LобозначаетсяL+– это язык
2. Теория языков программирования
2.1. Способы определения языков
Мы определяем язык Lкак множество цепочек конечной длины в алфавитеΣ.
Первыйвопрос – как описать языкLв том случае, когда он бесконечен. ЕслиLсостоит из конечного числа цепочек, то самый очевидный способ – составить список всех цепочек.
Однако для многих языков нельзя установить верхнюю границу длины самой длинной цепочки. Следовательно, приходится рассматривать языки, содержащие сколь угодно много цепочек. Очевидно, такие языки нельзя определить исчерпывающим перечислением входящих в них цепочек, и необходимо искать другой способ их описания. И, как прежде, мы хотим, чтобы описание языков было конечным, хотя описываемый язык может быть бесконечным.
Известно несколько способов описания языков, удовлетворяющих этим требованиям. Один из способов состоит в использовании порождающей системы, называемой грамматикой.
Цепочки языка строятся точно определенным способом с применением правил грамматики. Одно из преимуществ определения языка с помощью грамматики состоит в том, что операции, проводимые в ходе синтаксического анализа и перевода, можно сделать проще, если воспользоваться структурой, которую грамматика приписывает цепочкам (предложениям).
Есть и другие способы определения языков, например, регулярные множества и др.
2.2. Грамматики
Грамматики образуют наиболее важный класс генераторов языка. Мы будем пользоваться формализмом грамматик Хомского.
В грамматике, определяющей язык L, используются два конечных непересекающихся множества символов – множество нетерминальных символов, которое обычно обозначается буквойN, и множество терминальных символов, обозначаемоеΣ.
Сердцевину грамматики составляет конечное множество Pправил образования, которое описывает процесс порождения цепочек языка.Правило– это просто пара цепочек или элемент множества, иначе говоря,(NΣ)*N(NΣ)*(NΣ)*. Первой компонентой правила является любая цепочка, содержащая хотя бы одиннетерминал, а второй компонентой – любая цепочка.
Язык, определяемый грамматикой, – это множество цепочек, которые строятся только из терминальных символов и выводятся, начиная с одной особой цепочки, состоящей из одного выделенного символа, обычно обозначаемого S.
Соглашение. Правило (α, β) будем записывать какα→β.
Определение. Грамматикой называется четверкаG = (N, Σ, P, S), где
N– конечноемножество нетерминальных символов илинетерминалов(иногда называемых вспомогательными символами, синтаксическими переменными или понятиями);
Σ–непересекающеесясNконечное множество терминальных символов (терминалов);
P–конечноеподмножество множества(NΣ)*N(NΣ)*(NΣ)*, элемент(α, β)множестваPназывается правилом (или продукцией) и записываетсяα→β;
S–выделенныйсимвол изN, называемый начальным (исходным) символом.
Примером грамматики служит четверка G1= ({A,S}, {0, 1},P,S), гдеPсостоит из правил
S→0A1
0A→00A1
A→e
Нетерминальными символами являются AиS, а терминальными – 1 и 0.
Грамматика определяет язык рекурсивным образом. Рекурсивность проявляется в задании особого рода цепочек, называемых вводимыми цепочками грамматики G = (N, Σ, P, S), где
1) S– вводимая цепочка;
2) если αβγ– выводимая цепочка иβ→δсодержится вP, тоαδγ– тоже выводимая цепочка.
Выводимая цепочка грамматики G, не содержащая нетерминальных символов, называется терминальной цепочкой, порождаемой грамматикойG.
Терминология.
Пусть G = (N, Σ, P, S)– грамматика. Введем отношениеGна множестве(NΣ)*(φ G ΨозначаетΨ, непосредственно выводимаяизφ), которое трактуется следующим образом: еслиαβγ– цепочка из(NΣ)*иβ→δ– правило изP, тоαβγ G αδγ.
Транзитивное замыкание отношения Gобозначается черезG+и трактуется какΨ,выводимая изφнетривиальным образом.
Рефлексивное и транзитивное замыкание отношения G(G*):φG*Ψ – означает Ψ, выводимую из φ.
Далее, если ясно, о какой грамматике идет речь, то индекс Gбудет опускаться.
Таким образом, L(G) = {w | wΣ*, S*w}. Черезkбудем обозначатьk-юстепень данного отношения. Иначе говоря,α k δ, если существуетα0, α1, …, αk, состоящая изk+1 цепочки, для которыхα = α0, …, αi–1, αiпри1 i kиαk = β. Эта последовательность цепочек называется выводом длиныkцепочкиβиз цепочкиαв грамматикеG.
Отметим, что α * δтогда и только тогда, когдаα i δдля некоторогоi ≥ 0, иα + δтогда и только тогда, когдаα i δдля некоторогоi ≥ 1.
Пример. Рассмотрим грамматикуG1из ранее приведенного примера:
S 0A1 00A11 0011.
На первом шаге Sзаменяется на0A1 в соответствии с правиломS→0A1.
На втором шаге 0Aзаменяется на00A1.
На третьем шаге Aзаменяется наe.
Можно сказать, что
S30011,
S+0011,
S*0011,
и что 0011 принадлежит языку L(G1).
Соглашение:
α→β1
α→β2
……
α→βn
обозначим α → β1 | β2 | … | βn.
Кроме того, примем еще следующие соглашения относительно символов и цепочек, связанных с грамматикой:
(1) a,b,c,dи цифры 0, 1, 2, …, 9 обозначают терминальные символы;
(2) A,B,C,D,Sобозначаютнетерминалы,S– начальный символ;
(3) U,V, …,Zобозначают либонетерминалы, либо терминалы;
(4) α,β, …,ωобозначают цепочки, которые могут содержать как терминалы, так инетерминалы;
(5) u,v, …,zобозначают цепочки, состоящие только из терминалов.
Пример. ПустьG0 = ({E, T, F}, {a, +, *, (, )}, P, E), гдеPсостоит из правил:
E → E+T | T
T → T*F | F
F → (E) | a
Пример вывода в этой грамматике:
E E+T
T+T
F+T
a+T
a+T*F
a+F*F
a+a*F
a+a*a,
т.е. язык G0представляет собой множество арифметических выражений, построенных из символовa, +, *, ( и ).