Языки и грамматики • • • • • • • Языки Грамматики Грамматики Хомского Иерархия грамматик Хомского Окрестные грамматики Регулярные выражения Нотация Бэкуса-Наура Языки Определение. Конечное множество объектов называется словарём. Словарь обычно обозначают как V. Определение. Элементы словаря будем называть символами. Символы будем обозначать малыми латинскими буквами (a, b, c,…). Пример. V {a, b, c} . Определение. Цепочкой символов над словарём называется произвольная конечная последовательность символов словаря. Цепочки будем обозначать малыми греческими буквами (α, β, γ,…). Пустую цепочку (цепочку нулевой длины) будем обозначать ε (иногда обозначают λ). Пример. Если V {a, b, c} , то можно обозначить aabc, ccc . Определение. Множество всех возможных цепочек составленных из символов словаря V, включая и пустую цепочку, обозначается как V*. Также обозначим V V * {} . Пример. Если V {a, b} , то V * {, a, b, aa, ab, bb, ba, aaa,...}. Определение. Цепочка из n повторяющихся символов a, обозначается как a n , причём a 0 . Пример. a 4 aaaa . Определение. Операция конкатенации (склеивания цепочек) определяется на множестве цепочек V* как последовательное соединение символов этих цепочек. В общем случае эта операция не коммутативна. Для пустой цепочки: a a a . Определение. Языком L над словарём V называется произвольное множество цепочек над этим словарём, т.е. L V * . Пример. Примеры языков. 1. V1 {a, b}, L1 {aaa , aabb , abba , baab} . Язык состоит только из четырех цепочек. 2. V2 {a, b}, L2 {a n b n | n 0} . Язык состоит из бесконечного числа цепочек, состоящих из двух частей одинаковой длины. 3. V3 {a, b, c}, L3 {a n bc m | n 0, m 0} . 4. V4 {a, b}, L4 { | в цепочке число вхождений a и b равно} . 5. V5 {(, ),,,,, i}, L5 правильные арифметические выражения с операндами i. 6. V6 {слова русского языка}, L6 русский язык. 7. V7 {a,b,c,…,0,1,…,begin,end,for,…}, L7 язык Паскаль. Грамматики Определение. Грамматикой называется любой конечный механизм задания языка. Два способа задания языков: 1. Конечное множество правил порождения за конечное число шагов правильных цепочек, причём эти правила не позволяют построить никакую цепочку, не принадлежащую языку. 2. Задание механизма распознавания, который получив в качестве аргумента любую конечную цепочку над словарём V, за конченое число шагов даёт ответ, принадлежит ли эта цепочка определяемому языку или нет. В соответствии с этим бывает два типа грамматик: порождающие и распознающие. Грамматики (по способу задания языка) • Распознающие грамматики – определение принадлежности входящей цепочки языку; • Порождающие грамматики – генерация цепочек по требованию; • Перечисляющие грамматики – последовательное перечисление цепочек языка. Грамматики Хомского Определение. Порождающей грамматикой Хомского G называется четвёрка объектов: G (T , N , S , R) , где T – конечное непустое множество (терминальный словарь). Элементы множества T называются терминальными символами; N – конечное непустое множество (нетерминальный словарь), причём N T . Элементы множества N называются нетерминальными символами; S – выделенный элемент нетерминального словаря (начальный символ): SN ; R – конечное непустое множество правил (продукций) вида , где α и β – цепочки над словарём N T . Определение. Из цепочки α непосредственно выводима цепочка β (обозначается ), если эти цепочки можно представить в виде (мю, тау, ню), (мю, кси, ню) и существует продукция . ), Определение. Из цепочки α выводима цепочка β (обозначается * если существуют цепочки 0 , 1 ,..., n , n 0 такие, что i 1 i , i 1, n . Пример. G1 ({a, b, c},{S , A, B}, S , R) , где R {S aSbAc, aS bbAc, bAc B, SbA , B b}. Примеры вывода в этой грамматике: S aSbAc ac , S aSbAc bbAcbAc bbAcB bBB bbB bbb . Или аналогично: S *ac , S *bbb . Заметим, грамматика Хомского не предписывает определённый единственный вывод, т.е. не задаёт алгоритм порождения. Здесь отсутствует важнейший элемент алгоритма – его детерменированность – определённая последовательность действий. Определение. Языком, порождаемым грамматикой G, называется множество терминальных цепочек, выводимых из начального символа грамматики: L(G) { T * | S *} . Пример. Попробуем понять, какой язык описывается грамматикой G1 . Вывод начинается с нетерминала S. По первому правилу S можно заменять многократно, получая промежуточные цепочки вида a n S (bAc ) n . Далее для удаления нетерминала S мы используем второе или четвертое правила, получив: 1. S *a n S (bAc ) n a n1aS (bAc ) n a n1bbAc (bAc ) n *a n1b n2 . 2. S *a n S (bAc ) n a n SbAc (bAc ) n1 a n c(bAc ) n1 *a n cB n1 *a n cb n1 . Итого L(G1 ) {a n1b n 2 , a n cb n1 | n 0} . Определение. Две грамматики называются эквивалентными, если они порождают один и тот же язык. Вообще любой язык может быть порождён бесконечным числом грамматик! V4 {a, b}, Пример. Построим грамматику для языка L4 { | в цепочке число вхождений a и b равно} . Можно сделать такую грамматику: S aSb | ; ab ba . Но в такой грамматике нельзя представить цепочки языка в форме дерева вывода. Для этого в левой части продукций должен стоять только один нетерминал. Поэтому альтернативно можно сделать такую контекстно-свободную грамматику: S aB | bA | ; B bS | aBB; A aS | bAA . V5 {a, b, c} , Пример. Построим грамматику для языка L5 {a nb n c n | n 0} . Оказывается, для такого языка не существует контекстно-свободных грамматик, но есть например такая: G5 : S aSBC | abC ; CB BC ; bB bb; cC cc . Идея этой грамматики в том, что нетерминалы B и C можно будет заменять на терминалы только когда они займут требуемое место в выводимой цепочке, а для этого нужен контекст. Иерархия грамматик Хомского Тип 0 Вид правил , 1 A 2 A 3 A aB | a | Название грамматики Свободные (неограниченные) Контекстно-зависимые (грамматики непосредственных составляющих). Совпадает с классом неукорачивающих грамматик Контекстносвободные Автоматные (регулярные) Распознающие устройства Машины Тьюринга Линейно-ограниченные автоматы Автоматы с магазинной памятью Конечные автоматы Теорема об отношениях между грамматиками Теорема. Существует строгое вложение как классов грамматик Хомского: 3 2 1 0 (готические буквы I), так и порождаемых ими языков: L3 L2 L1 L0 . Пример. Доказано, что язык L2 {a n b n | n 0} является КС-языком, но его нельзя породить никакой автоматной грамматикой. Доказано, что язык L5 {a nb n c n | n 0} является контекстно-зависимым, но его нельзя породить никакой контекстно-свободной грамматикой Окрестностные грамматики Определение: Набор окрестностей определенных для каждого символа алфавита языка образуют грамматику. «Окрестность» — конечное число заданных для каждого символа языка цепочек, содержащих данный символ (центр окрестности) внутри. Пример: A = {a+a, a+a+a, a+a+a+a,...} окрестности «a»: #a+, +a+, +a# «+»: a+a Регулярные выражения Определение. Регулярными выражениями над словарём V называются конструкции следующего вида: 1. a, a V (любой символ словаря). 2. ε – пустая строка. 3. (a b) (объединение), где a и b – регулярные выражения. (a b) – объединение языков, определяемых регулярными выражениями a и b. 4. (ab) (конкатенация), где a и b – регулярные выражения. (ab) – определяет язык, состоящий из строк вида xy, где x – строка из языка L(a ) , а y – строка из языка L(b) . 5. a * (замыкание Клини), где a – регулярное выражение. a * – определяет язык, состоящий из строк вида , s1 , s1 s 2 , s1 s 2 s3 ,..., где si – любая строка из языка L(a ) . Т.к. объединение и конкатенация являются ассоциативными операциями, то многочисленные скобки ставить не обязательно. На практике обычно используется два основных синтаксиса задания выражений: устаревший POSIX и современный «перловский» – PerlCompatible Regular Expression (PCRE). Нотация Бэкуса-Наура Нотация Бэкуса – Наура (БНФ-нотация) исторически являлась предшественницей нотацией грамматик Хомского. БНФ-нотация является просто альтернативной (более удобной) формой описания КС-грамматик: 1. Нетерминалы описываются в угловых скобках. 2. Вместо стрелки используется последовательность символов ::= 3. В правой части альтернативы перечисляются через знак | 4. Фигурные скобки описывают альтернативы из 0 или более повторений. 5. Квадратные скобки описывают опцию – необязательный элемент. Бывает БНФ и расширенная БНФ. Расширенная нотация Бэкуса-Наура • Правила: идентификатор = выражение. • Выражения: – Конкатенация A = BC. – Выбор A = B|C|D. – Условное вхождение A = [B]. – Повторение A = {B}. – Группировка A = (B|C)(D|E). • Пример. БНФ. <digit> ::= 0|1|2|3|4|5|6|7|8|9 <integer-constant> ::= [+|–]<digit>{<digit>} <variable-declaration-part> ::= var <variable-declaration> {; <variable-declaration>} <ident> ::= <letter> {<letter> <digit>} • Пример. Расширенная БНФ. digit = ‘0’|‘1’|‘2’|‘3’|‘4’|‘5’|‘6’|‘7’|‘8’|‘9’ integer-constant = [‘+’|‘–’] digit {digit} variable-declaration-part = ‘var’ variable-declaration {; variable-declaration} ident = letter {letter digit} Синтаксическая диаграмма