Языки программирования Лекция 3

advertisement
Языки и грамматики
•
•
•
•
•
•
•
Языки
Грамматики
Грамматики Хомского
Иерархия грамматик Хомского
Окрестные грамматики
Регулярные выражения
Нотация Бэкуса-Наура
Языки
Определение. Конечное множество объектов называется словарём.
Словарь обычно обозначают как 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 – выделенный элемент нетерминального словаря (начальный символ):
SN ;
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 n1aS (bAc ) n  a n1bbAc (bAc ) n  *a n1b n2 .
2. S  *a n S (bAc ) n  a n SbAc (bAc ) n1  a n c(bAc ) n1  *a n cB n1  *a n cb n1 .
Итого L(G1 )  {a n1b n 2 , a n cb n1 | 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}
Синтаксическая диаграмма
Download