- •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. Классы языков.
3.2. Некоторые свойства грамматик.
Эквивалентность грамматик – это, когда различные грамматики порождают один и тот же язык, т. е. грамматики G1 и G2 будут эквивалентными, если L(G1) = L(G2).
Например, G1 = ({0,1}, {A,S}, S, P1) и G2 = ({0,1}, {S}, S, P2)
где P1: S → 0A1
P2: S → 0S1 | 01 ( | – знак или)
0A → 00A1
A → ε
эквивалентны, т. к. обе порождают язык L(G1) = L(G2) = {0n1n | n>0}
Несмотря на эквивалентность определяемых языков, одна грамматика может быть значительно удобнее другой, с точки зрения ее использования в компиляторе.
Определение грамматик не накладывает никаких ограничений на количество нетерминалов в левой части правил:
Грамматика G=({a,b,c},{S,B,C},S,P), где P содержит следующие правила:
P = {S→aSBC, S→abC, CB→BC, bB→bb, bC→bc, cC→cc}
порождает язык {anbncn, n≥1} (n>0)
В грамматике G=({0,1},{А,S},S,P), где P = {S → 0A, 0A → 00A1, S → ε} — левая часть одного из правил содержит пару из терминального и нетерминального символа.
Эквивалентная ей грамматика G1 = ({0,1}, {A,S}, S, P1), где
P1: S → 0A1
0A → 00A1
A → ε
Соглашение – альтернатива правила вывода из цепочки: для записи правил вывода с одинаковыми левыми частями α → β1 α → β2 ... α → βn пользуются сокращенной записью через операцию или: α → β1 | β2 |...| βn; каждое βi (i= 1, 2, ... , n) называется альтернативой правила вывода из цепочки α.
4. Грамматики с ограничениями на правила
Несмотря на большое разнообразие грамматик, при построении трансляторов применяются только некоторые из них, имеющие ограничения, что связано с практической целесообразностью использования определенных типов правил, так как сложность их построения непосредственно влияет на сложность построения трансляторов. По виду правил выделяют несколько классов грамматик.
4.1. Классы грамматик в соответствии с классификацией Хомского.
Праволинейной (выровненной вправо) грамматикой называется грамматика G, если каждое правило из Р имеет вид
A xB или A x
где A, B – нетерминалы, x – цепочка, состоящая из терминалов
Например, грамматика G2 = ({0,1}, {S}, S, P)
где P: S 0S;
S 1S;
S ,
определяет язык {0, 1}.
Контекстно-свободной (бесконтекстной) грамматикой (КС-грамматикой) называется грамматика G, если каждое правило из Р имеет вид:
A
где A N, (T N)*, то есть является цепочкой, состоящей из множества терминалов и нетерминалов и может быть пустой.
Например, грамматика G3 = ({E, T, F}, {a, +, *, (,)}, P, E)
где P: E T
E E + T
T F
T T * F
F (E)
F a.
порождает простейшие арифметические выражения.
Согласно определению, каждая праволинейная грамматика является контекстно- свободной.
Нетерминал А контекстно-свободной грамматики G = (T, N, S, P) для некоторых и , если=ε, называется леворекурсивным, а если=ε, называется праворекурсивным.
Грамматика G называется леворекурсивной (соответственно праворекурсивной), если в G имеется хотя бы один леворекурсивный (соответственно праворекурсивный) нетерминал.
Грамматика, в которой рекурсивны все нетерминалы (возможно, кроме, начального символа) называется рекурсивной.
Контекстно-зависимой (неукорачивающей) грамматикой (КЗ-грамматикой) называется грамматика G, если каждое правило из P имеет вид:
где | || |, то есть вновь порождаемые цепочки не могут быть короче, чем исходные, а также пустыми (другие ограничения отсутствуют).
Например, грамматика G = ({a, b, c}, {B, C, S}, S, P)
где P: S aSBC;
S abc;
CB BC;
bB bb;
bC bc;
cC сc,
порождает язык { a n b n c n }, n ≥ 1 (n >0).
По определению КЗ-грамматика не допускает правил А , где – пустая цепочка, т. е. КС-грамматика с пустыми цепочками в правой части правил не является контекстно-зависимой.
Запрещение в контекстно-зависимой грамматике использования правил вида A→ε сделано для того, чтобы алгоритм, определяющий принадлежность цепочки языку, не зацикливался.
Наличие пустых цепочек ведет к грамматике без ограничений.
Грамматикой свободного (общего) вида (без ограничений) называется грамматика G, если в ней отсутствуют выше упомянутые ограничения.
Если язык L порождается грамматикой типа G, то L называется языком типа G.
Например, L(G) – КС-язык типа G.
Наиболее широкое применение при разработке трансляторов нашли КС-грамматики и порождаемые ими КС-языки.
Эта классификация называется включающей, т. е. все контекстно-свободные грамматики являются контекстно-зависимыми, а все контекстно-зависимые грамматики являются грамматиками общего вида и т. д.
Существуют языки, принадлежащие к типу i, но не к типу i+1: например, язык грамматики Gi является контекстно-зависимым, но не контекстно-свободным, т. е. не существует контекстно-свободной грамматики, порождающий этот язык.