Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования и методы трансляции..pdf
Скачиваний:
28
Добавлен:
05.02.2023
Размер:
3.41 Mб
Скачать

57

3 ТЕОРИЯ ЯЗЫКОВ

3.1 СПОСОБЫ ОПРЕДЕЛЕНИЯ ЯЗЫКОВ

Мы определяем язык L как множество цепочек конечной длины в ал-

фавите Σ [1]. Первый вопрос – как описать язык L в том случае, когда он бес-

конечен. Если L состоит из конечного числа цепочек, то самый очевидный способ – составить список всех цепочек.

Однако для многих языков нельзя установить верхнюю границу длины самой длинной цепочки. Следовательно, приходится рассматривать языки,

содержащие сколь угодно много цепочек. Очевидно, такие языки нельзя определить исчерпывающим перечислением входящих в них цепочек, и

необходимо искать другой способ их описания. И, как прежде, мы хотим,

чтобы описание языков было конечным, хотя описываемый язык может быть бесконечным.

Известно несколько способов описания языков, удовлетворяющих этим требованиям. Один из способов состоит в использовании порождающей си-

стемы, называемой грамматикой. Цепочки языка строятся точно определен-

ным способом с применением правил грамматики. Одно из преимуществ определения языка с помощью грамматики состоит в том, что операции, про-

водимые в ходе синтаксического анализа и перевода, можно сделать проще,

если воспользоваться структурой, которую грамматика приписывает цепоч-

кам (предложениям).

Другой метод описания языка – частичный алгоритм, который для про-

извольной входной цепочки останавливается и отвечает «да» после конечно-

го числа шагов, если эта цепочка принадлежит языку. Мы будем представ-

лять частичный алгоритм, определяющий языки, в виде схематизированного устройства, которое будем называть распознавателем.

58

3.2 ГРАММАТИКИ

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Грамматика – это математическая система, определя-

ющая вид языка. Одновременно она является устройством, ко-

торое придает цепочкам (предложениям) языка полезную структуру.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Грамматики образуют наиболее важный класс генераторов языка [1].

Мы будем пользоваться формализмом грамматик Хомского.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

В грамматике, определяющей язык L, используются два конечных непересекающихся множества символов – множество

нетерминальных символов, которое обычно обозначается бук-

вой N, и множество терминальных символов, обозначаемое Σ.

Из терминальных символов образуются слова (цепочки) опреде-

ляемого языка. Нетерминальные символы служат для порожде-

ния слов языка L определенным способом.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Сердцевину грамматики составляет конечное множество P правил об-

разования (порождающих правил), которое описывает процесс порождения цепочек языка.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Правило – это пара цепочек (α, β), где первой компонентой является любая цепочка, содержащая хотя бы один нетерминал,

а второй компонентой – любая цепочка. То есть α(N Σ)*N(N Σ)*, β(N Σ)*, или, другими словами, правило – это элемент множества декартового произведения

(N Σ)*N(N Σ)*(N Σ)*.

59

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Правило (α, β) будем записывать как α β.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Например, правилом может быть пара (AB, CDE). Если уже установле-

но, что некоторая цепочка α порождается грамматикой, и α содержит AB, т.е.

левую часть этого правила, в качестве своей подцепочки, то можно образо-

вать новую цепочку β, заменив одно вхождение AB в α на CDE.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Язык, определяемый грамматикой, – это множество цепочек, которые строятся только из терминальных символов и выводятся, начиная с одной особой цепочки, состоящей из одного выделенного символа, обычно обозна-

чаемого S.

Грамматикой называется четверка G = (N, Σ, P, S), где:

N – конечное множество нетерминальных символов или нетерминалов (иногда называемых вспомогательными символами,

синтаксическими переменными или понятиями);

Σ – непересекающееся с N конечное множество терминальных сим-

волов (терминалов);

P – конечное подмножество множества (N Σ)*N(N Σ)*(N Σ)*,

элемент (α, β) множества P называется правилом (порождающим правилом или продукцией) и записывается α β;

S – выделенный символ из N, называемый начальным (стартовым,

исходным) символом.

 

60

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

 

Примером грамматики служит четверка G1 = ({A, S}, {0, 1}, P, S), где P

состоит из правил:

S0A1 0A00A1

A e

Нетерминальными символами являются A и S, а терминальными – 0 и

1.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Грамматика определяет язык рекурсивным образом. Рекурсивность проявляется в задании особого рода цепочек, называемых выводимыми це-

почками грамматики 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*Ψ –

61

означает Ψ, выводимую из φ. Далее, если ясно, о какой грамматике идет речь,

то индекс 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 в соответствии с правилом

S0A1. На втором шаге 0A заменяется на 00A1. На третьем шаге A

заменяется на e. Можно сказать, что:

S 3 0011,

S + 0011,

S* 0011

ичто 0011 принадлежит языку L(G1).

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Набор правил вида:

α β1 α β2

……

α βn

называется альтернативными порождающими правилами и обозначается

62

α β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 состоит из правил:

EE+T | T

TT*F | F

F(E) | a

Пример вывода в этой грамматике:

E1 E+T

2 T+T

3 F+T

4 a+T

5 a+T*F

6 a+F*F

7 a+a*F

8 a+a*a,

т.е. язык G0 представляет собой множество арифметических выражений, по-

строенных из символов «a», «+», «*», «(» и «)».

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·