- •IV. Трансляция выражений
- •2. Метод Дейкстра
- •2.3. Перевод в обратную польскую запись выражений с указателями функций.
- •V. Введение в теорию формальных языков
- •1. Способы определения языков
- •2. Алфавит (словарь)
- •2.1. Цепочка (слово).
- •2.2. Язык.
- •3. Формальная порождающая грамматика
- •3.1. Грамматика, правила, цепочки.
- •3.2. Некоторые свойства грамматик.
- •4. Грамматики с ограничениями на правила
- •4.1. Классы грамматик в соответствии с классификацией Хомского.
- •5. Способы записи синтаксиса языка
- •5.1. Метаязык Хомского.
- •5.2. Метаязык Хомского-Щутценберже.
- •5.3. Бэкуса-Наура формы (бнф).
- •5.4. Расширенные Бэкуса-Наура формы (рбнф).
- •5.5. Диаграммы Вирта.
- •6. Распознаватели для различных классов грамматик
- •6.1. Компоненты распознавателя.
- •6.2. Конфигурация распознавателя.
- •6.3. Классы языков.
2. Алфавит (словарь)
Конечное множество символов, неделимых в данном рассмотрении, называется алфавитом (словарем), а символы, входящие во множество, называются буквами алфавита.
Например, алфавит A = {a, b, c, +, !} содержит 5 букв;
алфавит B = {00, 01, 10, 11} одержит 4 буквы, каждая из которых состоит из двух символов.
2.1. Цепочка (слово).
Конечная последовательность символов (букв) алфавита называется цепочкой (словом) в этом алфавите.
Пустая цепочка – это цепочка, которая не содержит ни одного символа (для обозначения используется символы ε или $).
Длина цепочки (слова) – число символов (букв), входящих в цепочку (слово).
Например, слово a=ab+!c в алфавите A имеет длину l(a) = 5 или | а |=5;
слово b=00110010 в алфавите B имеет длину l(b) = 4;
если α = abcdefg, то длина α равна 7 — l(α)=7 или |α|=7;
длина ε равна 0 — l(ε)=0 или |ε|=0.
Конкатенация (сцепление) цепочек – это цепочка αβ, если α и β – цепочки.
Если α = ab и β = cd, то αβ = abcd
Для любой цепочки α всегда αε = εα = α.
Обращение (реверс) цепочки α – это цепочка αR, символы которой записаны в обратном порядке.
Если α = abcdef, то αR = fedcba
Для пустой цепочки: ε = εR.
Cтепень цепочки α – это конкатенация n цепочек α:
α0 = ε;
αn = ααn-1 = αn-1α
2.2. Язык.
Язык в некотором алфавите – это подмножество цепочек конечной длины в этом алфавите.
Если задан алфавит A, то существует A* – множество всевозможных цепочек, которые могут быть построены из букв алфавита A; предполагается, что пустая цепочка (ε или $) также входит в множество A*.
Пусть V* – множество, содержащее все цепочки в алфавите V, включая пустую цепочку ε, тогда, если V={0,1}, то V* = {ε, 0, 1, 00, 11, 01, 10, 000, 001, 011, ...}
Таким образом, каждый язык в алфавите V является подмножеством множества V*.
3. Формальная порождающая грамматика
3.1. Грамматика, правила, цепочки.
Порождающая грамматика (грамматика Хомского) – один из видов формальной грамматики.
Порождающая грамматика есть упорядоченная четверка
G = (T, N, S, P)
где T – конечное множество терминальных (основных) символов (терминалов) – основной алфавит
N – множество нетерминалов – вспомогательных символов
T и N – не пересекающиеся конечные множества
S – символ из N, называемый начальным
Р – конечное подмножество множества, называемого множеством правил, которое описывает процесс порождения цепочек языка
Элемент pi = (, ) множества Р называется правилом (продукцией)
или->
Это означает, что цепочка порождает цепочку (из цепочки выводится цепочка), , – цепочки, состоящие из терминалов и нетерминалов.
Таким образом, правило P имеет две части: левую, определяемую, и правую, подставляемую.
Обозначения для описания абстрактных языков:
терминалы: буквы a, b, c, d или цифры 0, 1, ..., 9;
нетерминалы: буквы A, B, C, D, S (нетерминал S – это начальный символ грамматики);
отдельные терминалы или нетерминалы: буквы U, V, ..., Z;
цепочки терминалов и нетерминалов:, , ...;
цепочки терминалов: u, v, w, x, y, z;
пустая цепочка (не содержащая ни одного символа) – знак ;
порождает (есть по определению): знак , который отделяет левую часть правила от правой.
Обозначения определяют некоторый язык, предназначенный для описания правил построения цепочек, а значит, для описания других языков. Язык, предназначенный для описания другого языка, называется метаязыком.
Терминальной цепочкой, порождаемой грамматикой G, называется выводимая цепочка грамматики G, не содержащая нетерминалов.
Язык, порождаемый грамматикой, и сентенциальная форма в грамматике
Язык L(G), порождаемый грамматикой G, – это множество терминальных цепочек, порождаемых грамматикой G. Таким образом, L(G) – это все цепочки в алфавите T, которые выводимы из S (начальный символ) с помощью P (правила).
Цепочка α (T U N)*, для которой S α, называется сентенциальной формой в грамматике G = (T, N, S, P).
Таким образом, язык, порождаемый грамматикой, можно определить как множество терминальных сентенциальных форм.
Примеры грамматик
Грамматика, порождающая язык {0n1n | n≥0} имеет вид: G0= ({0,1}, {S}, S, P)
T N S P
где P = {S→0S1, S→ε}.
Грамматика, порождающая язык {ambn | m,n ≥ 0} имеет вид: G1= ({a,b}, {S,A,B}, S, P)
T N S P
где набор правил определяется следующим образом:
P = {S→AB, A→aA, A→ε, B→bB, B→ε}
Понятие выводимости
Отношение G непосредственного вывода на множестве (T N)* – G означает, что непосредственно выводима из для грамматики G = (T, N, P, S), т. е, если – цепочка из множества (T N)* и – правило из Р, то G
Транзитивное замыкание отношения G+ (нетривиальный вывод за один и более шагов) — G+ означает, что выводима из нетривиальным образом (возможно за несколько шагов).
Рефлексивное и транзитивное замыкание отношения G* (вывод за нуль и более шагов) — G* означает, что выводима из .
Пусть k k-я степень отношения , тогда, если k, то существует последовательность 0123 ... k из к+1 цепочек:
=0, 1, ... i -1 i,, 1 ≤ i ≤ k и k =
Выводы для грамматики G1 = ({0, 1}, {A, S}, S, P):
Т N S P
S 0A1 00A11 0011 — S порождает ...
S 1 0A1; S 2 00A11; S 3 0011 – i-тая степень отношения
S + 0A1; S + 00A11; S + 0011 – транзитивное замыкание отношения
S * S; S * 0A1; S * 00A11; S * 0011 – рефлексивное и транзитивное замыкание отношения
где 0011 L(G1) – принадлежит языку L грамматики G1